0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CircleCI の requires を使いこなしてCI/CDワークフローの条件分岐をシンプルに書く

0
Posted at

CircleCI の requires はデフォルトで上流ジョブの success のみを待ちます。そのため、上流が失敗またはキャンセルされると、後処理ジョブ(テスト用 DB の削除、一時リソースの解放、Slack 通知など)が動かないという問題が生じることがあります。

2026年2月のリリースで、requiresterminalnot_run の2つのステータス値が追加されました。本記事では、全ステータス値の意味と、後処理ジョブの条件別の書き方を解説します。

requires のステータス値一覧

requires で指定できるステータス値は6種類あります。

ステータス値 意味 terminal に含まれるか
success ジョブが成功した(デフォルト)
failed ジョブが失敗した(タイムアウト含む)
canceled ジョブがキャンセルされた
unauthorized restricted context の権限がなく実行できなかった
not_run ジョブの依存が永久に満たされなかった(2026/02 追加)
terminal 上記5つすべての集約値(2026/02 追加)

not_run は、上流ジョブが失敗したり unauthorized になったりして依存が永久に満たされなくなった場合に設定されるステータスです。terminalsuccessfailedcanceledunauthorizednot_run の5つをまとめた集約値で、「上流がどんな終端状態になっても実行する」という意図を1語で表現できます。

ステータス値の指定方法

ステータス値は requires のジョブ名に対してマップ形式で指定します。1つのみ指定する場合と複数指定する場合で構文が異なります。

workflows:
  example:
    jobs:
      - upstream-job
      # 1つのみ指定
      - single-condition:
          requires:
            - upstream-job: failed
      # 複数指定(OR 条件)
      - multi-condition:
          requires:
            - upstream-job:
              - failed
              - canceled

ユースケース別の設定例

後で行うジョブの条件によって、使うステータス値が変わります。ここからは5つのパターンについて紹介します。

パターン1:上流がどう終わっても後処理を動かす(クリーンアップ)

テスト用 DB の削除や一時クラウドリソースの解放など、上流の結果に関わらず必ず実行したい場合は terminal を使います。

通常の書き方では、対象となるステータスを全て列挙する必要がありました。

# 旧来の書き方(terminal 追加前)
- teardown-db:
    requires:
      - run-tests:
        - success
        - failed
        - canceled
        - unauthorized
        - not_run

terminal を使うと1行で同じ意味を表現できます。

# terminal を使った書き方
- teardown-db:
    requires:
      - run-tests: terminal

terminalsuccessfailedcanceledunauthorizednot_run の5つを1語で表現できるため、全ステータスを列挙するより意図が明確になります。

実際の挙動を上流ジョブの成否別に見てみましょう。上流の run-tests-fail が failed で終わった場合でも、teardown-dbrequires: run-tests-fail: terminal の条件を満たすため実行されます。

スクリーンショット 2026-04-22 19.23.08.png

上流が success の場合も同様に teardown-db が実行されます。terminalsuccess を含む5つの終端状態すべてをカバーするため、上流の結果に関わらず後処理が走ることを1つのステータス値で保証できます。

スクリーンショット 2026-04-22 19.23.23.png

パターン2:失敗時だけ通知する

デプロイが失敗した場合のみ Slack に通知するといった条件には、failed を単独で指定します。

workflows:
  deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
      - notify-failure:
          requires:
            - deploy: failed  # deploy が失敗した場合のみ実行

deploy が成功した場合、notify-failurerequires の条件(deploy: failed)を満たせないため not_run となり実行されません。

スクリーンショット 2026-04-22 19.24.49.png

deploy が failed の場合にのみ notify-failure が実行されます。ステータス集計にも Failed 1 / Success 2 と表示され、失敗ジョブ1件と通知を含む成功ジョブ2件が内訳から読み取れます。

スクリーンショット 2026-04-22 19.24.00.png

パターン3:キャンセル時だけ通知する

長時間かかるデプロイジョブが手動キャンセルされた場合のみ通知するケースには、canceled を使います。

workflows:
  deploy:
    jobs:
      - deploy
      - notify-canceled:
          requires:
            - deploy: canceled  # deploy がキャンセルされた場合のみ実行

パターン4:上流の失敗で実行されなかったジョブをフォローする

上流ジョブが失敗するなどして依存が満たされなかったジョブは、not_run ステータスになります。not_runrequires で指定すると、「上流の失敗によって実行されなかったジョブを後処理でフォローする」ユースケースを記述できます。

workflows:
  deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build          # build が failed → deploy は依存未充足で not_run になる
      - fallback:
          requires:
            - deploy: not_run  # deploy が not_run のとき実行

上の例では、build が失敗すると deploy は依存が満たせないため not_run になります。fallbackdeploy: not_run を条件にしているため、このとき実行されます。

スクリーンショット 2026-04-22 17.35.25.png

実際のワークフロー画面では、build が失敗、deploynot_run(ダッシュアイコン)、fallback が成功となり、右上のステータス集計にも Not_run 1 が表示されます。

パターン2(deploy: failed)との使い分けは、どのジョブが実行されたかで判断します。

  • deploy: faileddeploy が実行されて失敗した場合
  • deploy: not_rundeploy 自体が実行されず、さらに上流のジョブの失敗が原因となった場合

チェーンのどこかで失敗が起きた結果、特定のジョブが実行されなかったことを検知したい場合に not_run が有用です。

パターン5:ブランチごとに後処理を切り替える

main ブランチでは deploy を動かし、それ以外のブランチでは別の通知を流したい」といったブランチ依存の後処理には、後処理ジョブ自身に branch filter を付けるのが idiomatic です。

workflows:
  deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
          filters:
            branches:
              only: main
      - notify-non-main:
          requires:
            - build
          filters:
            branches:
              ignore: main

main ブランチでは builddeploy が実行され、notify-non-main は filter で除外されます。

スクリーンショット 2026-04-22 17.39.58.png

main 以外のブランチでは deploy が filter で除外され、notify-non-main が実行されます。

スクリーンショット 2026-04-22 17.36.02.png

requires: ジョブ名: not_run を使って branch filter によるスキップを検知する書き方(下記)は期待通りには動きません。

- deploy:
    filters:
      branches:
        only: main
- notify-skipped:
    requires:
      - deploy: not_run    # ← 期待通り動かない

公式ドキュメントの Configuration reference: requires には次のように記載されています。

When jobs you list as dependencies don't execute (due to filters, for example), CircleCI ignores them as dependencies for other jobs. However, if all dependencies of a job are filtered, that job doesn't execute either.

branch filter で除外されたジョブは requires の依存解決上「無視される」ため、not_run としてはマッチしません。さらに依存先がすべて除外された場合、その下流ジョブ自体も実行されません。そのため、ブランチごとの後処理は上の例のように後処理ジョブ側に直接 filter を付けてください。

使い分けの基準

ユースケースに応じた選択の基準をまとめます。

目的 使うステータス値
上流がどう終わっても実行する(クリーンアップ等) terminal
失敗時のみ実行する(失敗通知等) failed
キャンセル時のみ実行する canceled
上流の失敗で実行されなかったジョブをフォローする not_run
成功・失敗どちらでも実行する(スキップ時は除く) [success, failed]
ブランチごとに後処理を切り替える 後処理ジョブに filters.branches を付ける

「何が起きても後処理を動かしたい」場合は terminal が最適です。特定の終端状態にのみ反応させたい場合は、対応するステータス値を個別に指定してください。

requires の複数ジョブ指定は AND 条件になります。次の例では、job-afailed かつ job-bfailed の場合にのみ notify が実行されます。

- notify:
    requires:
      - job-a: failed
      - job-b: failed

片方のジョブしか failed にならなかった場合、notify は依存条件を満たせず not_run になります。

スクリーンショット 2026-04-22 17.36.53.png

上の例では and-job-a-fail が failed、and-job-b-success が success となっており、AND 条件(両方 failed)が満たされないため and-notify-both-failednot_run になっています。

「どちらか一方が失敗したら通知する」OR 条件は、requires の構文だけでは表現できません。

まとめ

terminalnot_run の追加により、後処理ジョブの条件を config に直接記述できるようになりました。terminal はクリーンアップ・リソース解放のような「必ず実行したい」処理に、not_run は上流チェーンの失敗によって実行されなかったジョブを検知したい場合に使います。

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?