mike-neckのブログ

Java or Groovy or Swift or Golang

メモ github actions で goreleaser を使ってリリースする

作ってるツールをどのように github の release に乗せればよいか調べていたところ、 goreleaser-action なる github actions 用の action があることを知り、 github actions の勉強がてら使い方を調べてみた

f:id:mike_neck:20191029232756p:plain

github.com


プロジェクトの構造はこんな感じで、ルートにあるパッケージを cj というディレクトリーにあるメインプログラムから参照する

.
├── .github/workflows
│   ├── release.yml
│   └── test.yml
├── .goreleaser.yml
├── Makefile
├── README.md
├── call.go
├── call_test.go
├── cj
│   ├── go.mod
│   ├── go.sum
│   └── main.go
├── go.mod
└── go.sum

github actions で使うのは主に次の2つのファイル

  • .github/workflows/release.yml
    • goreleaser を github actions から実行するためのジョブが書いてあるファイル
  • .goreleaser.yml
    • goreleaser 用のビルドファイルで、どの GOOS/GOARCH でビルドしてリリースするべきかを設定しているファイル

 .goreleaser.yml は次のような感じで、多分 goreleaser 単体で使うのと変わらないはず

builds:
-
  id: cj
  env:
  - CGO_ENABLED=0
  main: main.go
  dir: cj
  binary: cj
  goos:
    - linux
    - windows
    - darwin
  goarch:
    - amd64
archives:
- replacements:
    darwin: macOS
    linux: Linux
    windows: Windows
    386: i386
    amd64: x86_64
  name_template: "cj_{{.Version}}_{{.Os}}_{{.Arch}}"
  format: zip
  format_overrides:
    - goos: linux
      format: tar.gz
checksum:
  name_template: 'checksums.txt'
snapshot:
  name_template: "{{ .Tag }}-next"
changelog:
  sort: asc
  filters:
    exclude:
    - '^docs:'
    - '^test:'

release.yml は次のような感じで、ほぼドキュメントに書いてあるとおり

name: release

on:
  push:
    tags:
      - v*

jobs:
  release-cj:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v2

      - name: set up golang
        uses: actions/setup-go@v1

      - name: release
        uses: goreleaser/goreleaser-action@v1
        with:
          version: latest
          args: release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

若干手こずったのは以下の2つ

  • タグが正しいセムバーになっていないとビルドがコケるあたりと
  • ステップが非同期に行われているためか、ルートのパッケージを解決できないことがあったこと

なお、後者を解決するために上の yaml には書いていないが、 go get するステップを入れたりした。