CircleCIでHugoのビルドを自動化した話
Page content
Hugoのビルドとブログの更新を自動で行うようにした。
ビルドフローが手間
現状、手動でビルドしてブログを更新しようとすると以下のような感じ。
- markdownで記事を書く
hugo
でビルド- Hugoのレポジトリをcommit、pushする
- public(GitHub Pages用のレポジトリ)をcommit、pushする
大した手間ではないが、この手間が原因でブログが終わる予感がする。
2と4は自動化して1と3だけにしたい。
とりあえずシェル
set -ex
hugo
cd public
git add .
msg="rebuilding site `date +'%Y-%m-%d %H:%M:%S'`"
git commit -m "$msg"
git push origin master
これで2と4がひと手間になった。
CIで自動化
ひと手間になったが、できればひと手間すらかけたくないので、CIで自動化。
GitHubとの連携が簡単なCircleCIを使いました。
CircleCIに登録
- https://circleci.com
- GitHubアカウント、Bitbucketアカウントで登録できる
- CIを回したいレポジトリをフォローしておく 今回はHugoのレポジトリ
CircleCI用のSSH Keyを作成
ビルドした静的ファイルをGitHub Pagesのレポジトリにpushしたいので必要
$ ssh-keygen -t rsa -b 4096 -m pem -C "CircleCI" -f id_rsa_circleci -N ""
公開鍵をGitHubに登録する
秘密鍵をCirCleCIに登録しておく
プロジェクト(レポジトリ)横の設定歯車から、
SSH Permissions
を選択し、Add SSH Key
する同時に、
Checkout SSH Permissions
から、自動登録されたRead OnlyのKeyをRemove
する。こちらが優先で使われてしまうため
.circleci/config.ymlを書く
version: 2 jobs: build: docker: - image: circleci/golang:1.11 working_directory: ~/work steps: - add_ssh_keys: fingerprints: - "YO:UR:FI:NG:ER:PR:IN:T" - run: name: install hugo command: | mkdir ~/src; cd $_ git clone https://github.com/gohugoio/hugo.git cd hugo go install - checkout - run: name: build command: | rm -rf public git clone git@github.com:[github_user]/[github_user].github.io public hugo - run: name: push command: | cd public git config --global user.name "CircleCI" git config --global user.email "circleci@example.com" git add --all msg="rebuilding site `date`" git commit -m "$msg" git push origin master
適当な別ディレクトリ使ってhugoをインストールしてからビルドしてcommit, pushする。
本当はさっきのdeploy.sh
を使ってサラッと書きたかったけど、CIからsubmoduleをpushするところが手元と同じようには動かず、結局publicを消してからcloneしてきてビルドしてpush、という微妙な感じに。
何はともあれ、これでHugoのレポジトリをpushすればCIが走って、勝手にブログも更新してくれるようになりました。
この作業が無駄にならないことを祈る。