# Release workflow — runs on any tag that starts with 'v' (e.g. v2.0.0-rc1). # # Responsibilities: # 1. Run the full test suite with the race detector. # 2. Build and publish binaries for macOS / Linux / Windows (amd64 + arm64) # via goreleaser-action. # 3. Attach them to a GitHub Release whose body comes from .goreleaser.yml # headers + CHANGELOG entries. # # What you need: # - Nothing beyond the default GITHUB_TOKEN that Actions provides. goreleaser # uses it to create the release. # # To cut a new release locally: # git tag -a v2.0.0-rc1 -m "v2.0.0 RC1" # git push origin v2.0.0-rc1 # Then watch the run under "Actions → Release". name: Release on: push: tags: - 'v*' permissions: contents: write # goreleaser needs this to create the release + upload assets. jobs: test: name: Test with race detector runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.21' - name: Cache Go modules uses: actions/cache@v4 with: path: | ~/.cache/go-build ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- - name: Verify modules run: go mod verify - name: Vet run: go vet ./... - name: Test (race detector) run: go test ./... -race -timeout 180s release: name: Build & publish binaries needs: test runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.21' - name: Run goreleaser uses: goreleaser/goreleaser-action@v6 with: distribution: goreleaser version: '~> v2' args: release --clean env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}