🦔

PRのタイトルがConventional Commitsに沿っていない場合、マージできないようにする

2023/05/13に公開

ユースケース

semantic-releaseなどバージョニングツールを採用し、バージョニングの自動化やCHANGELOGの生成などをしている場合、conventional commitsに沿ったcommit messageにすると思います。

  1. ローカルでcommitする際にcommitlintとhuskyを利用するなどしてconventional commitsを強制させるケース
  2. スカッシュマージを前提とし、上記のローカルでのルールを設定せず、PRのマージをする際にsquash mergeを前提とするケース

今回は特に2のケースの方々に合った内容になるかもしれません。

githubで開発をしている中でsquash mergeをする際に、GUI上でsquash mergeの内容を編集でき、conventional commitsに沿わずにsquash mergeができてしまいます。(ちゃんと意識していれば問題ないかもしれませんが、人間ミスをするという前提のもとです。)そんな問題を解決するためのライブラリとしてconventional-pr-title-actionというgithub actions用のツールがあるので紹介したいと思います。

セットアップ

公式のREADME.mdにあるものとほとんど変わりません。

設定はこれだけです。

.github/workflows/check-pr-title.yml

name: check-pr-title

on:
  pull_request:
    branches: [develop, main]
    types: [opened, edited, synchronize]

jobs:
  lint:
    runs-on: ubuntu-latest
    permissions:
      statuses: write
    steps:
      - uses: aslafy-z/conventional-pr-title-action@v3
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

https://github.com/aslafy-z/conventional-pr-title-action#inputs に書いてありますが、いくつかオプションがあります。

success-state

バリデーションが成功した時のメッセージをカスタマイズできます。

failure-state

バリデーションが失敗した時のメッセージをカスタマイズできます。

target-url

失敗した時など、何か指示や参考のurlなどを伝えたい場合に便利です。
デフォルトでは、以下のようにconventional commitsについての概要ページのurlが出力されます。
(チームでコーディングルールなどドキュメントを作成している場合、そのurlを指定してあげるのも良さそうです。)

Default: "https://www.conventionalcommits.org/en/v1.0.0/#summary".

実際に試す

PRを作成し、タイトルにConventional Commitsに沿っていないメッセージを記入。

そうすると以下のようにsquash mergeをすることができなくなります。(Auto Assignはこちらの投稿内容とは関係がないので気にしないでください)

またこの際に一つ重要なのが、protected branchesで「Require status checks to pass before merging」を有効にし、Status checks that are required.に該当のgithub actions(今回設定したもの)を有効にすることです。こうすることでステータスがpassしていない場合にマージをすることができなくなります。

conventional commitsに沿ったタイトルに変更します。

すると以下のようにステータスがpassの状態になり、squash mergeができるようになっています!

まとめ

課題はありますが、今回紹介したライブラリを導入しない時と比べると制約をかけることができます。

Discussion