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

日々、bundle updateしてますか!

circleci-bundle-updatecircleci-bundle-update-prを使って、bundle updateの Pull Requestを自動化する手順をまとめてみます。作者の記事を読めばいいっちゃいいんですが、地味に抜けていた手順と各ステップは何のために必要かを整理してみました。

このgemは、Pull Requestに各gemの差分リンクを貼ってくれるのが便利だな!って思って採用してます。素敵なgemをありがとうございます。

github.com github.com

ステップは

  1. CircleCI経由でbotからgithubにpush出来るようにしておく
  2. CircleCI経由でbotからgithubにPR作れるようにしておく
  3. 外部からCircleCIへbuild指示できるようにする
  4. 外部からcronでCircleCIへbuild実行する
  5. CicleCIのbuild時にPRを送るようにする

といった感じです。

CircleCI経由でbotからgithubにpush出来るようにしておく

CircleCIからgithubgit pushするのが目的です。

  1. githubでPRを送りたいユーザーでログインする
  2. CircleCIにてPRを送りたいprojectを登録する or Followする
    f:id:naoto5959:20151223211412p:plain
  3. CircleCI経由でbotからPR出来るように鍵を登録する。Project SettingsからCheckout SSH keysからAdd user keyする
    f:id:naoto5959:20151223211426p:plain
  4. もし、まだAuthorizeしていなかった場合は、次に「Create and add nekodayo user key」をクリックして鍵を追加
    f:id:naoto5959:20151223211439p:plain
  5. こんな感じでkeyが追加されていればok
    f:id:naoto5959:20151223211447p:plain

CircleCI経由でbotからgithubにPR作れるようにしておく

CircleCIからgithubのAPIを叩けるようにするのが目的です。

  1. githubでPRを送りたいユーザーでログインする
  2. access_tokenをrepo grantで作る
    f:id:naoto5959:20151223211458p:plain
  3. 生成されたAccess Tokenをコピーしておく
    f:id:naoto5959:20151223211452p:plain
  4. CircleCIの該当Project SettingsからEnvironment variablesにてGITHUB_ACCESS_TOKENという名前で環境変数を設定する
    f:id:naoto5959:20151223211506p:plain

外部からCircleCIへbuild指示できるようにする

つまり、CircleCIのAPIを叩けるようにするのが目的です。

  1. CircleCIの該当Project SettingsからAPI Permissionsで、Allを選択し、bundle update cron用とか適当にラベルを付ける
    f:id:naoto5959:20151223211513p:plain
  2. 出来上がったTOKENをcron botから使う

外部からcronでCircleCIへbuild実行する

  1. ci-bundle-updateのheroku buttonでデプロイ
  2. 指示通りに環境変数を設定
    • GITHUB_USERNAME=botのユーザー名
    • GITHUB_REPONAME=projectの名前
    • CIRCLECI_TOKEN=先ほどのTOKEN
  3. heroku schedulerにbundle exec ruby ci-bundle-update.rbを設定

CicleCIのbuild時にPRを送るようにする

github.com

を参考に、pplogではこんな感じに設定しています。

deployment:
  production:
    branch: master
    commands:
      - |
        if [ "${BUNDLE_UPDATE}" ] ; then
          gem update bundler --no-document
          gem install circleci-bundle-update-pr
          circleci-bundle-update-pr
        fi
test:
  override:
    - |
      if [ -z "${BUNDLE_UPDATE}" ] ; then
        bundle exec rspec --fail-fast
      fi

こんな感じのPull Requestが届くようになります。

f:id:naoto5959:20151223220030p:plain

余談

設定している際に、botのACCESS_TOKENを持っている状態でワザワザgithu user_nameとemailを指定している箇所が無駄だなと思ったので、Pull Request送ったりしてました。

github.com

まとめ

Railsを選択するには、「それでもRailsを選択する3つの理由 - pblog」といった理由があるはずで、そのためには

  • テストを書く
  • 周辺gemの更新に追随し続ける

必要があります。そのためにも自動でbundle updateをして日常的に最新のgemを使うようにしたいですね。