俺得な保存版記事です。設定するたびにやり方を思い出すのが面倒になり。

1. CircleCI の設定

GitHub の Personal access tokens のページで token を作成し、CircleCI の Project Setting -> Environment variables に GITHUB_ACCESS_TOKEN という名前で追加します。

CircleCI の URL は以下になります。

https://circleci.com/gh/{ユーザ名}/{リポジトリ名}/edit#env-vars

2. circle.yml の変更

このように circle.yml の deployment section を変更します。

https://github.com/masutaka/masutaka-29hours/commit/0ba9ef03348568baaa5cf271d4f6e41305f8fdfe

環境変数 BUNDLE_UPDATE が指定されていたら、circleci-bundle-update-pr gem をインストールして、同コマンドを実行しています。この環境変数は後述するトリガーが設定してきます。

circleci-bundle-update-pr コマンドでは以下が実行されます。

  1. bundle update を実行する
  2. Gemfile.lock に差分があれば、git commit し、GitHub のリモートブランチに git push する
  3. GitHub の Pull Request を作成する
  4. アップデートした Gem の差分へのリンクをコメントとして POST する

bundler もアップデートしているのは、1.10.0 から Gemfile.lock に追記される BUNDLED WITH 対策のためです。

Ruby - BUNDLED WITH で Gemfile.lock が更新されてしまう件 - Qiita

bundler のアップデートに気づけるので、ローカルの bundler をアップデートしようかという気持ちになります。

3. トリガーの作成

最後に Heroku にトリガーアプリをデプロイします。やり方は簡単。

https://github.com/masutaka/ci-build-trigger の Heroku ボタンをクリックするだけ。説明の通りに設定すれば迷わないはず。

現在の Heroku Scheduler の設定

そこそこ増えてきました。複数リポジトリを指定できるようなツールを作ろうかしら…。

Schedule Repository
Fri 08:00 UTC awesome-github-feed
Fri 08:30 UTC masutaka-29hours
Fri 09:00 UTC masutaka-metrics
Fri 09:30 UTC masutaka.net
Fri 10:00 UTC server-masutaka.net

※ 業務でもいくつかのリポジトリで設定してます。

こんな Pull Request が作られる

継続的 bundle update のサンプル

CircleCI をお使いの皆さんは CI も設定済みでしょうから、この Pull Request の作成をトリガーにして、当然 CI も実行されます。

テストが通ったことを表す緑の✓をクリックすれば、CircleCI の当該ページにジャンプします。warning や deprecated message が増えていないかを必ず確認します。

なぜ継続的に bundle update するのか

継続してサービスを運用し続けるためには、使っている Gem をアップデートし続ける必要があります。

Gem が古いとセキュリティアップデートができなくなったり、使っているサービスの仕様変更に置いて行かれる可能性があります。

これは始めてから気づいたことですが、自分が使っている Gem の変更をキャッチアップしやすくなりました。半年に一回のアップデートでは変更点が膨大になりますが、週に一度ならそれほどでもありません。

他の方法

http://tachikoma.io/ はもっとお手軽です。

ただし、現在はアップデートした Gem の差分へのリンクは分かりません。時間や曜日を指定することも出来ないと思います。

あとがき

以下の記事をまとめてスリムにしたのがこの記事です。

  • CircleCI を使って bundle update を定期実行する Heroku アプリを作った [2015-01-25-1]
  • 継続的 bundle update を簡単に導入できる Gem を作った [2015-03-03-1]

間違いなどあれば、下のコメント欄か @masutaka までお知らせください。

追記(2015-08-29):

YAPC::Asia Tokyo 2015 のセッションで紹介されました。ありがとうございます。

10:40 からです。

資料はこちら。25 ページ目です。
esa.io - 趣味から育てたWebサービスで生きていく // Speaker Deck

追記(2015-12-23):

@ppworks さんがより分かりやすいまとめ記事を書いて下さいました。ありがとうございます!

Circle CIでbundle updateのPull Request作成を自動化する手順 - pblog

追記(2016-10-10):

今後はこちらの README.md をメンテナンスしていきます。