課題
gemのバージョンが古くなったままになっていたまま放置されていた。
ときどき、個別にbundle updateしていたが、もっと小まめにやりたい。
どうせなら勝手にやって、問題があるときだけ教えてほしい。
調査
ありがたいことに、ci-bundle-updateというHerokuアプリと、circleci-bundle-update-prというgemが存在しました。
ci-bundle-update
ci-bundle-updateはHerokuアプリ。
Herokuのアプリといっても、Web用の画面はなく、コマンドラインのみ。
Heroku Schedulerを使って、cronのように1日1回Circle CIに該当リポジトリのNightly buildを依頼するという役割のみ。
上記のリンクからDeploy to Heroku
ボタンを押して、適切な環境変数を設定すれば、Circle CIのNightly buildのAPIを使ってビルドしてくれます。
このアプリ、よく考えたら名前がよくない気がします(ありがたいアプリではあるのですが)。
というのも、bundle update
をするかどうかは、該当プロジェクトのcircle.yml
の設定次第だからです。
ci-nightly-buildとかがいいような…。
ちなみに、Heroku Schedulerに設定するコマンドは、こう。
bundle exec ruby ci-bundle-update.rb
Heroku Schedulerに指定する前に、手動で動かして動作チェックしたい場合、ローカルで以下のように打ちます。
heroku run bundle exec ruby ci-bundle-update.rb --app [app_name]
circleci-bundle-update-pr
circleci-bundle-update-prは、Circle CI上でbundle updateしてgithubへのPull Requestを作るgemです。
ci-bundle-updateによるNightly buildの依頼がきたときのみ、実行するものになります。
使い方
使い方はppworksさんが詳しく書いてくれているので、そちらを参考にしてください。
上記のURLの説明と違う部分のみ後述します。
bundle updateを実行したプロジェクトのcircle.yml
deployment
ブロックは以下の通り。ci-bundle-update経由での依頼の場合のみ、BUNDLE_UPDATE
という変数が有効になっているので、そのときだけcircleci-bundle-update-prをインストールし、即実行しています。
<github user_name>
,<github user_email>
,<branch_name>
は省略できるかもしれないが、私は省略しなかったので、もし動かなかった場合は全部入れましょう。<branch_name>
は省略するとmasterが指定されるのはソース読んで確認しました。
deployment:
production:
branch: master
commands:
- |
if [ "${BUNDLE_UPDATE}" ] ; then
gem update bundler --no-document
gem install circleci-bundle-update-pr
circleci-bundle-update-pr <github user_name> <github user_email> <branch_name>
fi
次に、test
ブロックです。ppworksさんの記事のように、${BUNDLE_UPDATE}
がある場合はテストをスキップしたいのですが、ヒアドキュメントで記述しながら並行実行の設定をする方法がわかりませんでした。
test:
override:
- |
if [ -z "${BUNDLE_UPDATE}" ] ; then
bundle exec rspec --fail-fast
fi
結構ググったのですが、多分なさそうだなと思ったので、シェルスクリプトを作成して指定しました。
参考URL
#!/bin/bash
if [ -z "${BUNDLE_UPDATE}" ] ; then
bundle exec rspec --profile 20 --format documentation --format RspecJunitFormatter --out $CIRCLE_TEST_REPORTS/rspec.xml $@
fi
忘れずに実行権限を与えましょう。
chmod +x bin/rspec.sh
その後、circle.ymlを修正します。
test:
override:
- bin/rspec.sh:
parallel: true
files:
- spec/**/*_spec.rb
これで完成です。
まとめ
自動でbundle update
が実行され、その差分へのリンクをcircleci-bundle-update-prが作ってくれるため、もしbundle update
後のPRでテストがこけても、調査するための時間が短くて済みます。やっといて損はないなと思います。