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ブランチに対するプルリクエストが作成された際に以下の処理を自動実行できます。
- プルリクエストに適切なブランチへのプルリクエスト作成を促すコメントを追加
- プルリクエストを自動的にクローズ
mainに対してプルリクエストが作成された場合、以下のようになります。
設定方法
リポジトリの.github/workflows/
ディレクトリに以下のファイルを作成します。
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