changelog を自動で生成したい¶
changelog(Release Note)を自動で生成するためのツールを調べた。ローカルの git の tag やリポジトリ内のファイルを生成元にするものと、GitHub の API を使うものがある。なお、リポジトリ内に複数プロジェクトがある場合、tag の差分から変更点を計算する方式では、どのプロジェクトに関係する変更かを検出しにくいように感じた。
調べた 5 つのツールの違いを、生成元と実行方法で次の表にまとめた。
| ツール | 生成元 | 実行方法 | 特徴 |
|---|---|---|---|
| github-changelog-generator | GitHub API | CLI | PR のラベルを元に changelog を生成する |
| release-drafter | GitHub API | GitHub Actions / GitHub App | ラベルを元に changelog を生成する |
| towncrier | リポジトリ内のニュースフラグメント | CLI | 変更ごとに書いたフラグメントをまとめる |
| release-please-action | GitHub API(コミットメッセージ) | GitHub Actions / CLI / GitHub App | コミットのプレフィックスからバージョンを判定する |
| dunamai | ローカルの git の tag | CLI | changelog ではなくバージョン文字列を生成する |
github-changelog-generator¶
github-changelog-generatorは GitHub API を使って changelog を生成する。PR に付けたラベルを元に生成できる。
release-drafter¶
release-drafterは GitHub Actions を使って changelog を生成する。GitHub App として使うこともでき、ラベルを元に生成する点は前述の github-changelog-generator と共通する。
towncrier¶
towncrierを使うと、git の履歴ではなく、変更ごとに書く「ニュースフラグメント」という小さなファイルから changelog を生成できる。Python プロジェクトの changelog 生成に特化している印象を受けたが、README によると Python 固有の機能を使わなければ、ほかの言語のプロジェクトにも使える。TOML に設定を書く方式で、デフォルト以外のフラグメントを手動で書き足すのは手間がかかりそうに感じた。詳細はtowncrier の設定ドキュメントにまとまっている。
release-please-action¶
release-please-actionは GitHub Actions を使って changelog を生成する。CLI や GitHub App として使うこともできる。Release Please はその仕組み上、リポジトリのメインの開発ブランチのコミットを追跡する必要がある。
コミットのプレフィックスによって、どのような変更かを判別しているため、コミットメッセージを書く時点から変更の種類を意識する必要がある。プレフィックスとバージョン更新は次のように対応する。
| コミットのプレフィックス | 更新されるバージョン |
|---|---|
fix | パッチバージョン |
feat | マイナーバージョン |
fix! | メジャーバージョン |
feat! | メジャーバージョン |
Rust や Python、Go、Node など多言語に対応しており、言語ごとのファイルを解析して最適な処理をする。README では squash merge を使うことを強く推奨しており、monorepoにも対応している。
dunamai¶
dunamaiは changelog を生成するツールではない。git などのバージョン管理システムの tag から、バージョン文字列を自動生成できる。
まとめ¶
changelog を自動生成するツールは、生成元と実行環境で選び分けられる。用途ごとの候補を次の表に整理した。
| 用途 | 向いているツール |
|---|---|
| GitHub API とラベル運用に寄せたい | github-changelog-generator, release-drafter |
| コミットメッセージの規約からバージョン更新まで一貫させたい | release-please-action |
| 変更ごとにフラグメントを書いて changelog を管理したい | towncrier |
| changelog ではなくバージョン文字列だけがほしい | dunamai |
いずれのツールも、生成元(ローカルの git やファイル/GitHub API)と実行環境(CLI/GitHub Actions)の制約を先に確認してから選ぶと迷いにくい。