GitHub Actions から PR を自動で作成してテストが通ったらマージしたい
TL;DR
Branch protection rules として「PR のマージ前に code owner からのレビューを必須」に設定しているリポジトリを想定します。このリポジトリにて GitHub Actions から PR を作成し、テスト通過後に自動でマージしたい場合に、以下の手順を踏むと上手く作動しました。
- ワークフローから以下の操作を実行する
- GitHub Actions として PR を作成する
- PAT(Personal Access Token)を介して、code owner として auto-merge を有効にする
- 作成した PR に code owner としてラベルを付与する
-
labeled
をトリガとする別のワークフローから、code owner として当該 PR を approve する
経緯
我々が運用するシラバスのミラーサイト(KdB もどき)では、GitHub Actions を介して定期的に大学の公式システムからシラバスを取得しています。ところが上述の Branch protection rule を設けてからワークフローが上手く作動しなくなり、レビュアが手動で毎回マージしないと PR が無限に山積する状態に陥っていました。
以下、試行錯誤の過程です。
- Actions から PR を作成してみる
- テストを通してからマージしたいので、auto-merge を有効にする
- マージに際しては code-owner からレビューが必須なため、bot から review すればそのままマージされるのでは?
- レビューには code-owner の権限が必要なので PAT 経由でレビュー
- Actions による open はトリガにできない[1]ので、PAT 経由で PR を作成
- 自分自身で作成した PR はレビューできない[2]ことが判明
- PR の作成は Actions 名義で行い、PAT 経由でラベルを付与することで workflow を実行可能 ← 解決
コード
name: CSV scheduled update
on:
schedule:
- cron: '0 15 * * *'
workflow_dispatch:
jobs:
update:
environment: actions
runs-on: ubuntu-latest
permissions: write-all
steps:
- name: Checkout
uses: actions/checkout@v4
- (省略)
- name: Create Pull Request
id: cpr
uses: peter-evans/create-pull-request@v5
with:
title: Sceduled update of syllabus data (${{ steps.date.outputs.date }})
branch: update_${{ steps.date.outputs.date }}
author: GitHub Action <action@github.com>
committer: GitHub Action <action@github.com>
commit-message: |
update csv: ${{ steps.date.outputs.date }}
- name: Enable auto-merge
uses: peter-evans/enable-pull-request-automerge@v3
with:
pull-request-number: ${{ steps.cpr.outputs.pull-request-number }}
token: ${{ secrets.GH_ADMIN_TOKEN }}
- name: Add label
run: gh pr edit ${{ steps.cpr.outputs.pull-request-number }} --add-label automated-pr
env:
GH_TOKEN: ${{ secrets.GH_ADMIN_TOKEN }}
name: Review PR to update syllabus
on:
pull_request:
types:
- labeled
jobs:
review:
environment: actions
runs-on: ubuntu-latest
permissions:
pull-requests: write
if: >-
github.event.label.name == 'automated-pr' &&
github.event.pull_request.user.login == 'github-actions[bot]'
steps:
- name: Review
uses: hmarr/auto-approve-action@v3
with:
github-token: ${{ secrets.GH_ADMIN_TOKEN }}
-
「GITHUB_TOKEN を使用してタスクを実行する場合、GITHUB_TOKEN によって workflow_dispatch トリガーされるイベント(例外)と repository_dispatch は新しいワークフロー実行を作成しません」
https://docs.github.com/ja/actions/using-workflows/triggering-a-workflow#triggering-a-workflow-from-a-workflow ↩︎ -
「Pull Request の作者は、自分自身の Pull Request を承認することはできません」
https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/approving-a-pull-request-with-required-reviews ↩︎
Discussion