0
Help us understand the problem. What are the problem?

posted at

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

初期設定

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の設定など、普段あまりやらないので、ちょっと大変やった。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?