GitHub ActionsでリリースノートをSlack投稿する

# やりたいこと
GitHubでリリースをPublishしたら、リリースノートをSlackに通知したい！

## 現状
- リリースはGitHubのリリース機能で実施
  - published後のGitHub Actionsでデプロイを実施
  - デプロイ開始とデプロイ終了は、GitHub ActionsからSlack投稿している
- リリースノートは手作業てSlack投稿している ※ここを自動化したい

# 内容
リリースノートはこんな感じで書いています。
リリースをPublishしたら、リリースノート(テキストエリアの内容)をSlackに投稿したいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/8027cc25-9dac-65ed-ef69-0c197d352df9.png)

## リリースノートの内容を取得する
GitHubでリリースをpublishedしたとき、github.eventからテキストエリアの内容を取得します。

### GitHub Actionsの設定

```published.yml
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 }}`でリリースノートが取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/af8c81fc-85b0-46bb-d0b9-2b13a74bb048.png)

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」を選択しました。

https://qiita.com/seratch/items/28d09eacada09134c96c

### GitHub Actionsの設定
payloadでは、改行を`\n`と書くことでSlack上で改行されます。
また```で囲むことでSlackではコードブロック表示にできます。

URL展開させたくなかったので`"unfurl_links": false`の設定をしています。

```published.yml
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でよくやる書式を入力して試しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/1abc86e3-a44c-d14e-1ad7-064b59955d2d.png)

Slack投稿結果はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/439293b2-9b87-38f5-70d5-00462fed3646.png)

無事、やりかったことができました :ok_woman_tone1: 

### 参考
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も活用できるといろいろ便利そうなので、また何かやってみたいと思います。