Mackerel Advent Calendar 2020 9日目の参加記事です。隙間で書きました。
最近 mackerel pluginをリリースするときは、ほぼ全てGitHub ActionsとGoReleaserを使ってビルドとリリースしています。
GoReleaserはこちら
GoReleaserはGoのprojectをクロスプラットフォームでビルドし、GitHub Releaseなどにアップロードしてくれるツールです。これのおかげでかなりリリース作業が楽になりました。
準備
mackerel pluginのrepositoryに .goreleaser.yml
というファイルを作ります。
builds: - binary: mackerel-plugin-linux-process-status goos: - linux goarch: - amd64 - arm64 archives: - format: zip name_template: "{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}" release: github: owner: kazeburo name: mackerel-plugin-linux-process-status
こちらは mackerel-plugin-linux-process-status という plugin の設定ファイルです。linuxのみサポートなので、linux/amd64およびlinux/arm64用にバイナリをビルドします。
mkr plugin install
に対応したpluginはアーカイブのファイル名が(REPOSITORY_NAME)(GOOS)(GOARCH).zipという命名規則になっていることが必要です。
なので、archivesの name_templateに {{ .ProjectName }}_{{ .Os }}_{{ .Arch }}
を指定します。
これで、GoReleaserの準備は完了で、手元で、goreleaser --rm-dist
を実行すると、最新のタグを取得してビルドとGitHub Releaseへのアップロードを行ってくれます。楽。
また、GoReleaserは以下のような簡単なCHANGESを作ってくれるのもとても気に入っています。
GitHub Acitons を使う
ここまでできていたら、tagがつけられたらGitHub Acitonsでビルドとリリースを自動化するだけ。
.github/workflows/release.yml
などファイルを作成し
name: release on: push: tags: - "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: Setup 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: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GoReleaser用のActionが用意されているので、これを使うだけ
上記はサンプルそのままですな。
これで、
git tag v${VERSION} git push origin v${VERSION}
するだけで自動でパッケージの作成とリリースができるようになりました。簡単。
後書き
最近、公開してあったたくさんのmackerel pluginを一気にGitHub Actionsを利用するようにしたり、arm64での動作確認を行ってました。 その過程でtag追加を楽にするコマンドを作ったり、cgo含むprojectのGitHub Actionsでのクロスコンパイルをやってたりした話はまた今度できたらと思います。