goreleaserlisted
Install: claude install-skill fmind/dot
# GoReleaser
Build, archive, checksum, sign, and publish Go binaries from one `.goreleaser.yaml` when a `v*` tag lands. The version, changelog, and tag come from [release](../release/SKILL.md) (git-cliff); images come from `ko` per [containerize](../containerize/SKILL.md); signatures follow [cosign](../cosign/SKILL.md).
## Workflow
1. **Config**: `goreleaser init` writes a starter; trim it to the minimum and keep GoReleaser out of changelog duty.
```yaml
version: 2
builds:
- main: ./cmd/<slug>
env: [CGO_ENABLED=0]
goos: [linux, darwin]
goarch: [amd64, arm64]
ldflags: [-s -w -X main.version={{.Version}}]
archives:
- formats: [tar.gz]
checksum:
name_template: checksums.txt
changelog:
disable: true # git-cliff owns CHANGELOG.md and the release notes
```
1. **Validate**: `goreleaser check` after every edit; `goreleaser healthcheck` confirms `git`, `cosign`, and `ko` are on the runner.
1. **Local dry run**: build every target without a tag and without publishing.
```bash
goreleaser release --snapshot --clean
goreleaser build --single-target --snapshot --clean -o dist/<slug> # this machine only
```
1. **CI**: a `release.yml` workflow on `push: tags: ['v*']` with `permissions: contents: write` (plus `id-token: write` when signing), `actions/checkout` with `fetch-depth: 0`, `jdx/mise-action` for the toolchain, then the release with git-cliff notes; this workflow owns the GitHub release, so skip the `g