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

More than 1 year has passed since last update.

posted at

updated at

GitHub ActionsでSlack通知をcurlで

はじめに

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!

参考文献

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
What you can do with signing up
0
Help us understand the problem. What are the problem?