はじめに
GitHub ActionsでSlack通知を行いたいという場面では、以下のようなサードパーティー製を使う事が多い。
ただ、Enterpriseでそういったものを使うのが憚られる(承認が必要…などの)際にはcurlで通知できると便利。
(自分のメモ用としても残しておこうと思います。)
curlでSlack通知
以下のように書く事で実現できる。
name: slack notification test
on:
push:
branches:
- '**'
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Slack Notification
if: always()
run: |
if [ '${{ job.status }}' = 'success' ]; then
COLOR="good"
else
COLOR="danger"
fi
jq -n --arg jobLink '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}' --arg color "${COLOR}" '{
attachments: [{
pretext: "結果 ${{ job.status }}",
color: $color,
title: $jobLink,
title_link: $jobLink,
text: "hogehoge"
}]
}' | curl ${{ secrets.SLACK_WEBHOOK_URL }} -X POST -H 'Content-Type: application/json' -d @-
一部詳細を見ていく。
if: always()
if: always()
実際には、Slack通知の前にはCI・CDの各stepsが実行される。
それらの実行結果が何であれSlack通知は実行したいのでalways()
を指定している。
bashのif文
if [ '${{ job.status }}' = 'success']; then
COLOR="good"
else
COLOR="danger"
fi
Slack通知する際に分かりやすくするために、attachmentsを使用する。
ただ、結果の通知で変わるのがcolorだけの場合、success
・failure
のそれぞれを実装したくない・・・。
DRY原則的にも望ましい形にするためjob.status
の結果でcolorが変わるようにしている。
※attachmentsの雰囲気掴みにはこちら
jqの部分
jq -n --arg jobLink '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}' --arg color "${COLOR}"
キーワード | 意味 |
---|---|
-n | null(空)を無視する |
--arg | jq実行時に変数として受け渡しをするためのオプション --arg foo barとすると、$fooで値「bar」をバインドできる 値は文字列として扱われるので、--arg foo 123だと"123"としてバインドされる |
jqはコマンドライン上でJSONを操作(filtering,整形など)ができるツール。
今回はjqを使ってJSONを生成して、それを後の工程で標準入力として渡している。
curlの部分
... | curl ${{ secrets.SLACK_WEBHOOK_URL }} -X POST -H 'Content-Type: application/json' -d @-
キーワード | 意味 |
---|---|
${{secrets.SLACK_WEBHOOK_URL}} | GitHub上のsecretsで設定したIncoming Webhook URL https://{server_url}/{repo}/settings/secrets/actions |
@- | 標準入力から取り込む時に使うoption ex) "処理" | curl http://hoge.com -X POST -d @- |
ここではIncoming Webhook URLを用いてSlack通知を実現する。
※Incoming Webhooksでのメッセージ送信についてはここ
Slack側の設定
Slackアプリを作成する
Create a Slack appにアクセスし、Create a Slack app
をクリックする。
するとslack apiのサイトにリダイレクトする。
リダイレクトすると以下のポップアップが表示されるので、App Name
・Workspace
をそれぞれ入力・選択する。
Incoming Webhooksを有効化する
前の工程でslackアプリを作成すると、アプリの設定画面にリダイレクトする。
設定画面でIncoming Webhooksを有効化するために、以下のIncoming Webhooks
をクリックする。
Incoming Webhooksを作成する
Incoming Webhooksの設定画面に遷移するので、off
からon
に変更する。
on
にすると以下のようにAdd New Webhook to Workspace
というボタンが表示されるので、それをクリックしそこからチャンネルとの紐づけ(権限)を設定する。
以下の画面が表示されるので通知先のチャンネルを選択し、許可する
をクリックして設定を完了させる。
Incoming Webhook URLを利用して通知をテストしてみる
通知先のチャンネルを指定すると、Incoming Webhooks
の設定画面上でWebhook URL
が追加されているのが確認できる。
このURLを使ってチャンネルへ通知を行える。
実際にコマンドプロンプトから送ってみると…
curl -X POST -H "Content-type: application/json" --data "{\"text\":\"Hello, World!\"}" https://hooks.slack.com/services/…
コマンドプロンプト | slack |
---|---|
ちゃんと通知できている事が確認できた!
後は、GitHub Actionsで実際にyamlを記載しパイプラインを実行すればOK!