ハトネコエ Web がくしゅうちょう

プログラミングやサーバー・Web制作、チームマネジメントなど得た技術のまとめ

リリースプルリクを gh-release-pr-generator で自動作成しよう!

誕生! gh-release-pr-generator

ステージング環境と本番環境があるWeb開発において、git-flow に沿って、
developブランチにマージがあったらステージング環境のリリースが走って、
masterブランチ(最近ではmainブランチ)にマージがあったら本番環境にリリースが走る。
そういう作りになっていることはよくあると思います。

その関係で、master ブランチに develop ブランチからマージするための、
いわゆるリリースプルリクを作るということはあると思います。

そんなリリースプルリクカンタンにぃ!
作れるぅ!
CLIアプリケーションを作りましたぁ!!!

動機

……と言っても、実はすでに先行者の方がいまして、

というものがありました。

git-pr-release は使っている方も多く、「良さそうだなあ……」と最初はこれを使う予定でいたんですが、
1つ大きな問題がありまして、この issue にある通り、
develop ブランチに「Squash and merge」をしている場合、そのプルリクが差分として出てこないのです!

develop や master ブランチのコミットログが大量にならないよう「Squash and merge」で、リリースプルリク以外のプルリクをマージしていたので、
「これは困ったぞ」となりました。

オプションで切り替えられるような仕組みのプルリクを作るよりも、
このくらいだったら自分で作っちゃおうかな、と思って作成しました。
Go言語で作るとワンバイナリにできるぶん、CI で使うときに都合がいいですからね。

作成にあたっては、github-pr-releaseGitHub API をバリバリ使う実装が参考になりました。
ありがとうございます。

使い方

こちらの README でも書いていますが、おおまかな使い方について日本語でも書いておきます。

1. GitHub API Token を取得する

GitHub Actions で動かすだけだったら、GitHub Actions 自体がAPIトークンを持っているため必要ありませんが、
ローカルで動かす場合には必要になります。

『個人アクセストークンを使用する - GitHub Docs』を読んで用意してください。
「repo」のところにチェックを入れたAPIトークンがあれば大丈夫です。

2. インストール

Go 1.16 以上であれば、

go install github.com/nekonenene/gh-release-pr-generator@latest

でインストール可能です。1.16 未満には go install コマンドがないので

go get github.com/nekonenene/gh-release-pr-generator@latest

でおこないます。

また、 https://github.com/nekonenene/gh-release-pr-generator/releases にはバイナリファイルが置いてありますので、
そこから最新バージョンのバイナリを wget などで取得して実行する方法もあります。
CIなどでおこなう場合はそちらのやり方がオススメです。

3. gh-release-pr-generator の実行

gh-release-pr-generator --token 123456789abcd123456789abcd --repo-owner nekonenene --repo-name my-repository-name --dev-branch staging --prod-branch production

のように実行します。

パラメーター 指定するもの 必須か
-token 1. の手順で取得した GitHub API Token YES
-repo-owner リポジトリのユーザー名・組織名 YES
-repo-name リポジトリの名前 YES
-prod-branch 本番リリース用ブランチ名(デフォルト: main
-dev-branch 開発用ブランチ名(デフォルト: develop
-template-path 後述するテンプレートファイルのPATH
-limit 取得するクローズ済みプルリク数(デフォルト: 100
-enterprise-url GitHub Enterprise の URL (例: https://github.your.domain

-limit オプションは大きくすると、GitHub API のリクエスト数制限に引っかかる可能性があるのでご注意を。
ふつうはデフォルトの100もあれば充分かと思います。

最後の -enterprise-url オプションについては、GitHub Enterprise を契約していなくて動作確認できないので、
もし動いた方いらっしゃったら教えてくださるとうれしいです!

4. テンプレートファイル

gh-release-pr-generator で作られるリリースプルリクのタイトルや本文を変えたい場合は、
テンプレートファイルを作って、それの場所を指定することでカスタマイズできます。

デフォルトは以下のようになっています。
カスタマイズするにはある程度 Go 言語の知識が必要な部分もありますが、
日付は知らない人でもいじりやすいようにパラメーターを用意しましたので、
README のこちらを読みつつ設定してみてください。

Release {{ .Year }}-{{ .Month }}-{{ .Date }} {{ .Hour }}:{{ .Minute }}
# Pull Requests
{{ range $i, $pull := .Pulls }}
* {{ $pull.Title }} (#{{ $pull.Number }}) @{{ $pull.User.Login }}
{{- end }}

.release-pr-template.tmpl など、それっぽい名前で保存して、
gh-release-pr-generator の実行時に --template-path .release-pr-template.tmpl と書いてあげれば読んでくれるはずです。

5. GitHub Actions での使用

.github/workflows/release_pr.yml など、適当な場所に GitHub Actions 用のファイルを 置いて、
develop ブランチにマージがあるたびにリリースプルリクエストが作られるようにしておくと楽です。

ファイル例は README に載せていますので、ご活用ください。
バージョン指定を README に書きたくなかったので、例では go install をしていますが、
wget でバイナリファイルをダウンロードして実行、ってやり方のほうがもう少し実行速度が上がると思います。

作ってみての感想

久しぶりに Go 言語をさわれて楽しかったです。
(前回作った YouTube の概要欄を更新するやつ は 2020年4月作成だったので、約1年ぶりだったみたい)

おもしろかったのが release-it という CLI ツールを知れたことで、
これによって、master ブランチへのマージ時に
バイナリファイルをアタッチしたリリースページが自動で作成されるようになり、

go install github.com/nekonenene/gh-release-pr-generator@latest

をしたときにしっかり最新版がインストールされる仕組みに出来たのでとてもよかったです。

Go言語のCLIアプリケーションを作ることがあるときには
また活用させてもらおうと思います。

そういえば Rust をいつかさわろうと思っていたのに、また Go で作ってしまっていた。
次こそは……!