GoReleaser Skill
GoReleaser automates the release process for software projects. It builds binaries, creates archives, publishes to package managers, builds Docker images, and generates changelogs.
Quick Reference
| Task | Reference File |
|---|---|
| Build configuration | references/builds.md |
| Archives (tar.gz, zip) | references/archives.md |
| Docker images | references/docker.md |
| Linux packages (deb/rpm) | references/nfpm.md |
| Homebrew/Scoop/AUR | references/homebrew.md |
| Signing & notarization | references/signing.md |
| Changelog generation | references/changelog.md |
| CI/CD integration | references/ci.md |
| release-please integration | ../release-please/references/release-please-goreleaser-unified-workflow.md |
| Template variables | references/templates.md |
| Complete examples | references/examples.md |
Essential Commands
# Initialize new config
goreleaser init
# Validate configuration
goreleaser check
# Test build locally (no publish)
goreleaser release --snapshot --clean
# Create release (usually run in CI)
goreleaser releaseConfiguration File
GoReleaser uses .goreleaser.yaml (or .goreleaser.yml). Enable schema validation:
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
version: 2
# Project name (defaults to directory name)
project_name: myappMinimal Go Configuration
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
version: 2
builds:
- main: ./cmd/myapp
binary: myapp
goos: [linux, darwin, windows]
goarch: [amd64, arm64]
ldflags:
- -s -w
- -X main.version={{.Version}}
archives:
- formats: [tar.gz]
format_overrides:
- goos: windows
formats: [zip]
changelog:
sort: asc
filters:
exclude:
- "^docs:"
- "^test:"Build Targets
Go (default)
builds:
- builder: go # optional, default
main: ./cmd/app
goos: [linux, darwin, windows]
goarch: [amd64, arm64]
goarm: ["6", "7"] # for ARM buildsRust
builds:
- builder: rust
targets:
- x86_64-unknown-linux-gnu
- x86_64-apple-darwin
- aarch64-apple-darwinZig
builds:
- builder: zig
targets:
- x86_64-linux-gnu
- x86_64-macos
- aarch64-macosPrebuilt Binaries
builds:
- builder: prebuilt
prebuilt:
path: dist/myapp_{{ .Os }}_{{ .Arch }}/myapp{{ .Ext }}Common Patterns
Version Injection (Go)
builds:
- ldflags:
- -X main.version={{.Version}}
- -X main.commit={{.Commit}}
- -X main.date={{.Date}}CGO Disabled
builds:
- env:
- CGO_ENABLED=0Multiple Binaries
builds:
- id: cli
main: ./cmd/cli
binary: myapp
- id: server
main: ./cmd/server
binary: myapp-serverPublishing
Homebrew Tap
brews:
- repository:
owner: myorg
name: homebrew-tap
homepage: https://example.com
description: "My application"Docker Images
dockers_v2:
- dockerfile: Dockerfile
images:
- "ghcr.io/myorg/myapp:{{ .Tag }}"
- "ghcr.io/myorg/myapp:latest"GitHub Release
release:
github:
owner: myorg
name: myrepo
draft: false
prerelease: autoEnvironment Variables
| Variable | Purpose |
|---|---|
GITHUB_TOKEN | GitHub API access |
GITLAB_TOKEN | GitLab API access |
GITEA_TOKEN | Gitea API access |
GORELEASER_KEY | Pro license key |
Workflow
- Initialize:
goreleaser initcreates.goreleaser.yaml - Configure: Edit config for your needs (see reference files)
- Validate:
goreleaser checkverifies configuration - Test:
goreleaser release --snapshot --cleantests locally - Release: Tag and push, CI runs
goreleaser release
release-please Integration Rule
When a project uses both release-please and GoReleaser, always implement them in a unified workflow (same workflow file) instead of separate chained workflows.
Use ../release-please/references/release-please-goreleaser-unified-workflow.md as the canonical integration recipe.
- Run
googleapis/release-please-action@v4first. - Use its outputs (
release_created,tag_name) to conditionally run GoReleaser. - Checkout
ref: ${{needs.release-please.outputs.tag_name}}beforegoreleaser release --clean. - Use
GITHUB_TOKENand avoid introducing a custom PAT just to trigger GoReleaser.
This avoids GitHub Actions token recursion issues and removes the need for release-trigger PAT workarounds.
When to Load References
- Setting up builds: Load
references/builds.mdfor complete build options - Configuring Docker: Load
references/docker.mdfor multi-arch images - Linux packages: Load
references/nfpm.mdfor deb/rpm/apk packages - Package managers: Load
references/homebrew.mdfor Homebrew/Scoop/AUR/etc. - CI setup: Load
references/ci.mdfor GitHub Actions/GitLab CI - release-please integration: Load
../release-please/references/release-please-goreleaser-unified-workflow.mdfor the unified no-custom-PAT workflow - Template syntax: Load
references/templates.mdfor available variables - Complete examples: Load
references/examples.mdfor copy-paste configs