Circle CI 2.0を使ってGemfileを新鮮に保つ

この記事はRECRUIT MARKETING PARTNERS Advent Calendar 2017の投稿記事です。

新規開発グループでRailsを書いているmactkgです。今社内で新しいプロジェクトに取り組んでいるのですが、せっかくならGemfileは新鮮に保っていきたいと思いました。少し調べてみると、先人達がまとめてくれた記事を発見。

記事のように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_updateというjobがbundle updateをしてプルリクエストを送っている部分です。(12~22行目)
  • そのjobを呼び出すWorkflowを、scheduleトリガで定期的に実行します。(28~37行目)

参考までにCircleCIのドキュメントを幾つか挙げておきます。

これでおしまいです! config.ymlの修正はPull Requestを作って作業すると思うのですが、circleci-bundle-update-prはデフォルトではmasterブランチのみでbundle updateを行うので気をつけてください(私はハマりました)。

もし他のブランチでもbundle updateさせたい場合は、circleci-bundle-update-prの第三引数以降にブランチ名を書いておくと良いようです。

使ってみた様子

毎週月曜日の午前中にPull Requestが来ている様子です。テストが正しく通っているかの確認と、リリースノートを読んで特に破壊的な変更が無さそうかの確認を行い、大丈夫そうであればマージしています。

先月Bundlerの依存解決周りで変更があり、とあるGemがダウングレードされてしまうという問題がありましたが、Gemのバージョンを指定することで解決しています。今のところ特に大きな問題は起こっていません。

みなさんのたのしいRails開発の参考になれば幸いです。