GitHub ActionsでCheckが通ったらDraft PRを自動でopenにしたかった
背景
最初はDraftでPRを出して、Ckeckが通ったら手動でReady for review
をポチっていたのですが、いちいち通るのを待ってからやるのが面倒だったので、自動でopenにしてくれる方法について、検討を加速しました。
コード
結論、こんな感じのワークフローを書きました。
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 comment
でnot 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にします。
参考
Discussion