limitusus’s diary

主に技術のことを書きます

CircleCIをv1からv2に上げたら4倍速くなった話

tl;dr

今までRubyのテストをCircleCI v1で行ってきましたが、v2がGAになったことを受けてv2への移行を行いました。

結果、それまで2分40秒ほどかかっていたテストが40秒台で完了できるようになりました。この過程と効果について紹介します。

 元々のcircle.yml

以下のような感じでした。レポジトリルートのruby/以下に実際のrubyコードは集まっていて、Gemfileなどもそこにあります。

今回の話には関係ないですが、bin/cisetupではpronto rubocopが動きます。

gist.github.com

新しいconfig.yml

最終的なconfig.ymlは以下のようになりました。

gist.github.com

移行のポイント

Timezoneの指定方法

Migration FAQ - CircleCI に記載されています。TZ環境変数にzoneinfoのファイルパスを指定しました。

作業ディレクト

checkoutしないとruby/が見えないので、working_directoryでの指定ができません。runの際は都度cdするようにしています。

キャッシュ

v2の最大の旨味、キャッシュを最大限利用すべきです。

  • 1つはDockerfileのようにステップごとのキャッシュが効くので、レポジトリの中身に依存しないaptを先頭に持ってくること
  • 2つ目はRubyのライブラリで、Gemfile.lockのhash値などをベースにしてキャッシュさせること。今回Gemfile.lockがレポジトリルートにないので、きちんとpathを指定してやる必要がありました。

テストの実行時間

簡単に表にまとめました。

gist.github.com

かなり高速になったことが示せていると思います。

まとめ

CircleCI v2.0はdocker化されたことでテストの駆動が非常に高速になりました。何の工夫もなくただ移行するだけでも価値があります。

さらに上手にキャッシュを行うことで、ライブラリのvendoringを行うようなプロジェクトを運用している場合は非常に大きな効果が出るようです。

落穂拾い

まだこのプロジェクトはCircleCIで無料のまま利用しておりコンテナが1つなのですが、2つ以上で並列化をすることでrspecのテストそのものが速くなる可能性もあります。

一応並列化も見据えて TEST_FILES の設定をconfig.ymlで行っているので、お金が使えるようになったらこの性能検証も実施してみたいと思います。