Circle CI 2.0を使ってGemfileを新鮮に保つ
原 健太
この記事はRECRUIT MARKETING PARTNERS Advent Calendar 2017の投稿記事です。
新規開発グループでRailsを書いているmactkgです。今社内で新しいプロジェクトに取り組んでいるのですが、せっかくならGemfileは新鮮に保っていきたいと思いました。少し調べてみると、先人達がまとめてくれた記事を発見。
- 【保存版】自前で継続的 bundle update を導入する方法 / マスタカの ChangeLog メモ
- Circle CIでbundle updateのPull Request作成を自動化する手順 - pblog
記事のようにHeroku Schedulerと組み合わせる実装でしばらくやっていたのですが、CircleCIにScheduling Jobsの機能がリリースされたので、CircleCIのみで実装できるようになりました。CircleCI 2.0で行う方法がブログにまとまっていなかったのでご紹介します。
方針
実装の前に、簡単に方針の説明です。まずCircleCI内のコンテナで bundle update してGemfile.lock
を更新したのち、Pull Requestを作成するjobを設定しておきます。この実装には masutaka/circleci-bundle-update-pr
を使えば簡単です。
そのjobをScheduled Workflow Runsを使って定期的に実行します。これだけです!
GitHubでの準備
Personal access tokensからAccess Tokenを用意しておきます。Deployに使いたいアカウントでログインして、Access Tokenを用意します。
今のところBot用にアカウントをひとつ用意するのは規約違反では無さそうなので、Bot用のアカウントを準備して、キャラに見立てるのも粋かもしれません(2017/12/19現在)。
CircleCIでの準備
GitHubのTokenがゲット出来たら、CircleCIに環境変数を3つ追加しておきます。Projectの設定の「Environment Variables」から設定できます。
環境変数名 | 詳細 |
---|---|
BUNDLE_UPDATE_GITHUB_EMAIL |
bundle update した結果をCommitするユーザーのメールアドレス |
BUNDLE_UPDATE_GITHUB_USERNAME |
bundle update した結果をCommitするユーザーのユーザー名 |
GITHUB_ACCESS_TOKEN |
先ほどGitHubでゲットしたトークン |
設定後のスクリーンショットを示します。モザイクだらけですみません。
.circleci/config.yml を設定する
次に、Workflowを使って定期実行するようなconfig.yml
を作ります。
- 通常行っているtestやbuild(4~10行目)は、通常buildのjobとして定義します。(25~27行目)
- ここでbundle installなど行うと思いますが、Cacheをうまく使ってあげると高速化できます。
- Cacheについては15日目の記事「iOS アプリの CI 環境を CircleCI 2.0 に移行したら結構便利」で詳しく書かれています。
- 別で定義している
bundle_update
というjobがbundle updateをしてプルリクエストを送っている部分です。(12~22行目) - そのjobを呼び出すWorkflowを、
schedule
トリガで定期的に実行します。(28~37行目)
参考までにCircleCIのドキュメントを幾つか挙げておきます。
- Workflowについて: https://circleci.com/docs/2.0/workflows/
- Scheduling Jobsについて: https://circleci.com/blog/manual-job-approval-and-scheduled-workflow-runs/
これでおしまいです! config.ymlの修正はPull Requestを作って作業すると思うのですが、circleci-bundle-update-pr
はデフォルトではmaster
ブランチのみでbundle updateを行うので気をつけてください(私はハマりました)。
もし他のブランチでもbundle updateさせたい場合は、circleci-bundle-update-pr
の第三引数以降にブランチ名を書いておくと良いようです。
使ってみた様子
毎週月曜日の午前中にPull Requestが来ている様子です。テストが正しく通っているかの確認と、リリースノートを読んで特に破壊的な変更が無さそうかの確認を行い、大丈夫そうであればマージしています。
先月Bundlerの依存解決周りで変更があり、とあるGemがダウングレードされてしまうという問題がありましたが、Gemのバージョンを指定することで解決しています。今のところ特に大きな問題は起こっていません。
みなさんのたのしいRails開発の参考になれば幸いです。