概要
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.sha
とgithub.event.pull_request.head.sha
でPRに含まれるコミットメッセージを対象としてる点です。
動作確認
失敗例
add foo file
というコミットメッセージにします。
以下のような詳細が出ています。
成功例
ちゃんと型をいれてfeat: add foo file
というコミットメッセージにします。
その他
なぜGithub Actions?
いくつかCIサービスが有る中でGitHub Actionsにしている理由としては、対象となるコミットメッセージを抽出する上で他のCIだとやりづらくGithub Actionsだとgithub contextが使えてやりやすいためです。
- CircleCIの例はあるけどコミット数1とベタ書き
だったり、
commitlint --from=main
とも指定できるけど、例えばhotfixで既存tagからブランチ切るとおかしくなる
といった課題が出てくるため、Commitのハッシュ値で比較するのがオススメです。
サンプルコード
今回のコードはこちら
まとめ
GitHub ActionsでConventional Commitsを満たしているかチェックできるようにしました。