name: Release Go binaries # Two paths land here: # pull_request — runs the test job (vet + race-detector tests across the # whole module) so every PR proves the binary still builds and passes # all tests, not just cmd/molecule. # push tags v* — runs test + GoReleaser to cut multi-OS binaries (linux/ # darwin/windows × amd64/arm64), checksums, and a GitHub Release. The # release config lives in .goreleaser.yaml. # # Why GoReleaser over inline `go build`: checksums, release notes from # git commits, and one config file that future channels (Homebrew tap, # scoop bucket, Chocolatey) hook into without adding new workflow steps. on: push: tags: ['v*'] pull_request: paths: - '**.go' - 'go.mod' - 'go.sum' - '.github/workflows/release.yml' - '.goreleaser.yaml' permissions: contents: write jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: go-version: '1.25' cache: true - name: Tidy run: go mod tidy && git diff --exit-code go.sum # Vet covers the whole module — was previously scoped to three # packages, which silently let regressions in internal/backends/ # or internal/connect/ ship. - name: Vet run: go vet ./... # Race detector required: the connect orchestrator runs # heartbeat + poll goroutines concurrently. A race here would # corrupt cursor state. - name: Test run: go test -race -count=1 ./... release: runs-on: ubuntu-latest needs: [test] if: startsWith(github.ref, 'refs/tags/v') steps: - uses: actions/checkout@v4 with: # GoReleaser needs full history for its commit-based # changelog. fetch-depth: 0 pulls everything. fetch-depth: 0 - uses: actions/setup-go@v5 with: go-version: '1.25' cache: true - name: Validate goreleaser config uses: goreleaser/goreleaser-action@v6 with: version: '~> v2' args: check - name: Run GoReleaser uses: goreleaser/goreleaser-action@v6 with: version: '~> v2' args: release --clean env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}