📌

[CircleCI]ジョブが失敗しても後続ジョブを実行する機能を試す

2025/01/12に公開

はじめに

こんにちは、M-Yamashitaです。

今回の記事は、CircleCIのジョブのrequiresにステータスも指定可能になったアップデートがあったのでその機能を試す話です。
業務で少し似た経験をしており良い方法はないかなと模索していたところ、X上で今回のアップデートが目に留まりました。そのため、アップデートの概要と動作結果についてこの記事で共有します。

この記事で伝えたいこと

  • CircleCIの機能として、requiresにジョブ名だけでなくsuccessfailedcanceledといったステータスも指定できるようになった
  • ジョブが失敗しても後続のジョブを実行できるようになった
  • 後続のジョブが成功してもワークフロー自体のステータスは失敗と表示される

CircleCIの新機能

2024年年末にCircleCIからアップデートのアナウンスがありました。
https://circleci.com/changelog/more-flexible-job-required-capabilities/

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にジョブ名に加えてsuccessfailedcanceledのステータスも指定できるようになったアップデートのようです。
上記のサンプルコードの場合、cのジョブを実行するには以下の条件をどちらも満たす必要があるようです。

  • aのジョブのステータスがcanceledであること
  • bのジョブのステータスがfailedまたはsuccessであること

またdのジョブのrequiresにある通り、ジョブに指定するステータスではデフォルトはsuccessが適用されるようです。

なお、今回のアップデートの詳細については公式ドキュメントにも記載されています。
https://circleci.com/docs/configuration-reference/#requires

余談ですが、アナウンスの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のステータスがsuccessbのステータスがfailedとなっているため、dが実行されていることがわかります。

おわりに

この記事では、CircleCIのジョブのrequiresにステータスも指定可能になったアップデートについて実例も含めて共有しました。この機能を使うことで、ジョブ失敗時の通知をSlackに投稿するといった連携も可能になるかと思います。

この記事が誰かのお役に立てれば幸いです。

Money Forward Developers

Discussion