commitlintとConventional Commitsの統合

Conventional Commits形式を強制するためのcommitlintのセットアップ方法を学びます。インストール、設定、Huskyでのgit hook、チーム向けカスタムルールを解説します。

Best Practices

詳細な説明

commitlintのセットアップ

commitlintは、コミットメッセージをルールセットに対してチェックするツールです。Git hookと組み合わせることで、非準拠のコミットの作成を防ぎ、コミット履歴全体がConventional Commits仕様に従うことを保証します。

インストール

npm install -D @commitlint/cli @commitlint/config-conventional

設定

プロジェクトルートにcommitlint.config.jsを作成:

module.exports = {
  extends: ['@commitlint/config-conventional'],
};

これにより以下が強制されます:

  • 有効なコミットタイプ(featfixdocsなど)
  • サブジェクト行のフォーマット(小文字、ピリオドなし)
  • ヘッダーの最大長(デフォルト100文字)
  • ボディとフッターのフォーマットルール

HuskyでのGit Hook

Huskyをインストールしてcommitlintを自動実行:

npm install -D husky
npx husky init
echo "npx --no -- commitlint --edit \$1" > .husky/commit-msg

これで、すべてのgit commitが作成前にバリデーションされます。

カスタムルール

チームに合わせてルールをカスタマイズできます:

module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    // 特定のスコープを強制
    'scope-enum': [2, 'always', [
      'auth', 'api', 'ui', 'db', 'config', 'deps'
    ]],
    // スコープを必須にする
    'scope-empty': [2, 'never'],
    // サブジェクト長を50に制限
    'subject-max-length': [2, 'always', 50],
    // 特定のタイプのみ許可
    'type-enum': [2, 'always', [
      'feat', 'fix', 'docs', 'style', 'refactor',
      'perf', 'test', 'build', 'ci', 'chore', 'revert'
    ]],
  },
};

CI統合

CIパイプラインにcommitlintを追加してPRコミットをバリデーション:

# GitHub Actions
- name: Lint commits
  uses: wagoid/commitlint-github-action@v5

失敗時の処理

commitlintがコミットを拒否すると、明確なエラーが表示されます:

✗ type must be one of [feat, fix, docs, ...]
✗ subject must not end with period
✗ header must not be longer than 100 characters

メッセージを修正して再試行してください。コミットは作成されていないため、amendは不要です。

ユースケース

新しいプロジェクトを立ち上げており、最初からConventional Commitsを強制したいと考えています。チームのすべての開発者が非準拠のコミットメッセージを書いた際に即座にフィードバックを受け、リポジトリに入る前に不整合を防ぐために、commitlintとHuskyを設定する必要があります。

試してみる — Git Commit Message Generator

フルツールを開く