CircleCI には便利な Auto-cancel redundant builds があり,有効にしておくと,同じブランチに対して複数回ビルドがトリガーされた場合に,自動的に過去のビルドがキャンセルされる.繰り返し git push
をして,さらに CI 時間が長いような場合には,無駄な待ち時間を減らせたり,ジョブの詰まりを減らせたりする.この機能は CircleCI 1.0 時代からあったけど,もしかしたらあまり知られていないかも?
Auto-cancel redundant builds with Workflows
ついにWorkflowsでAuto Cancelling Redundant Buildサポートされました(まだPreviewですが)🥳同じブランチで複数のジョブが走った場合、古いジョブを自動でキャンセルしてくれる機能です。これを使うとコミットが多いプロジェクトでもビルド使用量を節約することができます。https://t.co/Kig2713huJ
— CircleCI Japan (@CircleCIJapan) August 20, 2018
最近のリリースで Auto-cancel redundant builds を Workflows でも使えるようになった(とのこと).一部注意点はあるものの,公式ドキュメントにも手順が載っていた.
- Auto Cancelling a Redundant Build
- Steps to Enable Auto-Cancel for New Builds Triggered by Pushes to GitHub without Worklfows
- Steps to Enable Auto-Cancel for Workflows Triggered by Pushes to GitHub or the API
試してみた
まず Auto-cancel redundant builds を無効にした状態で,単純に sleep
するだけの CI ジョブを作成し,複数回ビルドをトリガーしてみた.すると,以下のように RUNNING
が多く並んだ.こうなってしまうと,ジョブが詰まってしまうので,開発効率も下がってしまう.
次にプロジェクト設定を変更する.Auto-cancel redundant builds と Enable build processing (preview) を有効にした.
- Advanced Settings
- Auto-cancel redundant builds
Off
→On
- Enable build processing (preview)
Off
→On
- Auto-cancel redundant builds
この状態で,複数回ビルドをトリガーしてみた.すると,詰まっているビルドが自動的に CANCELED
になった.便利!
注意点 : デフォルトブランチは対象外になる
公式ドキュメントに書いてある通り,デフォルトブランチは対象外になる.これは適切な挙動だと思っていて,特に master などは,リリースプロセスに使うため,必ずビルドをしてあげる必要がある.
Projects for which auto-cancel is enabled in the Advanced Settings will have workflows on non-default branches cancelled when a newer build is triggered on that same branch.
注意点 : キャンセルされて良いかを考える
公式ドキュメントに書いてある通り,Auto-cancel redundant builds を有効にする前にビルドのユースケースを考える必要がある.例えば lint 系だけではなく,デプロイもビルドで行っている場合など,自動キャンセルによって不整合などが起きないようになっている必要がありそう.
Notes: It is important to carefully consider the impact of enabling the auto-cancel feature, for example, if you have configured automated deployment jobs on non-default branches. Auto-cancelling workflows requires enabling the preview build processing feature.
まとめ
- CircleCI の Auto-cancel redundant builds は便利
- 最近のリリースで Workflows でも使えるようになった(とのこと)
- 実際に試してみた