CircleCIをv1からv2に上げたら4倍速くなった話
tl;dr
今までRubyのテストをCircleCI v1で行ってきましたが、v2がGAになったことを受けてv2への移行を行いました。
結果、それまで2分40秒ほどかかっていたテストが40秒台で完了できるようになりました。この過程と効果について紹介します。
元々のcircle.yml
以下のような感じでした。レポジトリルートのruby/以下に実際のrubyコードは集まっていて、Gemfileなどもそこにあります。
今回の話には関係ないですが、bin/cisetupではpronto rubocopが動きます。
新しいconfig.yml
最終的なconfig.ymlは以下のようになりました。
移行のポイント
Timezoneの指定方法
Migration FAQ - CircleCI に記載されています。TZ環境変数にzoneinfoのファイルパスを指定しました。
作業ディレクトリ
checkoutしないとruby/が見えないので、working_directoryでの指定ができません。runの際は都度cdするようにしています。
キャッシュ
v2の最大の旨味、キャッシュを最大限利用すべきです。
- 1つはDockerfileのようにステップごとのキャッシュが効くので、レポジトリの中身に依存しないaptを先頭に持ってくること
- 2つ目はRubyのライブラリで、Gemfile.lockのhash値などをベースにしてキャッシュさせること。今回Gemfile.lockがレポジトリルートにないので、きちんとpathを指定してやる必要がありました。
テストの実行時間
簡単に表にまとめました。
かなり高速になったことが示せていると思います。
まとめ
CircleCI v2.0はdocker化されたことでテストの駆動が非常に高速になりました。何の工夫もなくただ移行するだけでも価値があります。
さらに上手にキャッシュを行うことで、ライブラリのvendoringを行うようなプロジェクトを運用している場合は非常に大きな効果が出るようです。
落穂拾い
まだこのプロジェクトはCircleCIで無料のまま利用しておりコンテナが1つなのですが、2つ以上で並列化をすることでrspecのテストそのものが速くなる可能性もあります。
一応並列化も見据えて TEST_FILES の設定をconfig.ymlで行っているので、お金が使えるようになったらこの性能検証も実施してみたいと思います。