[CircleCI]ジョブが失敗しても後続ジョブを実行する機能を試す
はじめに
こんにちは、M-Yamashitaです。
今回の記事は、CircleCIのジョブのrequires
にステータスも指定可能になったアップデートがあったのでその機能を試す話です。
業務で少し似た経験をしており良い方法はないかなと模索していたところ、X上で今回のアップデートが目に留まりました。そのため、アップデートの概要と動作結果についてこの記事で共有します。
この記事で伝えたいこと
- CircleCIの機能として、
requires
にジョブ名だけでなくsuccess
、failed
、canceled
といったステータスも指定できるようになった - ジョブが失敗しても後続のジョブを実行できるようになった
- 後続のジョブが成功してもワークフロー自体のステータスは失敗と表示される
CircleCIの新機能
2024年年末にCircleCIからアップデートのアナウンスがありました。
Customers have been asking for more flexibility when building dependency requirements between jobs. To date “requires” was based on the success of the required job. That is no longer the case. “Requires” now supports job status; success, failed, and canceled.
jobs:
- a
- b
- c:
requires:
- a canceled
- b:
- failed
- success
- d:
requires:
- a: #defaults to success
- b:
- failed
- success
requires
にジョブ名に加えてsuccess
、failed
、canceled
のステータスも指定できるようになったアップデートのようです。
上記のサンプルコードの場合、c
のジョブを実行するには以下の条件をどちらも満たす必要があるようです。
- aのジョブのステータスが
canceled
であること - bのジョブのステータスが
failed
またはsuccess
であること
またd
のジョブのrequires
にある通り、ジョブに指定するステータスではデフォルトはsuccess
が適用されるようです。
なお、今回のアップデートの詳細については公式ドキュメントにも記載されています。
余談ですが、アナウンスの1文目に、ジョブ間の依存を柔軟にしたいというお客さんの要望とあることから、この要望を待ち望んでいるお客さんが多かったのかもしれません。
実例
ここでは2つの実例を紹介します。
-
requires
に1つのジョブと複数ステータスを指定した場合の後続ジョブ実行 -
requires
に複数のジョブと複数ステータスを指定した場合の後続ジョブ実行
requires
に1つのジョブと複数ステータスを指定した場合の後続ジョブ実行
公式ドキュメントにあったサンプルワークフローをもとに、それぞれのジョブを定義しジョブ失敗時の処理を試してみます。
version: 2.1
jobs:
build:
docker:
- image: cimg/base:stable
steps:
- run:
name: "Build Step"
command: echo "Build Step"
test:
docker:
- image: cimg/base:stable
steps:
- run:
name: "Test Step"
command: echo "Test Step"
deploy:
docker:
- image: cimg/base:stable
steps:
- run:
name: "Deploy Step"
command: exit 1
notify-build-canceled:
docker:
- image: cimg/base:stable
steps:
- run:
name: "Notify Build Canceled Step"
command: echo "Notify Build Canceled Step"
cleanup:
docker:
- image: cimg/base:stable
steps:
- run:
name: "Cleanup Step"
command: echo "Cleanup Step"
workflows:
my-workflow:
jobs:
- build
- test:
requires:
- build
- deploy:
requires:
- build
- test
- notify-build-canceled:
requires:
- build: canceled
- cleanup:
requires:
- deploy:
- failed
- canceled
このワークフローでは、基本的に各ジョブでechoするだけとしています。ただしdeploy
のみexit 1
を実行しているため、ジョブのステータスがfailed
となります。
このワークフローを実行すると以下のような結果が得られました。
deploy
のジョブが失敗したことを受けて、cleanup
のジョブが実行されていることが確認できます。またnotify-build-canceled
については、build
のジョブがcanceled
された場合に実行されることとなっていますが、今回はbuild
のステータスがfailed
となったため実行されていません。
requires
に複数のジョブと複数ステータスを指定した場合の後続ジョブ実行
次に今回のアップデートのお知らせにあったサンプルコードをもとに、requires
に複数ジョブ、複数ステータスを指定した場合の挙動を確認します。
version: 2.1
jobs:
a:
docker:
- image: cimg/base:stable
steps:
- run:
name: "A Step"
command: echo "A Step"
b:
docker:
- image: cimg/base:stable
steps:
- run:
name: "B Step"
command: exit 1
c:
docker:
- image: cimg/base:stable
steps:
- run:
name: "C Step"
command: echo "C Step"
d:
docker:
- image: cimg/base:stable
steps:
- run:
name: "D Step"
command: echo "D Step"
workflows:
my-workflow-2:
jobs:
- a
- b
- c:
requires:
- a: canceled
- b:
- failed
- success
- d:
requires:
- a #defaults to success
- b:
- failed
- success
このワークフローでも基本的に各ジョブでechoするだけとしています。ただしb
のみexit 1
を実行しているため、ジョブのステータスがfailed
となります。
このワークフローを実行すると以下のような結果が得られました。
c
のジョブは以下2つをどちらも満たす場合に実行されるように設定されています。
-
a
のステータスがcanceled
となった -
b
のステータスがfailed
またはsuccess
となった
→今回の結果ではa
のステータスが一致していないため、c
が実行されていません。
また、d
のジョブは以下2つをどちらも満たす場合に実行されるように設定されています。
-
a
のステータスがsuccess
となった -
b
のステータスがfailed
またはsuccess
となった
→今回の結果ではa
のステータスがsuccess
、b
のステータスがfailed
となっているため、d
が実行されていることがわかります。
おわりに
この記事では、CircleCIのジョブのrequires
にステータスも指定可能になったアップデートについて実例も含めて共有しました。この機能を使うことで、ジョブ失敗時の通知をSlackに投稿するといった連携も可能になるかと思います。
この記事が誰かのお役に立てれば幸いです。
Discussion