用途
GoReleaser 用于自动化软件项目的发布流程,涵盖构建二进制文件、创建归档、发布到包管理器、构建 Docker 镜像以及生成变更日志。此技能适用于需要创建或配置 GoReleaser 发布流程的场景。
主要能力
技能按主题提供参考文件,覆盖以下任务:
- 构建配置:
references/builds.md - 归档(tar.gz、zip):
references/archives.md - Docker 镜像:
references/docker.md - Linux 软件包(deb/rpm):
references/nfpm.md - Homebrew/Scoop/AUR:
references/homebrew.md - 签名与公证:
references/signing.md - 变更日志生成:
references/changelog.md - CI/CD 集成:
references/ci.md - release-please 集成:
../release-please/references/release-please-goreleaser-unified-workflow.md - 模板变量:
references/templates.md - 完整示例:
references/examples.md
使用方式
基本命令
# 初始化新配置
goreleaser init
# 校验配置
goreleaser check
# 本地测试构建(不发布)
goreleaser release --snapshot --clean
# 创建发布(通常在 CI 中运行)
goreleaser release
配置文件
GoReleaser 使用 .goreleaser.yaml(或 .goreleaser.yml),可启用 schema 校验:
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
version: 2
# 项目名称(默认使用目录名)
project_name: myapp
最小 Go 配置
# 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:"
构建目标
Go(默认):
builds:
- builder: go # 可选,默认值
main: ./cmd/app
goos: [linux, darwin, windows]
goarch: [amd64, arm64]
goarm: ["6", "7"] # 用于 ARM 构建
Rust:
builds:
- builder: rust
targets:
- x86_64-unknown-linux-gnu
- x86_64-apple-darwin
- aarch64-apple-darwin
Zig:
builds:
- builder: zig
targets:
- x86_64-linux-gnu
- x86_64-macos
- aarch64-macos
预构建二进制文件:
builds:
- builder: prebuilt
prebuilt:
path: dist/myapp_{{ .Os }}_{{ .Arch }}/myapp{{ .Ext }}
常见模式
版本注入(Go):
builds:
- ldflags:
- -X main.version={{.Version}}
- -X main.commit={{.Commit}}
- -X main.date={{.Date}}
禁用 CGO:
builds:
- env:
- CGO_ENABLED=0
多个二进制文件:
builds:
- id: cli
main: ./cmd/cli
binary: myapp
- id: server
main: ./cmd/server
binary: myapp-server
发布
Homebrew Tap:
brews:
- repository:
owner: myorg
name: homebrew-tap
homepage: https://example.com
description: "My application"
Docker 镜像:
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: auto
环境变量
| 变量 | 用途 |
|---|---|
| GITHUB_TOKEN | GitHub API 访问 |
| GITLAB_TOKEN | GitLab API 访问 |
| GITEA_TOKEN | Gitea API 访问 |
| GORELEASER_KEY | Pro 许可证密钥 |
工作流
- 初始化:
goreleaser init创建.goreleaser.yaml - 配置:根据需要编辑配置(参见参考文件)
- 校验:
goreleaser check验证配置 - 测试:
goreleaser release --snapshot --clean在本地测试 - 发布:打标签并推送,CI 运行
goreleaser release
release-please 集成规则
当项目同时使用 release-please 和 GoReleaser 时,始终在统一工作流中实现(同一工作流文件),而不是分离的链式工作流。
使用 ../release-please/references/release-please-goreleaser-unified-workflow.md 作为标准集成配方。
- 首先运行
googleapis/release-please-action@v4。 - 使用其输出(release_created、tag_name)有条件地运行 GoReleaser。
- 在
goreleaser release --clean之前检出 ref:${{ needs.release-please.outputs.tag_name }}。 - 使用 GITHUB_TOKEN,避免仅为触发 GoReleaser 而引入自定义 PAT。
这可以避免 GitHub Actions 令牌递归问题,并消除 release-trigger PAT 变通方案的需要。
何时加载参考文件
- 设置构建:加载
references/builds.md获取完整构建选项 - 配置 Docker:加载
references/docker.md获取多架构镜像 - Linux 软件包:加载
references/nfpm.md获取 deb/rpm/apk 软件包 - 包管理器:加载
references/homebrew.md获取 Homebrew/Scoop/AUR 等 - CI 设置:加载
references/ci.md获取 GitHub Actions/GitLab CI - release-please 集成:加载
../release-please/references/release-please-goreleaser-unified-workflow.md获取无自定义 PAT 的统一工作流 - 模板语法:加载
references/templates.md获取可用变量 - 完整示例:加载
references/examples.md获取可直接复制的配置
适用场景
适用于软件项目的自动化发布流程,尤其是需要跨平台构建、多包管理器分发、Docker 镜像发布以及变更日志自动生成的场景,并可与 CI/CD 及 release-please 集成。
限制
资料中未提供关于收费、价格、平台限制或具体效果的信息,暂未提供。