LoginSignup
4
4

More than 5 years have passed since last update.

Circle CIでparallelが有効な場合のcircleci-bundle-update-prの使い方

Last updated at Posted at 2017-03-02

課題

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が指定されるのはソース読んで確認しました。

circle.ymlのdeploymentブロック
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}がある場合はテストをスキップしたいのですが、ヒアドキュメントで記述しながら並行実行の設定をする方法がわかりませんでした。

circle.ymlのtestブロック(ppworksさんバージョン)
test:
  override:
    - |
      if [ -z "${BUNDLE_UPDATE}" ] ; then
        bundle exec rspec --fail-fast
      fi

結構ググったのですが、多分なさそうだなと思ったので、シェルスクリプトを作成して指定しました。

参考URL
- https://circleci.com/docs/1.0/parallel-manual-setup/#manual-balancing

bin/rspec.sh(新規作成)
#!/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を修正します。

circle.ymlのtestブロック(並列実行)
test:
  override:
    - bin/rspec.sh:
        parallel: true
                files:
          - spec/**/*_spec.rb

これで完成です。

まとめ

自動でbundle updateが実行され、その差分へのリンクをcircleci-bundle-update-prが作ってくれるため、もしbundle update後のPRでテストがこけても、調査するための時間が短くて済みます。やっといて損はないなと思います。

4
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4