Hiratake Web ロゴ

Squash and merge で Conventional Commits の規約に則ったコミットメッセージにする

投稿した日
更新した日
書いたひと
icon
ひらたけ

GitHub で Squash and merge をする際に、semantic-pull-request という GitHub Action を利用してコミットメッセージを Conventional Commits の規約に則ったものになるようにしたので、その紹介を兼ねて備忘録的な感じで書いておこうと思います。

Squash and merge とは

GitHub でプルリクエストをマージする場合、「Squash and merge」というオプションが選択できます。以下のドキュメントにある図が分かりやすいですが、この方法でプルリクエストをマージすると そのプルリクエストに含まれる複数のコミットが 1 つにまとめられてデフォルトブランチへマージ されます。

GitHub 上にある多くの OSS のリポジトリで採用されているマージ方法ですが、 まとめられた 1 つのコミットのメッセージの形式が統一されない という問題があります。

これは semantic-release でリリースノートを生成するなど、コミットメッセージを用いて何かしらの自動化処理を行っている場合に問題となります。

GitHub Actions でコミットメッセージに制約を設ける

この問題を解決するため、semantic-pull-request という GitHub Action を利用します。プルリクエストのタイトルが、Conventional Commits の規約に則ったものであるかを確認することができます。

Squash and merge では、コミットを 1 つにまとめた際のコミットメッセージに「プルリクエストのタイトル」を使用するようにする設定があります。 この設定と GitHub Actions を組み合わせることで、コミットメッセージの形式を統一することができます。

似たようなものに Semantic Pull Requests という GitHub App があり、こちらを紹介している記事も見られますが、リポジトリを確認すると「別のものを使ってね」的な文章が書かれているので使わないほうが良いでしょう。

導入してみる

導入方法は、リポジトリの README にあるとおり です。以下のようなワークフローを .github/workflows に作成します。

name: Semantic PR

on:
  pull_request_target:
    types:
      - opened
      - edited
      - synchronize

permissions:
  pull-requests: read

jobs:
  # Semantic PR
  main:
    name: Semantic PR
    runs-on: ubuntu-latest

    steps:
      - uses: amannn/action-semantic-pull-request@v5
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

また、Squash and merge をするときのコミットメッセージが、デフォルトでプルリクエストのタイトルとなるように導入するリポジトリの設定を変更します。

導入するリポジトリの設定を開き、 「Pull Requests」にある「Allow squash merging」にチェックを入れ 、その下にあるセレクトボックスで「Default to pull request title」などの プルリクエストのタイトルがコミットメッセージとして使用されるものを選択 します。

この状態でプルリクエストを作成すると、プルリクエストのタイトルを確認するワークフローが動作し、Squash and merge でのコミットが Conventional Commits の規約に則ったものになります🎉