goreleaserを使うとGo製のCLIのGitHubのリリースページの更新とHomeBrew Tap用リリースも簡単に行える。
さらにGitHub Actionsを使えばYAMLを2ファイル追加するだけでgit tagに合わせて全自動リリースが可能になる。
TL;DR
- goreleaserはGoのバイナリをよしなにリリースできるツール
- https://goreleaser.com/
- GitHubのリリースページにリリースできる
- HomeBrew Tapにもリリースできる
- GitHub Actionsも公式で提供されている
- Actionsを使えばgit tagをpushするだけで自動リリースできる
GoのCLIを自動リリースしたい
GoでCLIのインストール方法は(Macの場合)主に次の3つになるだろう。
go get
でインストールする- GitHubのリリースページなどにあるバイナリをインストールする
- HomeBrewでインストールする
goreleaserを使うと、GitHubリリースページへのバイナリアップロードやHomeBrew用の設定ファイルの作成がとても簡単になる。
git tagに合わせてgoreleaser-actionを使って自動リリースをする。
GitHubへの自動リリースの手順はほとんど次の記事で説明されている。
これに加えて、HomeBrew Tap用の設定をすればローカルに何も用意せず、HomeBrew Tap用リポジトリのRubyのファイルも自動生成・自動更新される。
必要なもの
自動リリースに必要なのは次の通り。
- リリースするCLIが入ったGitHubリポジトリ
- もろもろの設定をしたYAMLファイル
- HomeBrew Tap用のリポジトリ
- USER_NAME/homebrew-tapというリポジトリをひとつ作っておくのが一般的
- https://github.com/budougumi0617/homebrew-tap
- public repoへの書き込み権限を付与したGitHub Personal Token
goreleaserの設定YAMLを用意する
まずはリリースの設定をしたYAMLファイルを用意する。
公式ページを確認すればよいが、ほぼコピペで問題ない。
以下のYAMLはleetgode
というCLIをリリースする際に利用しているYAMLファイルだ。
before:
hooks:
- go mod tidy # tidyしておけば間違いない
builds:
-
main: ./cmd/leetgode # main.goファイルがある場所。
env:
- CGO_ENABLED=0
archives:
- replacements:
darwin: Darwin
linux: Linux
windows: Windows
386: i386
amd64: x86_64
checksum:
name_template: 'checksums.txt'
snapshot:
name_template: "{{ .Tag }}-next"
changelog:
sort: asc
filters:
exclude:
- '^docs:'
- '^test:'
HomeBrew Tap用の設定は以下のとおり。これを.goreleaser.yml
に追加しておく。
いろいろ設定したいならば公式情報を参照すればよいがこちらもほぼコピペで大丈夫。
brews:
-
name: leetgode # CLIの名前でよい
github: # HomeBrew Tapをリリースするリポジトリ
owner: budougumi0617
name: homebrew-tap
# ここは決め打ちで良い
url_template: "https://github.com/budougumi0617/leetgode/releases/download/{{ .Tag }}/{{ .ArtifactName }}"
commit_author: # homebrew-tapにcommitするときに使うGitHubアカウント
name: goreleaserbot
email: goreleaser@carlosbecker.com
homepage: "https://budougumi0617.github.io/"
description: "LeetCode CLI for Gophers." # 適当なdescription
test: | # リリースビルド後の動作確認用のコマンド。--versionやhelpなどを指定すればよいだろう
system "#{bin}/leetgode help"
install: | # Goならばバイナリ名でOK
bin.install "leetgode"
GitHub Actionsの設定をする。
あとはGitHub Actionsを設定しておけば、自動リリースができる。
次の内容のYAMLファイルを.github/workflows/goreleaser.yml
に設置する。
こちらの参考YAMLもleetgode
CLIで使っているものだ。
name: goreleaser
on:
push:
tags: #vX.X.Xというタグのときにリリースする
- "v[0-9]+.[0-9]+.[0-9]+"
jobs:
goreleaser:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
-
name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.15
-
name: Run GoReleaser
uses: goreleaser/goreleaser-action@v2
with:
version: latest
args: release --rm-dist
env:
# need to access other repository for brew-tap
GITHUB_TOKEN: ${{ secrets.GH_PAT }}
HomeBrew Tap用のリポジトリへの書き込み権限が必要なため、トークンを作っておかないといけない点だけ注意する。
上記の例では、リポジトリのシークレットにGH_PAT
という名前で払い出したトークンを設定している。
やりかたは次のページを参照のこと。
- https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token
- https://docs.github.com/en/free-pro-team@latest/actions/reference/encrypted-secrets
動作確認
ここまで設定すればあとはすべて自動で実行される。
tagを設定してリモートへプッシュすると、
$ git tag -a v0.0.1 -m "first release"
$ git push origin v0.0.1
GitHub Actionsが実行される。
Actionsが実行されると、GitHub Releaseが作成される。
また、HomeBrew Tap用のリポジトリにRubyの設定ファイルが自動追加される。
ローカルでbrew
コマンドを実行すると、リリースしたバイナリがインストールできるようになっている。
$ brew install budougumi0617/tap/leetgode
終わりに
GitHub Actions用のリポジトリができていたのでリリース作業がめちゃくちゃ簡単になった!
そして設定もYAMLをコピペするだけでいいのでめちゃくちゃ簡単。
CLIツールはちょくちょくつくるしmacOSユーザなので自分がラクするためにも積極的に使っていきたい。