LoginSignup
2
0

More than 1 year has passed since last update.

GitHub ActionsでSlack通知をcurlで

Last updated at Posted at 2021-04-23

はじめに

GitHub ActionsでSlack通知を行いたいという場面では、以下のようなサードパーティー製を使う事が多い。

ただ、Enterpriseでそういったものを使うのが憚られる(承認が必要…などの)際にはcurlで通知できると便利。
(自分のメモ用としても残しておこうと思います。)

curlでSlack通知

以下のように書く事で実現できる。

slack-notification.yaml
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だけの場合、successfailureのそれぞれを実装したくない・・・。
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をクリックする。
image.png
するとslack apiのサイトにリダイレクトする。
リダイレクトすると以下のポップアップが表示されるので、App NameWorkspaceをそれぞれ入力・選択する。
image.png

Incoming Webhooksを有効化する

前の工程でslackアプリを作成すると、アプリの設定画面にリダイレクトする。
設定画面でIncoming Webhooksを有効化するために、以下のIncoming Webhooksをクリックする。
image.png

Incoming Webhooksを作成する

Incoming Webhooksの設定画面に遷移するので、offからonに変更する。
image.png

onにすると以下のようにAdd New Webhook to Workspaceというボタンが表示されるので、それをクリックしそこからチャンネルとの紐づけ(権限)を設定する。
image.png

以下の画面が表示されるので通知先のチャンネルを選択し、許可するをクリックして設定を完了させる。
image.png

Incoming Webhook URLを利用して通知をテストしてみる

通知先のチャンネルを指定すると、Incoming Webhooksの設定画面上でWebhook URLが追加されているのが確認できる。
このURLを使ってチャンネルへ通知を行える。
image.png

実際にコマンドプロンプトから送ってみると…

curl -X POST -H "Content-type: application/json" --data "{\"text\":\"Hello, World!\"}" https://hooks.slack.com/services/…
コマンドプロンプト slack
image.png image.png

ちゃんと通知できている事が確認できた!
後は、GitHub Actionsで実際にyamlを記載しパイプラインを実行すればOK!

参考文献

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0