やりたかったこと
この記事のテーマの通り。
もう少し詳細をお話すると、以下のような感じ。
- 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が作られる時のワークフローファイルにも手を加える必要があったりするので、それはプロジェクトに応じてよしなに対応する。
参考記事