最近知ったのですが、
pull request(以下pr)の作成者自身は、prをapproveできません。
Pull request authors cannot approve their own pull requests
引用元:Approving a pull request with required reviews
また、 Branch Protection の「Require pull request reviews before merging > Require approvals」を設定した場合、 pr のmergeには指定個数以上のapproveが必要となります。
つまり、 個人開発等において、自分自身しかレビュワーが存在しない場合、 「Require approvals」を設定すると、approveが付けられないために、prをマージできない、と言うことになります。
とはいえ、
個人開発において 「Require approvals」を設定してブランチ保護したいケース(Renovate でライブラリの更新を安全に自動化する場合など)が多々あるので、解決策を調査しました。 今回はそちらのまとめになります。
結論
「Github ActionsでGithub CLIを使って自動でapproveする!!」
内容
問題を再現してみる
ひとまず、以下の問題を再現してみます。
自分自身しかレビュワーが存在しない場合、 「Require approvals」を設定すると、approveが付けられないために、prをマージできない
- Branch Protectionを設定
Repository > Setting > Branches > Add ruleから、「Require approvals」を設定します。
保護対象のブランチ名をprotect_test
として、
「Require approvals」をチェックして、必要なapproveの個数は1にしました。
続いて、保護対象のブランチに対してprをapproveしようとすると…
上記の通り、
Approve
ボタンがクリックできないようになっています。
問題を解決する
結論に記載した通り、
「Github ActionsでGithub CLIを使って自動でapproveする!!」
こちらの方法で上記問題の解決を試みます。
必要な作業は以下の3点です。
- approve用のGithub Actionsのworkflowファイルを作成
- Repository のsetting で、workflow permissionを設定
ひとまず、一通り対応してみます。
1. approve用のGithub Actionsのworkflowファイルを作成
- .github/workflows/auto-merge.yml
name: auto-approve
on:
pull_request:
types:
- synchronize # prにcommit がpushされた時
- opened # prがopenされた時
- ready_for_review # draft → prに変更された時
- reopened # closeされたprが再度openした時
permissions:
pull-requests: write
contents: write
jobs:
auto-merge:
runs-on: ubuntu-latest
env:
PR_URL: ${{github.event.pull_request.html_url}}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- name: Checkout
uses: actions/checkout@v4
# prをapproveする
- name: Approve PR
run: gh pr review "$PR_URL" --approve
詳細はworkflowファイル中にコメントしていますが、
肝は以下です。
env:
PR_URL: ${{github.event.pull_request.html_url}}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- name: Checkout
uses: actions/checkout@v4
# prをapproveする
- name: Approve PR
run: gh pr review "$PR_URL" --approve
PR_URL
には、prのurlが入ります。
Github CLIの詳細は、こちらを見れば分かるかと思います。
公式:gh pr review
workflowの実行ログを先出すると、以下のような感じ。
2. Repository のsetting で、workflow permissionを設定
Repository > setting > Actions > General > Workflow Permissionsにて、以下を設定します。
- Read and write permissions
- Allow GitHub Actions to create and approve pull requests
これを設定しないと、
Github Actions からprをapproveする権限が付与されないので、前述のworkflowが以下のように失敗します。
以上で必要な作業は完了です。
実際に動作を確認してみます。
動作確認してみる
prを作成してみると、以下の通りgithub actionsによるapproveに成功しました!!!
- 前述のBranch Protectionを設定したブランチ(
protect_test
)に対するprで、 - author「
github-actions
」によってprがapproveされて、 - 「Merge pull request」がクリック可能な状態になっている!
以上、問題解決ですー!!!
まとめ
今回の内容は、
「Renovateを使って、安全にライブラリの更新を自動化したい」ということに端を発しています。
その中で、冒頭に記載した通り、 「個人開発だとそもそも自分でprをapproveできないじゃん!!!どうやってブランチ保護導入しよう…」
という課題があったので解決するために、色々やってみましたが、
本当はもっと他のやり方もある気がしています。
とは言ったものの、
今回個人的に初めてGithub CLIに触れることができたので、それは大きな収穫だったかな、と思っています。
もっとGithub CLIやGithub Action workflowをいい感じに使えるようになりたいー。
コメント