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」を開いて、パイプラインを有効化します。
有効化すると、「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です。