🐙

プルリクを自動でマージする GitHub Actions ワークフロー

2022/10/06に公開

例えば 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.titlegithub.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 権限を持つユーザのトークンの用意や、テスト等が通過したかの判定が必要になってくる。

参考にさせていただいたもの

Discussion