プルリクエストを自動でマージする GitHub Actions を作って遊んだ

GitHub Actions で遊んでみようと思って、プルリクエストを自動でマージするものを作ってみた。

動いた

最終的に思ったとおりに動いて喜んだ。

コードはここ

https://github.com/bufferings/hello-pr-auto-merge

仕組み

↓こういう設定をしておいて

  • ブランチプロテクションで main ブランチへのプルリクエストには Approval が必要な設定にする
  • GitHub の Auto Merge という機能が使えるようにする
  • GitHub Actions に対してプルリクエストの操作を許可する

↓こういう流れになる

  1. プルリクエストがオープンされると GitHub Actions が動いて
    1. そのプルリクエストを Approve して
    2. Auto Merge をオンにする
  2. そうすると Approval の条件を満たすので Auto Merge によってプルリクエストがマージされる

設定ファイル

単にマージするだけじゃなくて、ちょっと何かの条件を入れてみようかなと思って「変更されたのが README.md だけだったら」自動でマージされるようにしといた。

name: auto-merge-readme

on:
  pull_request:
    branches: [ main ]
    types: [ opened ]

permissions:
  pull-requests: write
  contents: write

jobs:
  auto-merge:
    runs-on: ubuntu-latest
    if: github.event.pull_request.user.login == 'bufferings'
    env:
      PR_URL: ${{github.event.pull_request.html_url}}
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    steps:
      - name: Checkout repository with preceding commits
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Check if only README.md is updated
        run: |
          git diff --name-only "origin/main" HEAD | tee /tmp/diffs
          if [ "$(wc -l < /tmp/diffs)" -eq "$(grep -c "^README.md$" /tmp/diffs)" ]; then
            echo 'ONLY_README=yes' | tee -a "$GITHUB_ENV"
          else
            echo 'ONLY_README=no' | tee -a "$GITHUB_ENV"
          fi

      - name: Approve PR
        if: env.ONLY_README == 'yes'
        run: gh pr review "$PR_URL" --approve

      - name: Enable auto-merge
        if: env.ONLY_README == 'yes'
        run: gh pr merge --merge --auto "$PR_URL"

参考にした記事

こちらを参考にして作りました。ありがとうございます!

おもしろかった。