SuperAPI AI 工具集

goreleaser

部署与运维

查看项目

更新于 10-15 08:10

技能介绍

用途

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 许可证密钥

工作流

  1. 初始化:goreleaser init 创建 .goreleaser.yaml
  2. 配置:根据需要编辑配置(参见参考文件)
  3. 校验:goreleaser check 验证配置
  4. 测试:goreleaser release --snapshot --clean 在本地测试
  5. 发布:打标签并推送,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 集成。

限制

资料中未提供关于收费、价格、平台限制或具体效果的信息,暂未提供。