怒らせて防ぐ?!GitHub Actionsで雑なPRタイトル防止
「fix」「update」「WIP」だけのPRタイトルが並んでいるリポジトリを見たことはないでしょうか?
あとから履歴を追うときに、何を直したPRなのか本文まで開かないと分からず、地味にレビューコストが上がります。
これはレビュアーが毎回指摘するよりも、CIに機械的にチェックさせたほうが早く解決します。
この記事では、PRタイトルが feat: や fix: のようなConventional Commits形式になっていない場合、CIを落として気づかせる仕組みを作ります。
本記事はamannn/action-semantic-pull-request公式リポジトリ(GitHub - amannn/action-semantic-pull-request)をもとに、2026年9月時点で最新のv6系(v6.1.1、2025年8月リリース)を基準にしています。
Conventional Commitsとは
feat: add login button や fix: correct typo in header のように、先頭に変更の種類を表すラベルを付けてコミットメッセージやPRタイトルを書く規約です。
代表的なラベルは以下のとおりです。
| ラベル | 意味 |
|---|---|
feat |
新機能の追加 |
fix |
バグ修正 |
docs |
ドキュメントのみの変更 |
refactor |
挙動を変えないコードの整理 |
chore |
ビルドや設定など雑務的な変更 |
破壊的変更を含む場合は feat!: のように ! を付けて表現します。
PRタイトルは1行しか書けないため、コミットメッセージ本文で使う BREAKING CHANGE: の代わりにこの ! を使う点は覚えておいてください。
この規約に沿ってPRタイトルを書いておくと、あとから semantic-release のようなツールでバージョン番号やリリースノートを自動生成しやすくなるという実務的なメリットもあります。
ワークフローを作る
.github/workflows/pr-title-lint.yml として、次の内容を作成します。
name: Lint PR Title
on:
pull_request_target:
types:
- opened
- reopened
- edited
permissions:
pull-requests: read
jobs:
main:
name: Validate PR title
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
これだけで、PRのタイトルがConventional Commitsの形式に沿っていない場合、このジョブが失敗しチェック欄に赤いバツが付き怒られるようになります。
トリガーに pull_request ではなく pull_request_target を使っているのは、PRのタイトルというメタデータだけをチェックする処理では、フォークからのPRに対しても安定してシークレットやトークンを扱えるようにするためです。
公式リポジトリのサンプルもこの形になっています。
pull_request_target はベースリポジトリの権限でワークフローが実行されるため、PR側のコードをチェックアウトして実行するような使い方をすると、外部からの悪意あるコードが権限を持った状態で動いてしまう危険があります。今回のようにPRタイトルの文字列だけをチェックする用途に留め、checkout でPRのコードを取り込む処理は追加しないよう注意してください。
許可するタイプを制限する
デフォルトでは feat fix docs などConventional Commits標準の型が広く許可されていますが、チームで使う型を絞りたい場合は types を指定します。
- uses: amannn/action-semantic-pull-request@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
types: |
feat
fix
docs
refactor
chore
指定した型以外がPRタイトルの先頭に付いている場合、チェックが失敗するようになります。チームのルールに合わせて増減させてください。
一部のPRだけ対象外にする
リリース用の自動生成PRや、Botが作成するPRまでチェック対象にすると邪魔になることがあります。特定のラベルが付いているPRを対象外にしたい場合は、ignoreLabels を使います。
- uses: amannn/action-semantic-pull-request@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
ignoreLabels: |
bot
ignore-semantic-pull-request
指定したラベルのいずれかが付いているPRは、タイトルの中身に関わらずチェックがスキップされます。
Node.js 20の廃止に注意する
2026年9月時点で、GitHub ActionsのランナーはNode.js 20で動くアクションを段階的に廃止しています。
GitHub側の告知によると、2026年6月16日以降はNode.js 24がデフォルトで使われるようになり、2026年9月16日にはランナーからNode.js 20自体が削除される予定です。
amannn/action-semantic-pull-request の古いメジャーバージョン(v5系など)を固定して使っている場合、この廃止の影響を受ける可能性があります。今回紹介した @v6 のように、できるだけ新しいメジャーバージョンを指定しておくことをおすすめします。
まとめ
- PRタイトルのルールをレビュアーの目視に頼らず、CIで機械的にチェックできる
-
amannn/action-semantic-pull-request@v6を使えば、ワークフローファイル1つで導入できる -
typesで許可する型を絞ったり、ignoreLabelsで特定のPRを除外したりと細かい調整もできる -
pull_request_targetを使う際は、PRのコードをチェックアウトしないなど権限まわりの注意が必要 - Node.js 20の廃止スケジュールが迫っているため、アクションのバージョンは古いまま固定しない
コミットメッセージの規約を導入したいけれど、口頭やドキュメントで伝えるだけでは徹底されない、というチームは多いはずです。
まずはこのワークフローを1つ足すところから始めてみてください。