タグを打つ前にビルド結果を確認したい

goreleaserは通常、Gitのタグをトリガーにビルド・パッケージング・GitHubへの公開までを一気に行う。しかし、タグを打つたびにアーカイブの中身やビルドオプションを確認していては手間がかかる。goreleaserには、タグの作成やGitHubへの公開といった実際のリリース操作を伴わずに、ローカルでビルド結果だけを確認できるオプションが用意されている。

release –snapshot でリリース一式をローカルに生成する

goreleaser release--snapshotを付けると、Gitのタグやリモートリポジトリの状態を検証せず、distディレクトリ配下にビルド成果物一式を生成できる。GitHubへの公開などのパブリッシュ処理はスキップされる。

$ goreleaser release --snapshot --clean
  • starting release
  • skipping announce, publish, and validate...
  • cleaning distribution directory
  ...
  • snapshotting
    • building snapshot...                           version=0.0.0-SNAPSHOT-bbc9033
  • building binaries
    • building                                       paths=[./cmd/myapp] binaries=[myapp] target=darwin_arm64_v8.0
    • building                                       paths=[./cmd/myapp] binaries=[myapp] target=linux_amd64_v1
    ...
  • archives
    • archiving                                      name=dist/example_Darwin_arm64.tar.gz
    • archiving                                      name=dist/example_Linux_x86_64.tar.gz
    ...
  • release succeeded after 2s
  • thanks for using GoReleaser!

--cleanは実行前に既存のdistディレクトリを削除するオプションであり、前回の生成物が残っていても気にせず再実行できる。

.goreleaser.yamlbuildsに設定した全プラットフォーム分のバイナリと、archivesで設定したアーカイブ形式(tar.gzzip)がdist配下に生成される。

$ find dist -maxdepth 1
dist
dist/example_darwin_arm64_v8.0
dist/example_linux_amd64_v1
dist/example_Darwin_arm64.tar.gz
dist/example_Linux_x86_64.tar.gz
dist/example_0.0.0-SNAPSHOT-bbc9033_checksums.txt
...

アーカイブのファイル名にはデフォルトでバージョンが含まれないため、example_Darwin_arm64.tar.gzのようにOS名とアーキテクチャのみの名前になる。一方、checksumsファイルの名前にはバージョンが含まれる。

生成されたバイナリは実際に実行して動作を確認できる。

$ ./dist/example_darwin_arm64_v8.0/myapp
hello

build –single-target で現在の環境向けだけをビルドする

複数プラットフォーム分のビルドは時間がかかるため、動作確認だけしたい場合はgoreleaser build--single-targetを付けると、実行しているマシンのOS・アーキテクチャ向けのバイナリだけをビルドできる。アーカイブ化やチェックサムの計算は行われず、ビルドのみが実行される。

$ goreleaser build --single-target --snapshot --clean
  • partial
  • snapshotting
    • building snapshot...                           version=0.0.0-SNAPSHOT-bbc9033
  • building binaries
    • partial build                                  match=target=darwin_arm64_v8.0
    • building                                       paths=[./cmd/myapp] binaries=[myapp] target=darwin_arm64_v8.0
  • build succeeded after 0s
  • thanks for using GoReleaser!

buildコマンドでも、タグの検証を省略するために--snapshotを付ける必要がある。

GOOS・GOARCHでビルド対象を指定する

--single-target使用時、環境変数GOOSGOARCHを指定すると、現在のマシン以外のターゲット向けにビルドできる。

$ GOOS=linux GOARCH=amd64 goreleaser build --single-target --snapshot --clean
  • partial build                                  match=target=linux_amd64_v1
    • building                                       paths=[./cmd/myapp] binaries=[myapp] target=linux_amd64_v1
  • build succeeded after 0s

-o オプションでバイナリの出力先を指定する

-o--output)オプションを使うと、ビルドしたバイナリを指定したパスにコピーできる。dist配下のディレクトリ構成を気にせず、バイナリの場所を直接指定したい場合に使う。

$ goreleaser build --single-target --snapshot --clean -o ./myapp
  • copying binary to "./myapp"
  • build succeeded after 0s

$ ./myapp
hello

関連記事