📖

GitHub ActionsでCheckが通ったらDraft PRを自動でopenにしたかった

2024/08/02に公開

背景

最初はDraftでPRを出して、Ckeckが通ったら手動でReady for reviewをポチっていたのですが、いちいち通るのを待ってからやるのが面倒だったので、自動でopenにしてくれる方法について、検討を加速しました。

コード

結論、こんな感じのワークフローを書きました。

.github/workflows/ready-sample.yml
on:
  pull_request:

name: ci

jobs:
  test:
  # ここでテストを実行
  # 省略

+  # Draft PRを自動でopenにする
+  ready-pr-auto:
+    name: ready-pr-auto
+    needs: test
+    runs-on: ubuntu-latest
+    env:
+      GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
+    timeout-minutes: 5
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Check comment
+        run: |
+          echo "PR_OPEN_FLG=$(gh pr view -c "${GITHUB_HEAD_REF}" --json comments | jq .comments[].body | grep -x -c '"pr open off"')" >> $GITHUB_ENV
+
+      - name: Ready pr auto
+        if: ${{ env.PR_OPEN_FLG == '0' }}
+        run: gh pr ready "${GITHUB_HEAD_REF}"

解説

needs: test

これは単純に前工程の依存jobを設定します。testが完了してからready-pr-autoが起動するようにします。

uses: actions/checkout@v4

これも単純にcheckoutしているだけなのですが、なぜcheckoutするのかというとCheck commentnot a git repositoryとなってしまうためです。

echo "PR_OPEN_FLG=$(gh pr view -c "${GITHUB_HEAD_REF}" --json comments | jq .comments[].body | grep -x -c '"pr open off"')" >> $GITHUB_ENV

例えばCIが通ってもDraftのママにしておきたい、という場合のためのものになります。(ちょっと実装の方針あるかみてほしいよってときあるよね)
なので、なくてもダイジョウブ。

PRにpr open offというコメントがある場合は、自動でPRをopenにしないようにするための設定です。

gh pr view -c "${GITHUB_HEAD_REF}" --json comments | jq .comments[].bodyでPRのコメントの内容を取得します。

grep -xは完全一致するものだけ取得するようにします。manコマンドで説明を見てみると↓

Only input lines selected against an entire fixed string or regular expression are considered to be matching lines.

grep -cで一致する件数を取得します。manコマンドで説明を見てみると↓

Only a count of selected lines is written to standard output.

なので、ここではPRのコメントのpr open offの数をPR_OPEN_FLGとして保存します。

(件数を保存するんじゃなくて、もう少し良い書き方がある気がするけども。。。)

if: ${{ env.PR_OPEN_FLG == '0' }}

PR_OPEN_FLGが0、の場合のみ実行します。

gh pr ready "${GITHUB_HEAD_REF}"

ここでPRをopenにします。

参考

https://cli.github.com/manual/gh_pr_view

株式会社ゆめみ

Discussion