Go言語 GitHub Actions テストとリリース
GitHub Actions で Go のテストとリリースページでの配布を自動化したい
ディレクトリ構成
. ├── .github │ └── workflows │ ├── release.yml │ └── test.yml ├── .goreleaser.yml ├── hello.go ├── hello_test.go ├── README.md ├── LICENSE └── cmd └── hello └── main.go
目次
テスト
GitHub Actions のドキュメント:https://docs.github.com/ja/actions
以下 push 時にブランチが main だったら依存関係をダウンロードしてテストを実行する。
.github/workflows/test.yml
name: Test on: push: branches: - main jobs: test: name: Test runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Set up Go uses: actions/setup-go@v2 with: go-version: 1.16 - name: Get dependencies run: go get -v -t -d ./... - name: Test code run: go test -v .
ステータスバッジは README.md
に以下のように書いておけば表示できる。
[![Test](https://github.com/ユーザー名/リポジトリ名/actions/workflows/test.yml/badge.svg)](https://github.com/ユーザー名/リポジトリ名/actions/workflows/test.yml)
リリース
goreleaserを使えばクロスコンパイルからすべてやってくれる
(actions に関する goreleaser のドキュメント: https://goreleaser.com/ci/actions/)
.github/workflows/release.yml
name: Release on: push: tags: - 'v[0-9]+*' jobs: goreleaser: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Set up Go uses: actions/setup-go@v2 with: go-version: 1.16 - name: Run GoReleaser uses: goreleaser/goreleaser-action@v2 with: version: latest args: release --rm-dist env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
本来は workflow_run
を使ってテスト後にリリースを実行したい。テストに成功して且つタグを付けてるときにだけ実行するように、以下のような感じで色々試したけどうまくいかない。なので上記のように tags: 'v[0-9]+*'
とすることにした
name: Release on: workflow_run: workflows: ["Test"] types: - completed jobs: goreleaser: if: ${{ startsWith(github.ref, 'refs/tags/v') && github.event.workflow_run.conclusion == 'success' }}
goreleaserの設定ファイル
(.goreleaser.yml に関するドキュメント: https://goreleaser.com/customization/archive/)
.goreleaser.yml
env: - GO111MODULE=on - CGO_ENABLED=0 before: hooks: - go mod tidy builds: - main: ./cmd/hello/ binary: hello goos: - linux - windows - darwin # - freebsd goarch: - amd64 # - 386 # - arm # - arm64 ldflags: - -s -w - -X main.Name={{.ProjectName}} - -X main.Version={{.Version}} archives: - name_template: '{{.ProjectName}}_{{.Os}}_{{.Arch}}' replacements: 386: i386 amd64: x86_64 format_overrides: - goos: windows format: zip files: - README.md - LICENSE checksum: name_template: 'checksums.txt' release: draft: true