作ってるツールをどのように github の release に乗せればよいか調べていたところ、 goreleaser-action なる github actions 用の action があることを知り、 github actions の勉強がてら使い方を調べてみた
プロジェクトの構造はこんな感じで、ルートにあるパッケージを 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 用のビルドファイルで、どの
.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
するステップを入れたりした。