プルリク概要のチェックボックスにチェックがされたらSlackに通知をする方法【GitHub Actions】

## やりたかったこと
この記事のテーマの通り。
もう少し詳細をお話すると、以下のような感じ。
- developブランチでマージされるとリリースPRが作成され、マージされたプルリクがチェック項目としてリリースPRの概要欄に表示される。
- developにマージした人は、動作確認後に問題なければチェックする。
- 全てチェックが入ったらリリースはOKとなる。→リリース担当者に通知！

ざっくりとこんな感じ。

## 実際のワークフローファイル
``` .github/workflows/notify_check_release.yml
name: notify_check_release

on:
  pull_request:
    branches:
      - master
    types: [edited]
    # master向けのPR ＝ リリースPR　　　　の　内容に変更があったときにこのワークフローは動く
permissions:
  id-token: write
  contents: read
  pull-requests: write
　　　
env:
  SLACK_WEBHOOK: ## ここには通知を投稿したいSlackチャンネルのWebhookURLを記載する

jobs:
  notify_check_release:
  runs-on: ubuntu-latest
  steps:
  - uses: actions/checkout@v4
    with:
      fetch-depth: 0
      sparse-checkout-cone-mode: false
      sparse-checkout: ## どのディレクトリ配下をチェックアウトするか記載する

  - name: Setup jq
    run: sudo apt-get install jq

  - name: Check release PR
    id: check_release_pr ## idを使ってjobを跨いだデータの受け渡しをする
    run: | 
      PR_URL=$(jq -r '.pull_request.html_url' "$GITHUB_EVENT_PATH")
      PR_NUMBER=$(basename $PR_URL)
      LABELS=$(gh pr view $PR_NAUMBER --json labels -q '.labels[].name')
      if [[ $LABELS == *"ReleasePR"* ]]; then
        echo "これはReleasePRだよ！"
        echo "::set-output name=is_release_pr::true"
      else
        echo "これはReleasePRではない！"
        echo "::set-output name=is_release_pr::false"
      fi
    env:
      GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}

  - name: Check for checklist completion
    id: check_chekclist
    run: |
      PR_URL=$(jq -r '.pull_request.html_url' "$GITHUB_EVENT_PATH")
      PR_NUMBER=$(basename $PR_URL)
      CHECKLIST=$(gh pr view $PR_NUMBER --json body -q '.body' | grep -o '\- \[.\]' || true)
      TOTAL_ITEMS=$(echo "$CHECKLIST" | wc -l)
      CHECKED_ITEM=$(echo "$CHECKLIST" | grep -c '\- \[x\]')
      if  [[ $CHECKED_ITEM == $TOTAL_ITEMS ]]; then
        echo "全部チェックされている"
        echo "::set-output name=all_cehcked::true"
      else
        echo "まだ全部チェックされていない"
        echo "::set-output name=all_cehcked::false"
      fi
    env:
      GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  - name: Send slack notification
    if: steps.check_release_pr.outputs.is_release_pr == 'true' && steps.check_list.outputs.all_checked == 'true'
    uses: rtCamp/action-slack-notify@v2
    env:
      SLACK_WEBHOOK: ${{ env.SLACK_WEBHOOK }}
      SLACK_CHANNEL: ********* # 通知を出すSlackチャンネルのチャンネルID
      SLACK_TITLE: 'Release OKになりましたよ！'
      SLACK_MESSAGE: |-
        すべてのチェックが完了しました。
        @gorira.takeshi　
        <${{ github.event.pull_request.html_url }}|${{ github.event.pull_request.title }}>
      SLACK_LINK_NAMES: true ## ここをtrueにしないとSLACK_MESSGE内でメンションができないっぽい
      MSG_MINIMAL: true ## ここをtrueにしないとSLACK_MESSAGE以外の不要な情報も表示される
```

すこし長いがこんな感じ。やっていることとしてはざっくり以下。
- jqをインストール
- リリースPRなのかどうかを確認する
    - リリースPRかどうかはリリースPRが作成されるタイミングでreleasePRというラベルが付与されるように他のワークフローで設定している
- プルリクの概要欄からチェックボックスを取得
- チェックボックスが何個存在するのかを確認
- そのチェックボックスでチェック済みの数を取得
- チェックボックスの数とチェック済みの数が等しいかを確認
- リリースPRであること　かつ チェックボックスの数とチェック済みの数が等しい場合にSend slack notificationのstepを実行
- 設定しているslackチャンネル宛に通知を出す

こんな感じ。


### 補足
実際にはリリースPRのテンプレートの内容やリリースPRが作られる時のワークフローファイルにも手を加える必要があったりするので、それはプロジェクトに応じてよしなに対応する。

## 参考記事
https://qiita.com/SuyamaDaichi/items/c4dcd92d0ca360d9271d

https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af

https://www.ibm.com/docs/ja/aix/7.1?topic=b-basename-command

https://zenn.dev/snowcait/articles/0e430af5fb1e50