Gitのtagとpull requestのマージ履歴からChangelogを自動生成する `ghch`
https://github.com/Songmu/ghch
mackerel-agent のリリースフローでは、前回のリリース以降の、pull requestのマージ履歴を拾って、そこからChangelogを自動生成するということをおこなっている。
これは、1年半前くらいにPerlで書いていたのだが、この度汎用的にしてGoで書きなおした。それが ghch
。前回打ったsemverっぽいgit tag以降のマージ履歴を抽出してくれる。例えば、こういう風にmackdownで出力がされる。
% ghch --format=markdown --next-version=v0.30.3
## [v0.30.3](https://github.com/mackerelio/mackerel-agent/releases/tag/v0.30.3) (2016-04-27)
* retry retirement when api request failed [#224](https://github.com/mackerelio/mackerel-agent/pull/224) ([Songmu](https://github.com/Songmu))
* Fix comments [#222](https://github.com/mackerelio/mackerel-agent/pull/222) ([stefafafan](https://github.com/stefafafan))
* Remove go get cmd/vet [#223](https://github.com/mackerelio/mackerel-agent/pull/223) ([itchyny](https://github.com/itchyny))
* [nit] [plugin.checks.foo ] is valid toml now [#225](https://github.com/mackerelio/mackerel-agent/pull/225) ([Songmu](https://github.com/Songmu))
* Remove usr local bin again [#217](https://github.com/mackerelio/mackerel-agent/pull/217) ([Songmu](https://github.com/Songmu))
* Fix typo [#221](https://github.com/mackerelio/mackerel-agent/pull/221) ([yukiyan](https://github.com/yukiyan))
標準だとjsonが出力される。そっちのほうがスクリプトからだと扱いやすいでしょう。
コミットログをChangelogの代わりにするというのは流石に乱暴だろうと僕は思っているので、サマリーとしてのChangelogは必要。ただ、書くのは面倒くさいので、マージしたpull requestのタイトルを拾ってきてそれをChangelogの一覧にするのは結構良いんじゃないかと思っている。
pull requestのタイトルであれば後から編集ができるので、Changelog生成前に見なおして書きなおすことも簡単。コミットログだとこうはいかず、後から編集が面倒くさいし、そもそも歴史改変もしたくない。ちなみにmackerel-agentの場合だと、 [nit] というタグがタイトルについていれば、Changelogに載せない、みたいな運用もしています。
gobump やgoxc、ghrと併用すれば、CHANGELOG自動更新を含めてリリース作業を自動化することも可能でしょう。
ちなみにマージコミットを拾う仕組みになっているので、squash mergeボタンを使ってしまうと抽出できないので注意。
以下からバイナリを取得できます。ぜひお試しください。