kakakakakku blog

Weekly Tech Blog: Keep on Learning!

CircleCI の Auto-cancel redundant builds が Workflows にも対応した

CircleCI には便利な Auto-cancel redundant builds があり,有効にしておくと,同じブランチに対して複数回ビルドがトリガーされた場合に,自動的に過去のビルドがキャンセルされる.繰り返し git push をして,さらに CI 時間が長いような場合には,無駄な待ち時間を減らせたり,ジョブの詰まりを減らせたりする.この機能は CircleCI 1.0 時代からあったけど,もしかしたらあまり知られていないかも?

Auto-cancel redundant builds with Workflows

最近のリリースで 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

circleci.com

試してみた

まず Auto-cancel redundant builds を無効にした状態で,単純に sleep するだけの CI ジョブを作成し,複数回ビルドをトリガーしてみた.すると,以下のように RUNNING が多く並んだ.こうなってしまうと,ジョブが詰まってしまうので,開発効率も下がってしまう.

f:id:kakku22:20180822214033p:plain

次にプロジェクト設定を変更する.Auto-cancel redundant buildsEnable build processing (preview) を有効にした.

  • Advanced Settings
    • Auto-cancel redundant builds
      • OffOn
    • Enable build processing (preview)
      • OffOn

f:id:kakku22:20180822214042p:plain

この状態で,複数回ビルドをトリガーしてみた.すると,詰まっているビルドが自動的に CANCELED になった.便利!

f:id:kakku22:20180822214051p:plain

注意点 : デフォルトブランチは対象外になる

公式ドキュメントに書いてある通り,デフォルトブランチは対象外になる.これは適切な挙動だと思っていて,特に 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 でも使えるようになった(とのこと)
  • 実際に試してみた