Conventional CommitsとSemantic Release

Conventional Commitsがsemantic-releaseで自動バージョニングとchangelog生成を可能にする方法を学びます。コミットからリリースまでの完全なワークフローを解説します。

Best Practices

詳細な説明

Conventional Commitsによる自動リリース

Conventional Commitsの主な動機の1つは、完全に自動化されたリリースワークフローを可能にすることです。semantic-releaseのようなツールはコミット履歴を分析して次のバージョン番号を決定し、changelogを生成し、手動介入なしにリリースを公開します。

仕組み

  1. 前回のリリースからのコミットを分析
  2. コミットタイプに基づいてバージョンバンプを決定
    • fix: → patch (1.0.0 → 1.0.1)
    • feat: → minor (1.0.0 → 1.1.0)
    • BREAKING CHANGEまたは! → major (1.0.0 → 2.0.0)
  3. コミットメッセージからchangelogを生成
  4. GitタグとGitHubリリースを作成
  5. npm、PyPIなどにパッケージを公開

セットアップ

npm install -D semantic-release
{
  "release": {
    "branches": ["main"],
    "plugins": [
      "@semantic-release/commit-analyzer",
      "@semantic-release/release-notes-generator",
      "@semantic-release/changelog",
      "@semantic-release/npm",
      "@semantic-release/github",
      "@semantic-release/git"
    ]
  }
}

コミットからリリースへのマッピング

前回リリースからのコミット 次のバージョン
fix: handle null input Patch: 1.2.3 → 1.2.4
feat: add export feature Minor: 1.2.3 → 1.3.0
feat!: redesign API Major: 1.2.3 → 2.0.0
fix: A + feat: B Minor: 1.2.3 → 1.3.0
fix: A + feat!: B Major: 1.2.3 → 2.0.0

生成されるChangelog

semantic-releaseはコミットをタイプ別にグループ化:

## [1.3.0] - 2024-03-15

### Features
- **auth:** add OAuth2 login flow (#234)
- **api:** add batch processing endpoint (#256)

### Bug Fixes
- **parser:** handle escaped quotes (#245)
- **ui:** fix layout shift on mobile (#251)

リリースをトリガーしないタイプ

以下のコミットタイプはリリースをトリガーしません

  • docs: — ドキュメントのみ
  • style: — フォーマット変更
  • refactor: — 動作変更なし
  • test: — テスト追加
  • chore: — メンテナンスタスク
  • ci: — CI設定
  • build: — ビルドシステムの変更

これにより、ユーザー向けの変更がある場合にのみリリースが行われます。

ユースケース

mainへのマージが自動的に次のバージョンを決定し、changelogを生成し、GitHubリリースを作成し、npmパッケージを公開する、完全に自動化されたリリースパイプラインをセットアップしたいと考えています。Conventional Commitsがこのプロセスをどのように推進するか、各コミットタイプがバージョニングにとって何を意味するかを理解する必要があります。

試してみる — Git Commit Message Generator

フルツールを開く