🚫

GitHub Actionsでmainブランチへのプルリクエストを自動クローズする方法

に公開

この記事は

GitHubでmainブランチに対するプルリクエストが来た際に、メッセージを投稿して自動的にクローズする方法です。

Git Flowやそれに類するブランチ戦略を採用しているプロジェクトでは、機能追加やバグ修正はdevelopブランチに対して行う必要があります。しかし、コントリビューターが間違ってmainブランチにプルリクエストを送ってくることがあり、そうした場合にGithub Actionsで自動的に対応する方法を紹介します。

背景

私はRedmineのプラグイン開発で A Successful Git Branching Model(Git Flowと呼ばれることが多い) を使っています。
機能追加やバグ修正はdevelopブランチに行う必要があります。

ありがたいことに多くの人が私のプロジェクトにプルリクエストを送ってくれます。しかし、中にはdevelopブランチではなくmainブランチに対するプルリクエストを送ってくる人もいます。(READMEに書いても、全員が読むとは限らないのは仕方がないことです)

今までは、私がその都度、プルリクエスト画面でbaseブランチをdevelopに自分で変更していました。
しかし、たまに気付かずにmainブランチにマージしてしまうことがあります。

そこで、mainブランチに対するプルリクエストが来た際に、自動でメッセージを書いてクローズするように設定しました。

Git Flowでのブランチ戦略

git flowではは以下のようなブランチ構造になっています

  • mainブランチ: テストが完了し、リリースされた安定版ブランチ
  • developブランチ: 開発中の機能を統合するブランチ
  • feature/*ブランチ: 個別の機能開発用ブランチ
  • bugfix/*ブランチ: バグ修正用ブランチ
  • release/*ブランチ: リリース準備用ブランチ
  • hotfix/*ブランチ: 本番環境の緊急修正用ブランチ

各コントリビューターがforkしたリポジトリ上で個別の修正をfeature/やbugfix/の下で行うかどうかは任意ですが、少なくともプルリクエストはdevelopブランチに対して実施してもらう必要があります。

GitHub Actionsによる自動化

ワークフローの概要

GitHub Actionsを使用することで、mainブランチに対するプルリクエストが作成された際に以下の処理を自動実行できます。

  1. プルリクエストに適切なブランチへのプルリクエスト作成を促すコメントを追加
  2. プルリクエストを自動的にクローズ

mainに対してプルリクエストが作成された場合、以下のようになります。

自動クローズ

設定方法

リポジトリの.github/workflows/ディレクトリに以下のファイルを作成します。

prevent-main-pr.yml
name: Prevent Direct Pull Requests to Main

on:
  pull_request_target:
    types: [opened]
    branches:
      - main

permissions:
  pull-requests: write
  issues: write

jobs:
  prevent-main-pr:
    runs-on: ubuntu-latest
    steps:
      - name: Comment and close PR
        uses: actions/github-script@v7
        with:
          script: |
            const message = "## ⚠️ Direct pull requests to main branch are not allowed. Please create a pull request to the develop branch instead.";

            // Add comment
            await github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: message
            });

            // Close the PR
            await github.rest.pulls.update({
              owner: context.repo.owner,
              repo: context.repo.repo,
              pull_number: context.issue.number,
              state: 'closed'
            });

            console.log('PR has been commented and closed automatically');

ワークフローの中身

トリガー設定

on:
  pull_request_target:
    types: [opened]
    branches:
      - main

この設定により、mainブランチに対してプルリクエストが作成(opened)された際にワークフローが実行されます。

pull_request_targetイベントを使用することで、フォークされたリポジトリからのプルリクエストでも動作します。

権限設定

permissions:
  pull-requests: write
  issues: write

プルリクエストにコメントを追加し、プルリクエストをクローズするために必要な権限を設定しています。

GitHub Script アクション

uses: actions/github-script@v7

GitHub Scriptアクションを使用することで、JavaScriptでGitHub APIを直接操作できます。

追加のアクション

プルリクエストのクローズに加えて、以下のような処理を追加することもできます。

// ラベルの追加
await github.rest.issues.addLabels({
  issue_number: context.issue.number,
  owner: context.repo.owner,
  repo: context.repo.repo,
  labels: ['invalid-target-branch']
});


セキュリティ上の注意点

pull_request_target の使用

pull_request_targetイベントは強力な権限を持つため、セキュリティに注意が必要です。

  • フォークからのプルリクエストでもワークフローが実行される
  • リポジトリのシークレットにアクセス可能
  • 悪意のあるコードが実行される可能性がある

今回のワークフローでは外部のコードを実行していませんが、他の処理を追加する際は注意してください。

最小権限の原則

権限は必要最小限に設定することが重要です。

permissions:
  pull-requests: write  # プルリクエストの操作に必要
  issues: write        # コメント追加に必要

不要な権限は付与しないようにしましょう。

まとめ

GitHub Actionsを使用してmainブランチへの直接プルリクエストを自動クローズする方法について解説しました。

この自動化により以下のメリットが得られました。

  • 作業効率の向上: 手動でのブランチ変更作業が不要
  • エラー防止: 見落としによる誤マージを防止
  • ワークフロー遵守: コントリュビューターへの案内が自動化され、適切なブランチ戦略が周知された

Git Flowを使っている方はぜひ試してみてください。

Discussion