はじめに
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!

