0
0

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

Last updated at Posted at 2024-06-21

やりたかったこと

この記事のテーマの通り。
もう少し詳細をお話すると、以下のような感じ。

  • 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: ********* # 通知を出すチャンネルのチチャンネル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が作られる時のワークフローファイルにも手を加える必要があったりするので、それはプロジェクトに応じてよしなに対応する。

参考記事

0
0
0

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
  3. You can use dark theme
What you can do with signing up
0
0