🎉

GitHub Actions から PR を自動で作成してテストが通ったらマージしたい

2024/01/15に公開

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 を実行可能 ← 解決

コード

update-syllabus.yml
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 }}
review-pr.yml
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 }}
脚注
  1. 「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 ↩︎

  2. 「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