GithubActionsを使ってPRのLabelをフックしてSlackに通知を送る

# 解決したいこと

PRによって「今すぐマージしたいからはやく見てくれ！！」という切羽詰まったものから「来週のリリースまでに入ればいいからお手隙で確認してね」みたいなものまで、緊急性に幅があると思います。
緊急性が高い場合は開発メンバーにレビューを依頼する必要がありますよね。

けど、Reviewer設定したあとにわざわざメンション飛ばすのも面倒なので自動化したい！と思ったのでやってみました。

# やったこと

緊急性に応じてLabelを作成（今回は”緊急”,”お手隙で”の2つ）

![スクリーンショット 2023-11-03 午前3.26.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919633/6aa26fac-d169-2865-51c8-84dfb0b7bb55.png)


PRに特定のLabelを割り当てるとSlackにメンション付きのメッセージが飛ぶ

![スクリーンショット 2023-11-03 午前3.53.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919633/037e036f-306f-947f-bfdd-c093b48e8c2f.png)


以上です！

# 実装

### Labelを作成

Labelの粒度,どこまで通知するかはプロジェクトと相談
日本語と絵文字も使えました

![スクリーンショット 2023-11-03 午前4.00.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919633/b475229e-26c9-58ae-245c-7026135b93ef.png)

### SlackのWebhookをリポジトリに紐づける

~~Incoming WebhookというアプリをSlackの管理画面から追加します。~~
[追記]
****インテグレーションは非推奨****なのでSlackAppを使用してIncoming　Webhookを利用する
https://qiita.com/Akira07/items/890fbbc6c384fcf875d0


 情報を追加したら設定を保存
Webhook URLをコピーしておく

![スクリーンショット 2023-11-03 午前4.10.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919633/942a1956-330d-9b9d-85dd-8e793168770a.png)

Actionを追加するリポジトリのSettings > Secrets and variables > Actionsに移動

New repository secretを押して作成

![スクリーンショット 2023-11-03 午前4.16.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919633/bc5f1564-27d6-9cdd-db2f-b58803eb83fc.png)


Nameは任意

Secretは先ほどコピーしたURL

![スクリーンショット 2023-11-03 午前4.16.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919633/24c1a26c-8b8f-3a44-1c02-80860fdea0b0.png)


### workflowを追加

*リポジトリ/.github/workflows/* 以下に下記のymlファイルを追加
上記のフォルダがない場合は作成してください

```yaml
name: Notify Slack with Mention

on:
  pull_request:
    types:
      - labeled

jobs:
  notify_slack:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v2

      - name: Notify Slack
        if: |
          (
            (github.event.action == 'labeled' && github.event.label.name == '緊急🔥')
            ||
            (github.event.action == 'synchronize' && contains(github.event.pull_request.labels.*.name, '緊急🔥'))
          )
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
          SLACK_MENTION: "<!channel>"  # メンションを追加
        run: |
          label_name="${{ github.event.label.name }}"
          pr_number="${{ github.event.number }}"
          pr_url="${{ github.event.pull_request.html_url }}"
          channel="#github_pr"  # チャンネル名を指定
          message="ラベルの種類: $label_name\nPR: $pr_url $SLACK_MENTION"  # メンションをメッセージに追加
          curl -X POST -H 'Content-type: application/json' --data "{'text':'$message', 'channel':'$channel'}" $SLACK_WEBHOOK_URL
```

```yaml
(github.event.action == 'labeled' && github.event.label.name == '緊急🔥')
||
(github.event.action == 'synchronize' && contains(github.event.pull_request.labels.*.name, '緊急🔥'))
```

ここで特定のLabelが新しく貼られたか更新されたPRを検知します

```yaml
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
SLACK_MENTION: "<!channel>"  # メンションを追加
```

secrets.SLACK_WEBHOOKは先ほど作ったSecretの文字列
メンションする場合は”@channel”ではなくこのフォーマットを使用

あとはSlackに必要な情報をPostしているだけです

# 実行確認

指定したLabel付きのPRを作成 or 既存のPRに付与するとworkflowが開始
エラーなどで失敗した場合はActionsタブから詳細が確認できます

![スクリーンショット 2023-11-03 午前4.37.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919633/febc5a59-75a9-068f-2b35-532415db7b77.png)


Slackにも通知が飛んでいますね！

![スクリーンショット 2023-11-03 午前4.38.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919633/6cefb934-0eaf-d55d-a899-c84e7652ab52.png)


# 参考

https://tech.actindi.net/2021/01/08/083000

https://docs.github.com/ja/actions/managing-issues-and-pull-requests/commenting-on-an-issue-when-a-label-is-added

https://zenn.dev/wakkunn/articles/c6978bd2b5ca55