Hugoの記事をGit(bitbucket)へのPUSHで本番に反映させる

現状と課題

webarenaにvpsを立てhugoでブログを運用しています。記事を書くたびに以下の手順でサーバのファイル更新をしています。

  • 記事を書いたらhugoコマンドを実行してpublicを更新
  • buibucketにpush
  • サーバにsshでログインして、ソースをpull
  • WEBサーバ(nginx)に配置

でも、毎回、この手順を実施することが苦痛になってきました。hugoコマンドを実行してpushする手順は省略できませんが、push後のデプロイを自動化したいと考えました。

解決方針

bitbucketのpipelineを利用して自動デプロイに挑戦したいと思います。gitにpsuhしたら本番へ記事が反映できるようにします。

自動デプロイを実現するまでの流れは、下記の通りです。

  • pipelineの有効化
  • bitbucket-pipelines.yml の作成
  • ssh秘密鍵/公開鍵の作成・設定
  • デプロイ用deploy.shの作成

bitbuckt上での設定

bitbucketにログインして、自動デプロイをしたいリポジトリを開きます。左のメニューにある「pipeline」の「setting」を開いて、パイプラインを有効化します。

pipelineの有効化

有効化すると、「configure bitbucket-pipelines.yml」のボタンが活性化するので、ボタンをクリックします。クリックすると、bitbucket-pipelines.yml の編集画面へ遷移します。

今回はwebarenaのVPSサーバにssh接続し、shellscriptを実行します。そのため検索エリアに「ssh」と入力し、ssh接続の雛形を探します。

雛形として「SSH run」が見つかりました。この bitbucket-pipelines.yml をベースにして設定を作成します。

bitbucket-pipelines.yml 定義

bitbucket-pipelines.ymlでは、sshのログイン時に設定している値を設定します。またMODEを’script’、COMMANDを’deploy.sh’にすることで、push後に「delploy.sh」を実行します。deploy.shは後で作成します。

bitbucket-pipelines.yml は下記内容を、画面のテキストエリアに張り付け、「commit file」を押すとリポジトリに追加されます。

bitbucket-pipelines.yml の設定

下記の通りです。

image: atlassian/default-image:2

pipelines:
  default:
    - step:
        script:
          - echo "start"
          - pipe: atlassian/ssh-run:0.2.2
            variables:
                SSH_USER: 'ログインユーザ'
                SERVER: 'サーバのIPアドレス'
                PORT: 'ポート番号'
                SSH_KEY: $MY_SSH_KEY
                MODE: 'script'
                COMMAND: 'deploy.sh' # path to a script in your repository
          - echo "done"

ssh公開鍵/秘密鍵の設定

bitbucket上で、sshの公開鍵/秘密鍵を作成して、webarenaのvpsに登録します。ログインユーザのホームフォルダに「.ssh」フォルダがあると思います。その中の「 authorized_keys 」に、新たに作成するssh公開鍵を追加します。

ssh公開鍵/秘密鍵の 作成

まずは公開鍵と秘密鍵のペアを作成します。メニューの「設定 > SSH keys」の画面で作成ができます。

作成した公開鍵をコピーしておきます。

ssh公開鍵/秘密鍵の設定

webarenaのVPSサーバにログインします。ログインユーザのホームフォルダは以下にある「.ssh」フォルダに移動し、authorized_keysに作成した公開鍵を追加します。

deploy.shの作成

デプロイ後に実行される処理をdeploy.shに記載します。今回は以下の処理を実行します。

  • 配置済みの静的ファイルの削除
  • 新しい静的ファイルの配置
#!/bin/bash

docker exec 'コンテナ名' rm -r /static/***
docker cp /home/******/git/リポジトリ名/ 'コンテナ名':/static/***/

ファイルの格納先は、bitbucket-pipelines.ymlと同階層にします。(※ bitbucket-pipelines.yml で設定したdeploy.shのパスに合わせてください。)

自動デプロイの実行

先ほど作成したdeploy.shをリポジトリにpushするとデプロイが実行されます。成功すると緑で表示されます。

git pullでパスワードを確認される対応

もしgit pullで以下のエラーが発生している場合は、パスワードの確認によりdeploy.shが異常終了することを回避する対策が必要となります。

Enter passphrase for key '/home/********/.ssh/bitbucket/id_rsa':
git@bitbucket.org: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

そのため、git pullの実行後にexpectによるパスワード入力を行うように修正を加えます。

もし、サーバにexpectコマンドがインストールされていない場合は、あらかじめインストールをします。

sudp apt-get install expect

git pullの実行時に入力を求められるパスワードを、deploy.shに直接記載するのはセキュリティ的に好ましくないため、.profileに記載し、実行時に環境変数から取得するようにします。

#!/bin/bash

cd /home/********/git/hugo-******/
source ~/.profile
PW=$SSH_PASS

expect -c "
set timeout 5
spawn git pull
expect \"id_rsa':\"
send \"${PW}\n\"
expect \"$\"
exit 0
"

docker exec dc_proxy rm -r /static/***

docker cp /home/********/git/hugo-******/ dc_proxy:/static/***/

再度、git pullしてソースのダウンロードが始まればOKです。

About: ken


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください