Carpe Diem

備忘録

GitHub ActionsでConventional Commitsを満たしているかチェックする

概要

Conventional Commits というコミットメッセージの規約があります。

これを守ることで

  • 意味のあるコミット粒度&メッセージになる
    • あとから振り返りやすい
  • Change Logsなどで自動化ツールを活用しやすい

といったメリットを享受できます。

しかし新しいメンバーなど、Conventional Commitsを知らない人が加わるとルールを守られないコミットが含まれるため、PR時などで機械的にチェックしたいです。

今回はGitHub Actionsでそれをチェックするようにします。

環境

  • commitlint v16.0.0

設定

commitlint

commitlint - Lint commit messages

というConventional Commitsを守っているかどうかチェックするツールがあります。こちらを利用します。

インストール

以下の2つのパッケージが必要なのでインストールします。

  • commitlint/cli
  • commitlint/config-conventional
$ npm init -y
$ npm install --save-dev @commitlint/cli @commitlint/config-conventional

config追加

commitlint.config.jsというconfigが必要なので用意します。

$ echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js

動作確認

上記だけでまずcommitlint自体の動作確認が可能になります。

Conventional Commitsを満たさないメッセージの場合

$ echo "hoge" | npx commitlint --verbose
⧗   input: hoge
✖   subject may not be empty [subject-empty]type may not be empty [type-empty]

✖   found 2 problems, 0 warnings
ⓘ   Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint

このようにエラーが出ます。

Conventional Commitsを満たすメッセージの場合

$ echo "feat: add user service" | npx commitlint --verbose
⧗   input: feat: add user service
✔   found 0 problems, 0 warnings

このようにエラーは出ません。

GitHub Actions

次は GitHub Actions の設定をします。

.github/workflows/commitlint.ymlというファイルを用意します。

$ mkdir -p .github/workflows/
$ cd .github/workflows/
$ touch commitlint.yml

commitlint.yml

中身は以下のように書きます。

name: Run commitlint on PR

on: [pull_request]

jobs:
  run-commitlint-on-pr:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Setup Node
        uses: actions/setup-node@v2
        with:
          node-version: 16.x
      - name: Install dependencies
        run: npm install
      - name: Validate all commits from PR
        run: npx commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose

ポイントはgithub.event.pull_request.base.shagithub.event.pull_request.head.shaでPRに含まれるコミットメッセージを対象としてる点です。

動作確認

失敗例

add foo fileというコミットメッセージにします。

f:id:quoll00:20220104212736p:plain

以下のような詳細が出ています。

f:id:quoll00:20220104212758p:plain

成功例

ちゃんと型をいれてfeat: add foo fileというコミットメッセージにします。

f:id:quoll00:20220104213118p:plain

その他

なぜGithub Actions?

いくつかCIサービスが有る中でGitHub Actionsにしている理由としては、対象となるコミットメッセージを抽出する上で他のCIだとやりづらくGithub Actionsだとgithub contextが使えてやりやすいためです。

だったり、

  • commitlint --from=mainとも指定できるけど、例えばhotfixで既存tagからブランチ切るとおかしくなる

といった課題が出てくるため、Commitのハッシュ値で比較するのがオススメです。

サンプルコード

今回のコードはこちら

github.com

まとめ

GitHub ActionsでConventional Commitsを満たしているかチェックできるようにしました。

参考