マジカル受託ワールド

猫魔法エンジニアうーねこちゃんの居る日々

Codeship などの Web Hooks がない CI サービスから rspec のテスト結果を Idobata に投げるスクリプトを書いた

uneco/idobata-rspec-reporter

screenshot

テストが終わったらケーキがありますよ。

適合する条件

使い方

1. Idobata に Generic Hook を登録する

2. CI サービスの環境変数設定などで Idobata のフックURLの /hook/ 以降を環境変数に入れておく

IDOBATA_HOOK_ID=d69567b7-4fdd-7853-e994-b02fc33c2e31

3. CI サービスで rspec のテスト実行時、report.json を吐くようにしておく

E=0 && (bundle exec rspec -c -fp -fjson --out report.json) || E=$?

# 行ごとの終了ステータスを取得してテストを打ち切るタイプの CI では、
# 上記のように終了ステータスを抑制しつつ結果を環境変数に入れる必要があります

4. CI サービスで rspec のテスト実行後, curl などで idobata_rspec_reporter.rb を GitHub からダウンロードする

curl -O https://raw.github.com/uneco/idobata-rspec-reporter/master/idobata_rspec_reporter.rb

5. CI の環境変数でオプションを埋めて実行

ruby idobata_rspec_reporter.rb \
--branch="${CI_BRANCH}" \
--commit-id="${CI_COMMIT_ID}" \
--committer="${CI_COMMITTER_USERNAME}" \
--build-url="${CI_BUILD_URL}" \
--build-number="${CI_BUILD_NUMBER}" \
--message="${CI_MESSAGE}" \
--pull-request="${CI_PULL_REQUEST}" \
--idobata-hook-id="${IDOBATA_HOOK_ID}"

# 複数行コマンドに対応していない CI では一行で書く必要があります

6. (3. でテストの終了ステータスを環境変数に入れた場合)
テストの終了ステータスを CI の成否に反映させるため、テストの末尾に書いておく

(exit $E)

7. Idobata に POST される

screenshot

8. nothing to do! Yay!

注意事項

  • Codeship などの「テスト失敗時にも必ず呼ばれるテスト後の処理」を書く場所がない CI サービスでは、bundle install で発生したエラーなどを拾うことができません
  • 個人のリポジトリに置いてあるものなので、アナウンスなしで内容の変更などがある可能性があります
  • 上記の理由より、クリティカルな部分で使うには fork するか別のサーバに置くなどしてバージョンを固定すると良いかと思います
  • fork でバグ修正や機能追加を行った場合は pull-req いただけると嬉しいです

経緯

  1. チームでの開発に Idobata を使いはじめる
  2. Idobata で標準の Hook が付いてる Travis CI を体験利用してみる
  3. Travis CI なしじゃ生きていけない体に (特に Idobata への Hook と GitHub のコミットステータス)
  4. Travis CI の体験利用期間が終わり、Pro 料金 $129/mo を要求される
  5. 2ヶ月ほどお金を払って使ってみるが、利用料の割に不満は多い
  6. Travis ばかりが CI じゃない! 他の CI サービスを探す
  7. Web Hooks がない or GitHub のコミットステータス変更してくれないサービスばかり

というわけで、GitHub Statuses API 対応のサービスはそこそこあるので、Idobata への Hook に代わるものを作りました。

Codeship いいよねという話

代替の CI サービスを探す中、とりわけ気に入ったのは Codeship でした。
こちらはインターフェイスが綺麗で見やすい上に 50 builds/mo までは無料。
ビルド回数無制限で並列ビルド数1の BASIC アカウントは $49/mo と、ビルドに関しては Travis CI Pro の半額以下の価格で同等の性能を持っています。スゴイ!
しかも Heroku のアドオンや、継続的デプロイメントの機能もあります。
助かっているのでつい褒めそやしてしまいましたが特に回し者じゃないです。

それでは良い CI ライフを。