このブログのコンテンツはGitHubで管理している。だが、自動デプロイまではしていなかったので今まではブログ公開までに以下のプロセスを踏んでいた。
- 手元(とか)で内容を書く
git add .; git commit; git push
- コンテンツを置いているサーバにssh
cd path/to/contents; git pull
jekyll build
これで静的ファイルが生成される。生成先のディレクトリはnginxから参照できるようにしているので、これだけで良い。
ただこれではブログを書くたびにサーバにログインする必要があるので結構面倒くさい。
調べたところ、GitHubのWebhookをいい感じに処理してくれるghooks-cmd-runnerというものがあった。
しかしこれはこれでWebhookを待ち受けるhttpサーバを建ててnginxでプロキシする、という無駄っぽい工程が必要になる。
そんなわけで、ナウイCIツールでデプロイすればええやん。ということでCircleCIを使うことにした。
この投稿時点で既に自動デプロイが行われている。
CircleCIを使うと嬉しいこと
- GitHubと簡単に連携できる
- 自前のサーバに対してのデプロイも簡単
- CircleCIからsshしてデプロイを行うので変なプロセスを立てる必要がない
- 新しいの使うと嬉しいね
設定
おおまかにはこのブログがわかりやすかった。英語読むのしんどいからね
というわけでキーポイントだけ備忘録的にメモしていく。まずは要件
- デプロイのみを行い、ビルドやテストは行わない
- ビルド、テストを行うのも似た要領。今回はMarkdownのブログコンテンツなのでテストは不要
- デプロイはsshを使用する
- sshデプロイについての公式ドキュメントはここ
- CircleCIを使用するユーザは専用の
circleci
ユーザを作成する- 別にユーザを分けなくても問題ないかもしれないが、普段遣いのユーザと自動化用のユーザは分離させておきたい
以上を満たす設定をしていく。
- サーバ上に任意のCircleCI用ユーザを作成
sudo useradd circleci -m -p
circleci
ユーザのGitHub向けRSA鍵を生成&登録- 割愛
- CircleCIにRegisterし、対象のリポジトリのプロジェクトを作成する
- GitHub連携でRegisterすればおk
- CircleCIから
circleci
ユーザにsshするRSA鍵を生成、登録- 秘密鍵の登録は
Project Settings > PERMISSIONS > SSH Permissions > Add SSH Key
で行う - ここで表示されるFingerprintはあとで
config.yml
に書く - 公開鍵を
authorized_keys
に追記するのを忘れずに
- 秘密鍵の登録は
- git projectに
.circleci/config.yml
を作成fingerprints
には先程CircleCIに登録した秘密鍵のFingerprintを記入command
にはデプロイを行う任意のコマンドを記入
version: 2 jobs: deploy: machine: enabled: true steps: - add_ssh_keys: fingerprints: - "6a:d4:e3:ff:9c:7a:28:30:8f:34:38:5b:3a:dc:08:6e" - run: name: Deploy Over SSH command: | ssh $SSH_USER@$SSH_HOST -p 10022 "cd ~/jekyll-uno/_posts; git pull origin master:master; cd ~/jekyll-uno; bundle exec jekyll b" workflows: version: 2 build-and-deploy: jobs: - deploy: filters: branches: only: master
- commit, push
- やったぜ!
設定
詰まりポイント
- 画像のように、jobが失敗した際になぜか
config.yml
が上書きされてしまう- この場合は
config.yml
の書き方が良くなくてエラーが出ているらしい。下の方をよく見るとConfig Processing Error
とあったが、少し気づきにくかった。
- この場合は