Hugo を Wercker で自動デプロイ

ローカルマシンから Bitbucket のリポジトリにプッシュした時に Hugo を自動ビルドして VPS へ自動デプロイする.リポジトリの監視とビルドを Wercker で行う.

最終的な wercker.yml

Hugo を VPS へ自動デプロイ(rsync) するための最終的な wercker.yml は次.自動デプロイの概要とハマった所を紹介する

box: debian
build:
  steps:
    - script:
        name: install git
        code: |
          apt-get update
          apt-get install -y git
    - script:
        name: initialize git submodules
        code: |
          git submodule update --init --recursive
    # Install hugo binary and run hugo
    - arjen/hugo-build:
        version: 0.14
    - script:
        name: gzip html/xml/css/js
        code: |
          apt-get update
          apt-get install -y gzip
          find . -type f -name '*.html' -exec gzip --keep --best "{}" \;
          find . -type f -name '*.xml' -exec gzip --keep --best "{}" \;
          find . -type f -name '*.css' -exec gzip --keep --best "{}" \;
          find . -type f -name '*.js' -exec gzip --keep --best "{}" \;

deploy:
  steps:
    - script:
        name: install ssh and rsync
        code: |
          apt-get update
          apt-get install -y ssh
          apt-get install -y rsync

    - add-to-known_hosts:
        hostname: ghent.mano.xyz
      
    - mktemp:
        envvar: PRIVATEKEY_PATH
        
    - create-file:
        name: write key
        filename: $PRIVATEKEY_PATH
        content: $VPS_KEY_PRIVATE
        overwrite: true
        hide-from-log: true
    
    - script:
        name: rsync Hugo generated files
        code: |
          rsync -avzr --delete -e "ssh -i $PRIVATEKEY_PATH -o StrictHostKeyChecking=no -o UserKnownHostsFile=no" ${WERCKER_SOURCE_DIR}/public/ wercker@ghent.mano.xyz:~/public/

自動デプロイの概要

通常(Wercker なしの場合)ブログに投稿する際は次のような流れとなる.

  1. ローカルにある Hugo ディレクトリ(リポジトリ)に変更を加える
  2. ローカルでビルドして,変更点を確認後,Bitbucket にプッシュする
  3. ローカルでデプロイ用にビルドする
  4. ローカルで html/css/js などを高速化のため gzip で圧縮する
  5. 必要なファイルだけリモートのVPSへコピーする

Wercker を利用する場合,次のような操作に短縮される.

  1. ローカルにある Hugo ディレクトリ(リポジトリ)に変更を加える
  2. ローカルでビルドして,変更点を確認後,Bitbucket にプッシュする

ステップ 3, 4, 5 が Wercker 上で自動で実行される.ステップ 3, 4 が wercker.ymlbuild にステップ 5 が deploy にそれぞれ対応している.

Hugo のサイト生成は arjen/hugo-build を利用する.具体的な処理内容は https://github.com/ArjenSchwarz/wercker-step-hugo-build で確認できる.

Git のサブモジュール

リポジトリの中に git のサブモジュールがあるので git submodule update しなくてはビルドが成功しない.そして素の debian には git がインストールされていないので, まず apt-getgit をインストールする.

- script:
    name: install git
    code: |
      apt-get update
      apt-get install -y git
- script:
    name: initialize git submodules
    code: |
      git submodule update --init --recursive

rsync によるデプロイ

rsyncssh でビルドしたファイルをリモートのVPSにコピーするが,素の debian には sshrsync が含まれていなようなので追加する.リモートのVPSでも rsync が必要なのでインストールしておくこと.また,リモートのVPS側でデプロイ専用ユーザ wercker を作成しておく.

- script:
    name: install ssh and rsync
    code: |
      apt-get update
      apt-get install -y ssh
      apt-get install -y rsync

Wercker での ssh の使い方は下記が詳しい.

参考リンク