My Profile Photo

安心院日記


猫になりたい。趣味で運用しているブログです。技術的な備忘録・やったことメモとポエム置き場。


CircleCI & GitHub で自動デプロイをする

このブログのコンテンツはGitHubで管理している。だが、自動デプロイまではしていなかったので今まではブログ公開までに以下のプロセスを踏んでいた。

  1. 手元(とか)で内容を書く
  2. git add .; git commit; git push
  3. コンテンツを置いているサーバにssh
  4. cd path/to/contents; git pull
  5. jekyll build

これで静的ファイルが生成される。生成先のディレクトリはnginxから参照できるようにしているので、これだけで良い。

ただこれではブログを書くたびにサーバにログインする必要があるので結構面倒くさい。 調べたところ、GitHubのWebhookをいい感じに処理してくれるghooks-cmd-runnerというものがあった。 しかしこれはこれでWebhookを待ち受けるhttpサーバを建ててnginxでプロキシする、という無駄っぽい工程が必要になる。

そんなわけで、ナウイCIツールでデプロイすればええやん。ということでCircleCIを使うことにした。

この投稿時点で既に自動デプロイが行われている。

CircleCIを使うと嬉しいこと

  • GitHubと簡単に連携できる
  • 自前のサーバに対してのデプロイも簡単
  • CircleCIからsshしてデプロイを行うので変なプロセスを立てる必要がない
  • 新しいの使うと嬉しいね

設定

おおまかにはこのブログがわかりやすかった。英語読むのしんどいからね

というわけでキーポイントだけ備忘録的にメモしていく。まずは要件

  1. デプロイのみを行い、ビルドやテストは行わない
    • ビルド、テストを行うのも似た要領。今回はMarkdownのブログコンテンツなのでテストは不要
  2. デプロイはsshを使用する
    • sshデプロイについての公式ドキュメントはここ
  3. CircleCIを使用するユーザは専用の circleci ユーザを作成する
    • 別にユーザを分けなくても問題ないかもしれないが、普段遣いのユーザと自動化用のユーザは分離させておきたい

以上を満たす設定をしていく。

  1. サーバ上に任意のCircleCI用ユーザを作成
    • sudo useradd circleci -m -p
  2. circleci ユーザのGitHub向けRSA鍵を生成&登録
    • 割愛
  3. CircleCIにRegisterし、対象のリポジトリのプロジェクトを作成する
    • GitHub連携でRegisterすればおk
  4. CircleCIから circleci ユーザにsshするRSA鍵を生成、登録
    • 秘密鍵の登録は Project Settings > PERMISSIONS > SSH Permissions > Add SSH Key で行う
    • ここで表示されるFingerprintはあとで config.yml に書く
    • 公開鍵を authorized_keys に追記するのを忘れずに

    add_ssh_key

  5. 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
    
  6. commit, push
    • やったぜ!

    job_success

設定

詰まりポイント

  • 画像のように、jobが失敗した際になぜか config.yml が上書きされてしまう config_error
    • この場合は config.yml の書き方が良くなくてエラーが出ているらしい。下の方をよく見ると Config Processing Error とあったが、少し気づきにくかった。