コンテンツにスキップ

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)の制約を先に確認してから選ぶと迷いにくい。