🎉

circleci/slack@4.x.xで、複数のjobを持つ場合のpass/failedを通知仕分ける方法

2021/03/24に公開

初期設定

orbのgithubを見ると迷うことなく終えられるため、そちらを参考にしてください
https://github.com/CircleCI-Public/slack-orb/wiki/Setup

今回、環境変数を設定する際に slack コンテキストの設定を想定します

通知を分ける難しさ

slack/notify では、 event パラメーターによって、通知を行う条件を出し分けることができます。

- slack/notify:
    channel: 'xxx'
    event: fail
    template: basic_fail_1

例えばこれだと、failしたときにだけslackに通知されます。

しかし、 event は同一job内の状態のみ見ます。
つまり 複数のjobに跨る場合、例えばnotifyだけ行うjobを作った場合、常にpassになります

jobs:
  notify:
    executor: xxx
      steps:
        - slack/notify:
            channel: 'xxx'
            event: fail
            template: basic_fail_1
workflows:
  test:
    jobs:
      - build
      - test
      - notify:
          requires:
            - build
            - test
          context:
            - slack

こういう書き方をしても、 event: failとなることはないので、何も起きません

通知仕分ける方法

以下の考え方で出し分けます

  • 多数jobを持つworkflowの場合、1つ1つの成功を知るのはノイズになるのでやりたくない
  • workflowのjobの内、1つでも失敗したら通知を受けたい

というわけで、より具体的に言うと

  • 失敗したら通知を受けたいjobの最後に、 event: fail のnotifyを差し込む。たくさん書くので、 command 化する
  • 成功したら通知を受けたいjobは、通知を送るだけのjobを作って、 requires で制御する。

という感じになります。

# 最初にコマンドを作る
commands:
  notify_failed:
    steps:
      - slack/notify:
          channel: 'xxxx'
          event: fail
          template: basic_fail_1
  notify_passed:
    steps:
      - slack/notify:
          channel: 'xxxx'
          event: pass
          template: basic_success_1

# buildとtestというjobがある想定
jobs:
  build:
    executor: xxx
    steps:
      - checkout
      - restore_modules
      - run:
          name: install dependencies
          command: yarn install
      - save_modules
      - notify_failed # このjobが失敗した場合のみ通知する
  test:
    executor: xxx
    steps:
      - checkout
      - restore_modules
      - run:
          name: install dependencies
          command: yarn install
      - run:
          name: run test
          command: yarn test:ci
      - notify_failed # このjobが失敗した場合のみ通知する
  notify:
    executor: plain
    steps:
      - notify_passed # 成功の通知だけするjobを作る

# requiresを使うことで、成功通知のjobを失敗時に抑制する
workflows:
  version: 2
  test:
    jobs:
      - build:
          context:
            - slack
      - test:
          requires:
            - build
          context:
            - slack
      - notify:
          requires:
            - build
            - test
          context:
            - slack

所管

Circle CIの設定など、普段あまりやらないので、ちょっと大変やった。

Discussion