Goreleaserを使ってGithub Actionsを使ってみた
前回はGithubActionsをそのまま使って、ビルドからリリース作成・ファイルのアップロードをやってみましたが、これらの処理をお手軽かつよしなにしてくれるのがGoreleaserです。
では前回のワークフローファイルを全部消したらスタートです。
まず、ワークフローファイルの作成ですが、公式ドキュメントにあるものをそのままコピペします。
name: goreleaser on: pull_request: push: jobs: goreleaser: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Unshallow run: git fetch --prune --unshallow - name: Set up Go uses: actions/setup-go@v2 with: go-version: 1.14 - name: Run GoReleaser uses: goreleaser/goreleaser-action@v2 with: version: latest args: release --rm-dist env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
トリガーだけ、前回同様にタグが付いた時などに変更してよいでしょう。
ちなみにmain.go
がプロジェクトルートに無い場合goreleaser
アクションを呼んでいるステップのwith
にworkdir
を追加して指定することができます。
次にGoプロジェクトのルートに.goreleaser.yml
を設置します。
なお、Goreleaserはコマンドラインで使うこともでき、その際に必要なのがこの.goreleaser.yml
で、上記のワークフローファイルはGithubActionsを動かすのに必要なモノで別物なのです。GithubActionsで呼ばれているアクション経由でこの.goreleaser.yml
が使われる形になります。
参考までにコマンドラインで初期化した際に生成される.goreleaser.yml
は以下です。(記事投稿時)
before: hooks: # You may remove this if you don't use go modules. - go mod download # you may remove this if you don't need go generate - go generate ./... builds: - 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:'
公式ドキュメントに使える設定が書いているのでさらっと見ておくことをお勧めします。
今回、この.gorelease.yml
を以下のように変更します。
project_name: YourProjectName builds: - ldflags: - -s -w archives: - name_template: '{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}' replacements: 386: i386 amd64: x86_64 format_overrides: - goos: windows format: zip
project_name
は指定しなくてもGithubやGitlabから自動的に取ってくるようですが、指定したほうが確実にこの値になるので指定しています。
builds
にビルドに関わるアレコレを記述していきます。今回は最小限の内容で、おまじないとしてldflags
に-s -w
を入れておきます。(詳しくはこちらなど)
archives
はリリースへアップロードするファイルに関する設定ができます。
name_template
はGolangのtemplateに沿って記述が出来るので、ドキュメントに無いif文等も使えるようです。
replacements
はGOOS
とGOARCH
の文字列を置換する設定です。特にこだわりがなければ記述無しでOKです。
format_overrides
は「Windowsではzipで配布したい」というときに、このようにGOOSとフォーマットを設定すると、対応したOSだけデフォルトのtar.gzからzipへ変更できます。
ちなみに今回はGo1.14を使っている(ワークフローのファイルで指定している)ので、環境変数にモジュールをONにする記述を記載しませんでしたが、問題なくビルドしたものも動きました。
他にもいろいろ設定できますが、上記だけで次のような感じで自動的にリリースへファイルがアップロードされます。プラットフォーム毎にビルドコマンドとか考えなくて一発で出来てしまう。。。めちゃくちゃ便利で簡単・・・!
参考
Go で書いた CLI ツールのリリースは GoReleaser と GitHub Actions で個人的には決まり | tellme.tokyo