GitHub ActionsとGoReleaserでmkr plugin install対応mackerel pluginをリリースする
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でのクロスコンパイルをやってたりした話はまた今度できたらと思います。