やりたいこと
GitHubでリリースをPublishしたら、リリースノートをSlackに通知したい!
現状
- リリースはGitHubのリリース機能で実施
- published後のGitHub Actionsでデプロイを実施
- デプロイ開始とデプロイ終了は、GitHub ActionsからSlack投稿している
- リリースノートは手作業てSlack投稿している ※ここを自動化したい
内容
リリースノートはこんな感じで書いています。
リリースをPublishしたら、リリースノート(テキストエリアの内容)をSlackに投稿したいです。
リリースノートの内容を取得する
GitHubでリリースをpublishedしたとき、github.eventからテキストエリアの内容を取得します。
GitHub Actionsの設定
on:
release:
types:
- published
name: test published
jobs:
publish:
name: publish!!
runs-on: ubuntu-latest
steps:
- name: echo release note
run: |
echo "- github.event.release --------------------------"
echo ${{ github.event.release }}
echo "- github.event.release.html_url --------------------------"
echo "${{ github.event.release.html_url }}"
echo "- github.event.release.name --------------------------"
echo "${{ github.event.release.name }}"
echo "- github.event.release.tag_name --------------------------"
echo "${{ github.event.release.tag_name }}"
echo "- github.event.release.body --------------------------"
echo '${{ github.event.release.body }}'
echo "---------------------------"
release_body='${{ github.event.release.body }}'
release_body=${release_body//$'\r\n'/\\n}
release_body=${release_body//$'\n'/\\n}
echo "${release_body}"
echo "---------------------------"
echo "---------------------------"
実行結果
echoした内容が出力されていることが分かります。
${{ github.event.release.body }}
でリリースノートが取得できます。
Slack 通知する際に改行コードをエンコードしておく必要があるので、エンコードした結果を50行目に出力しています。
改行コードが\n
に統一されるのか、Windowsから入力した場合は\r\n
のままなのか判断できなかったので、両方ありうる想定で変換しています。
参考
github.event.release
で取得できる項目については、こちらの公式ドキュメントを参照ください。
https://docs.github.com/en/rest/reference/repos#releases
改行のエスケープはこちらを参考にさせていただきました。
https://blog.app.melvins-nest.com/posts/609127584/
https://qiita.com/chanhama/items/415a0a26bbb186efc47a
https://trstringer.com/github-actions-multiline-strings/
GitHub Actionsからslackへ通知する
Slack公式が提供しているGitHub Actionsがあるため、それを利用します。
今回は「chat.postMessage API」を選択しました。
GitHub Actionsの設定
payloadでは、改行を\n
と書くことでSlack上で改行されます。
また```で囲むことでSlackではコードブロック表示にできます。
URL展開させたくなかったので"unfurl_links": false
の設定をしています。
on:
release:
types:
- published
name: Release published
jobs:
publish:
name: notification to slack
runs-on: ubuntu-latest
steps:
- id: get_release_note
name: echo release note
run: |
# 改行コードをエスケープする
release_body='${{ github.event.release.body }}'
release_body=${release_body//$'\r\n'/\\n}
release_body=${release_body//$'\n'/\\n}
echo "::set-output name=body::$release_body"
# Start a Slack workflow using a webhook trigger
# https://github.com/slackapi/slack-github-action
- name: Send GitHub Action trigger data to Slack workflow
id: slack_notification
uses: slackapi/slack-github-action@v1.16.0
with:
channel-id: 'CBBSQJPSA'
payload: |
{
"text": ":writing_hand: ビルド結果: ${{ job.status }}\n${{ github.event.release.html_url }}\n```${{ steps.get_release_note.outputs.body }}```",
"unfurl_links": false
}
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
実行結果
リリースはこんな感じで、GitHubでよくやる書式を入力して試しています。
無事、やりかったことができました
参考
Slack Actionsで指定できる書式や項目については公式ドキュメントなどを参照ください。
https://api.slack.com/methods/chat.postMessage
https://spinners.work/posts/github-actions-context/
感想
GitHub Aciontsのgithub.event
でとれる項目の定義を探すところ、Bashで改行コードをエスケープするところの2つが手間取りました。
GitHub ActionsもSlack APIも活用できるといろいろ便利そうなので、また何かやってみたいと思います。