🎉
circleci/slack@4.x.xで、複数のjobを持つ場合のpass/failedを通知仕分ける方法
初期設定
orbのgithubを見ると迷うことなく終えられるため、そちらを参考にしてください
今回、環境変数を設定する際に 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