想定している読者
Go でコマンドラインツールを書き、人に入れてもらいたい方に向けたキットです。GoReleaser のドキュメントは良質で無料ですし、動く .goreleaser.yaml は午後で書けます。時間がかかるのはその先です。実際のコミットを表示する version コマンド、curl でパイプしても恥ずかしくない install.sh、チェックサムの扱い、タグでリリースする CI、ハッシュが空のままではない Homebrew の formula などです。
このキットは、コピーして名前を変えて使うリポジトリの雛形です。中身はすべてクリーンなコンテナで実行済みで、出力も付けているので、「動いた」とは何を指すのかを確かめられます。
収録内容
.goreleaser.yaml: Linux、macOS、Windows の amd64 と arm64 向け。静的ビルド、-trimpath、バージョン、コミット、コミット日時の埋め込み、チェックサムファイル、Conventional Commit のプレフィックスでグループ化した changelog。install.sh: 検証付きのインストーラー。バージョンの固定オプションと、任意の GPG 署名チェックがあります。- 再現性チェッカー: 別々のクリーンな環境で二回ビルドして、結果を比較します。
- バージョンアップのスクリプト: コミットを読んで、次のタグを決めます。
- Homebrew と Scoop のジェネレーター: 実際のチェックサムから formula とマニフェストを作ります。
- CI テンプレート: GitHub Actions と GitLab 向け。lint、レースディテクター付きのテスト、タグでのリリース。
- サンプル CLI: 標準ライブラリだけで作ってあり、テスト付きです。チェックリストを備えた、初回リリースの手順ガイドもあります。
インストーラーが拒否するもの
バイナリをダウンロードして実行するインストーラーは、厳しくしておくべき場所です。テストでは、次のようなときに install.sh は停止し、何もインストールせず、既存のインストールにも手を付けません。
- アーカイブが SHA-256 と一致しない(確認のため、一つ改ざんしています)。
- チェックサムファイルにそのアーカイブのエントリがない、または二つある。
- チェックサムファイルがない、またはそのリリースが存在しない。
- URL が http のまま。
- バージョン文字列の形式が不正、または空。
- ビルド対象でないプラットフォーム。アーキテクチャの判定は、偽の
unameでテストしており、armv7、i686、riscv64、FreeBSD、Windows のシェルも含みます。
GPG 鍵を設定すると、間違った鍵、改ざんされたチェックサムファイル、署名の欠落、鍵ファイルの欠落もすべて拒否します。署名がチェックサムファイル自体を守る形です。
再現可能ビルドを確認
repro-check.sh は、リポジトリを別々のディレクトリに二回 clone します。環境変数は空、Go のキャッシュは新しい状態、実行は二秒の間隔を空けて、バイナリ、アーカイブ、チェックサムファイルを比較します。サンプルプロジェクトでは、13 ファイル中 13 ファイルが一致しました。ldflags にビルド時刻を埋め込む、-trimpath を外す、という二つのミスをわざと入れると、どちらもすべてのファイルが食い違いました。つまり、失敗すべきときにチェックが失敗します。
数値
リンカーフラグ -s -w で、アーカイブのサイズはこのサンプルでおよそ半分になります。Linux amd64 のアーカイブは、付けると 770,338 バイト、付けないと 1,531,872 バイトです。ビルド時間はキャッシュの状態に大きく左右されます。README に条件とあわせて載せています。
どうテストしたか
クリーンな Linux コンテナで GoReleaser v2.20.0 を使い、183 の自動チェックを実行し、さらにサンプルのビルドとテストを Go 1.22 で通しました。チェックには、六つのアーカイブを作るスナップショットリリース、生成された Linux バイナリを実行して --version の出力を比較すること、チェックサムファイルとアーカイブの照合、changelog 用のタグ付きビルド、一時的な git リポジトリでの約 25 ケースのバージョンアップのスクリプト、GitHub のワークフローに対する actionlint が含まれます。
動作要件
Go、git、GoReleaser OSS。テストハーネスを動かすなら Docker も必要です。
よくある質問
GoReleaser のドキュメントを読めばよいのでは?
読めば足ります。ドキュメントが扱うのは GoReleaser です。このキットが扱うのは、その周辺と、各パーツが組み合わせて動くことの確認です。
GitLab に対応していますか?
はい。GitLab CI のテンプレートがあり、トークンの設定に関するメモも付いています。
自分のモジュールパスや名前を使えますか?
はい。初回リリースのガイドに、名前を変える場所をすべて挙げています。
ライセンス
ご自身のプロジェクトで使えます。雛形に入っている LICENSE ファイルは、ご自身のものに差し替えてください。キットの再販はしないでください。
変更履歴
- 0.1.0: 初回リリース。
続きを読む
- Verify a downloaded binary: checksums, GPG, minisign, cosign (英語)
- Reproducible Go builds: build twice, compare the hashes (英語)
- A GoReleaser v2 config for a small Go CLI, line by line (英語)
- What a curl | sh installer for a Go binary should refuse (英語)
入手する
支払い、税、請求書は販売代行事業者の Polar が処理します。決済後にダウンロードリンクが届きます。