プルリクを自動でマージする GitHub Actions ワークフロー
例えば Renovate のようにボットが作ったプルリクエストの場合は、CI でテストや静的解析が成功したら自動的にマージしてしまいたい、というケースはよくある。それを実現するには、テスト等を実行するステップの後に、次のようなステップを用意する。
- if: |
contains(github.event.pull_request.labels.*.name, 'hoge') &&
!github.event.pull_request.draft
env:
GH_REPO: ${{ github.repository }} # コードをチェックアウト済みであればこれは不要
GH_TOKEN: ${{ github.token }}
run: gh pr merge ${{ github.event.number }} --auto --merge
gh
CLI で --auto
を指定することにより、リポジトリのブランチ保護の設定で CI の通過をマージ可の条件としている場合でも、CI の完了後に自動でマージされる挙動となる。
上記のステップでは実行条件(if:
)として、特定のラベル(今回はボットが hoge
ラベルを付与するものとする)が付与されており、且つ、プルリクが draft 状態でない(gh
CLI でエラーとなる為)という条件を指定しているが、このあたりの条件はボット等が作成するプルリクの要件に応じて変更されたし。プルリクのタイトルや説明文の文字列で判定するならば github.event.pull_request.title
や github.event.pull_request.body
が使える。
また上記のステップでは GH_TOKEN
に、デフォルトで利用できる github-actions
ユーザーのトークンを指定しているが、このように github-actions
ユーザのトークンを利用してマージすると、このマージを契機とした別のワークフローを動作させることができない(無限ループを防止する為の GitHub の仕様だと思われる)ので、もしマージを契機とした別のワークフローを動かしたい場合は、別のトークン(個人の personal access token や GitHub Apps のトークン)を用意する必要がある。
自動で Approve もさせる場合
ブランチ保護の設定で、マージ可の条件としてレビュアによる Approve を指定していることはよくある。その場合はプルリクは Approve 待ちとなってしまうので、そのような場合は次のように Approve も自動化すればよい。
run: |
gh pr review ${{ github.event.number }} --approve # 追記
gh pr merge ${{ github.event.number }} --auto --merge
ただ2人以上の Approve を必要としている場合はこの方法は使えない。gh
CLI で --admin
オプションを利用することで強制的にマージすることも可能そうではある(参考: gh pr merge)が、その場合は admin 権限を持つユーザのトークンの用意や、テスト等が通過したかの判定が必要になってくる。
参考にさせていただいたもの
-
dependabot/fetch-metadata の README
- GitHub CLI の利用例が書いてある
Discussion