CircleCIでHugoを実行してGitHub Pagesにデプロイ

Automate Your Blog Deployment with CircleCI on GHPages

これまではHugoで生成したHTMLをWerckerでGitHub Pagesにデプロイしていたんだけど、定期的にWerckerのアップデートかなんかで動かなくなる・修正するを何回かやった結果、疲弊して、めんどくさくなった。

最近ではすっかりブログ書かなくなったのもあって、手元でHugoを動かしてdocsフォルダにHTMLを直接コミットするという体たらくである。先の記事で購入したWEB+DB PRESSの特集の一つがCircleCIだったので、ちゃんとCIでデプロイしてみようとした話。

まぁ、そうゆうわけで、Hugo + CircleCI + GitHub Pagesの構成で動かしたかったわけだけど、うまいことコレ!ってのがなかったので、以下の記事を参考にかけ合わせた感じ。

以下はメモ

CircleCI 2.0

まずは、CircleCI側、config.ymlの設定。

version: 2
jobs:
  build:
    branches:
      only:
        - master

まぁ、ブログなので、masterオンリーのブランチで実行。

 docker:
      - image: cibuilds/hugo:latest

dockerイメージとして、cibuilds/hugo:latestという、ドンピシャなイメージがあった。Hugoはgolang製なので、記事をググってると、まずみんなgolangのイメージを選んでHugoをインストールしてしてたけど、このイメージはそのステップが必要はないので便利。

    working_directory: ~/hugo
    steps:
      - run:
          name: Update enviroment
          command: apk update && apk add git

cibuilds/hugoイメージはAlpine Linuxベースとのことで、apkでパッケージを最新にしといて、gitも追加。

      - run:
          name: Hugo version
          command: echo "$(hugo version)"
      - checkout
      - run:
          name: Building blog pages
          command: |
            HUGO_ENV=production hugo -v
            cp public/index.xml public/feed.xml

あとは、GitHubからコードをチェックアウトして、Hugoで生成している。RSS用にfeed.xml にコピーしとく。

      - add_ssh_keys:
          fingerprints:
            - "SO:ME:FIN:G:ER:PR:IN:T"

デフォルトで作成されるdeploy keyはチェックアウトする(read)だけの権限なので、ghpageブランチにコミット(write)できる権限を作成しとく。

Add user key ボタンを押すとユーザーレベルのSSH keyが登録されるので、GitHubの設定ページで、そのFingerprintをコピーして上記に追加。

      - deploy:
          name: Deploy to GitHub Pages
          command: ./.circleci/deploy.sh

あとはデプロイ用のシェルスクリプトを実行している。

GitHub Pages

シェルスクリプトの書き方覚えても数秒で忘れてしまう難病なので、ほぼRealOrangeOne氏のコードを拝借している。何してるか、わかんなかったので自分用にコメントしとく。

#!/usr/bin/env bash

# エラー時、実行を止める
set -e

DEPLOY_DIR=deploy

# gitの諸々の設定
git config --global push.default simple
git config --global user.email $(git --no-pager show -s --format='%ae' HEAD)
git config --global user.name $CIRCLE_USERNAME

# gh-pagesブランチをdeployディレクトリにクローン
git clone -q --branch=gh-pages $CIRCLE_REPOSITORY_URL $DEPLOY_DIR

# rsyncでhugoで生成したHTMLをコピー
cd $DEPLOY_DIR
rsync -arv --delete ../public/* .

git add -f .
git commit -m "Deploy #$CIRCLE_BUILD_NUM from CircleCI [ci skip]" || true
git push -f

push.default simple って何の設定なんだろうと思ったけど、これのおかげで、git push origin gh-pagesとかしなくていいのか。なるほど simple!

これでしばらくは、デプロイが安定するだろう…( ˘ω˘)