Hateburo: kazeburo hatenablog

SRE / 運用系小姑 / Goを書くPerl Monger

GitHub ActionsとGoReleaserでmkr plugin install対応mackerel pluginをリリースする

Mackerel Advent Calendar 2020 9日目の参加記事です。隙間で書きました。

最近 mackerel pluginをリリースするときは、ほぼ全てGitHub ActionsとGoReleaserを使ってビルドとリリースしています。

GoReleaserはこちら

goreleaser.com

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という命名規則になっていることが必要です。

mackerel.io

なので、archivesの name_templateに {{ .ProjectName }}_{{ .Os }}_{{ .Arch }} を指定します。

これで、GoReleaserの準備は完了で、手元で、goreleaser --rm-dist を実行すると、最新のタグを取得してビルドとGitHub Releaseへのアップロードを行ってくれます。楽。

また、GoReleaserは以下のような簡単なCHANGESを作ってくれるのもとても気に入っています。

f:id:kazeburo:20201209162731p:plain

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が用意されているので、これを使うだけ

github.com

上記はサンプルそのままですな。

これで、

git tag v${VERSION}
git push origin v${VERSION}

するだけで自動でパッケージの作成とリリースができるようになりました。簡単。

後書き

最近、公開してあったたくさんのmackerel pluginを一気にGitHub Actionsを利用するようにしたり、arm64での動作確認を行ってました。 その過程でtag追加を楽にするコマンドを作ったり、cgo含むprojectのGitHub Actionsでのクロスコンパイルをやってたりした話はまた今度できたらと思います。