自定义

GoReleaser通过提供多种自定义的.goreleaser.yml文件.

您可以通过运行goreleaser init生成它,或者从头开始。默认值都是合理的,适合大多数项目.

Table of Contents:

项目 名称

项目名称用于Brew公式,存档等的名称。如果没有给出,则将从Git项目的名称推断出.

# .goreleaser.yml
project_name: myproject

全局 钩子

某些构建可能需要在构建之前,进行预构建步骤,例如,go generate。其before部分允许在构建开始之前,执行的全局钩子.

配置很简单,这是一个完整的例子:

# .goreleaser.yml
before:
  hooks:
  - make clean
  - go generate ./...
  - go mod download

如果任何钩子失败,则中止构建过程.

重点注意的是,你不能拥有”复杂”的命令,比如bash -c "echo foo bar"或者foo | bar或类似的东西。如果你需要做的事情,比只调用带有某些参数的命令更复杂,可以将它包装在shell脚本中,或者包含在你的Makefile脚本中.

命名 模版

GoReleaser的配置文件中的几个字段支持模板.

这些字段通常以_template为后缀,但有时不是。每个部分的文档应明确指出模板可用的字段.

在支持模板的字段上,此字段始终可用:

描述
.ProjectName 项目名称
.Version 正在发布的版本(剥离v前缀)
.Tag 当前的git标签
.ShortCommit git提交短哈希
.FullCommit git提交完整哈希
.Commit git commit hash(不建议使用)
.GitURL git远程网址
.Major 该版本的主要部分
.Minor 版本的次要部分
.Patch 版本的补丁部分
.Env 带有系统环境变量的地图
.Date RFC3339格式的当前UTC日期
.Timestamp Unix格式的当前UTC时间

在与单个存档(例如,二进制名称)相关的字段上,您能有一些额外的字段:

描述
.Os GOOS(通常允许更换)
.Arch GOARCH(通常允许更换)
.Arm GOARM(通常允许更换)
.Binary 二进制名称
.ArtifactName 存档名称

在所有字段中,您都有以下可用功能:

用法 描述
time "01/02/2006" 指定格式的当前UTC时间

使用所有这些字段,您可以按照自己想要的方式组合存档的名称:

example_template: '{{ .ProjectName }}_{{ .Env.USER }}_{{ time "2006" }}'

例如,如果要将go版本添加到某个存档:

foo_template: 'foo_{{ .Env.GOVERSION }}'

然后你可以运行:

GOVERSION_NR=$(go version | awk '{print $3;}') goreleaser

请注意,这些是假设的示例和foo_templateexample_template字段不是有效的GoReleaser配置.

构建

可以通过多种方式自定义构建.您可以指定哪个GOOS,GOARCHGOARM构建二进制文件(goreleaser将生成所有组合的矩阵),您可以更改二进制文件的名称,命令参数,环境变量,钩子等.

这是一个builds注释,指定了所有字段部分:

# .goreleaser.yml
builds:
  # 你能用 多个 构建 定义,yaml格式
  -
    #  main.go 文件或者主包的路径 .
    # 默认 `.`.
    main: ./cmd/main.go

    # 命名 最终二进制文件的模版.
    # 默认是 项目目录的名称.
    binary: program

    # 设置 命令参数到自定义的 build tags.
    # 默认是 空.
    flags:
      - -tags=dev

    # Custom asmflags templates.
    # 默认是 空.
    asmflags:
      - -D mysymbol
      - all=-trimpath={{.Env.GOPATH}}

    # Custom gcflags templates.
    # 默认是 空.
    gcflags:
      - all=-trimpath={{.Env.GOPATH}}
      - ./dontoptimizeme=-N

    # Custom ldflags templates.
    # 默认是 `-s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}`.
    ldflags:
     - -s -w -X main.build={{.Version}}
     - ./usemsan=-msan

    # 运行构建期间的环境变量.
    # 默认是 空.
    env:
      - CGO_ENABLED=0

    # GOOS 构建列表r.
    # 更多内容,请参考: https://golang.org/doc/install/source#environment
    # 默认为 darwin 和 linux.
    goos:
      - freebsd
      - windows

    # GOARCH 构建系结构.
    # 更多内容,请参考: https://golang.org/doc/install/source#environment
    # 默认为 386 和 amd64.
    goarch:
      - amd64
      - arm
      - arm64

    # GOARM 要构建的 , 若GOARCH 是 arm时.
    # 更多内容,请参考: https://golang.org/doc/install/source#environment
    # 默认是 只有 6.
    goarm:
      - 6
      - 7

    #  GOOS + GOARCH + GOARM 组合忽略列表.
    # 默认是 空.
    ignore:
      - goos: darwin
        goarch: 386
      - goos: linux
        goarch: arm
        goarm: 7

    # Hooks 可用于 自定义最终二进制文件,
    # 例如, 运行 generators.
    # 默认 都为 空.
    hooks:
      pre: rice embed-go
      post: ./script.sh

了解有关命名模板引擎的更多信息。

将环境变量传递给ldflags

你可以通过在模板中使用{{ .Env.VARIABLE_NAME }}来做到这一点,例如:

builds:
  - ldflags:
   - -s -w -X "main.goversion={{.Env.GOVERSION}}"

然后你可以运行:

GOVERSION=$(go version) goreleaser

Go模块

如果你使用Go 1.11的go模块vgo,当GoReleaser运行时,它可能会尝试下载依赖项。由于多个构建并行运行,因此很可能会失败.

你可以在启动goreleaser之前,通过运行go mod download解决这个问题,或者添加一个hook,像这样.goreleaser.yaml文件:

before:
  hooks:
  - go mod download
# rest of the file...

存档文件

构建的二进制文件将与READMELICENSE文件一起存档到tar.gz文件。在archive里面您可以自定义存档名称,其他文件和格式.

这是一个archive,指定了所有字段部分的注释:

# .goreleaser.yml
archive:
  # 存档 命名 模版.
  # 默认:
  # - if 格式为 `tar.gz` 或者 `zip`:
  #   - `{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}`
  # - if 格式为 是 `binary`:
  #   - `{{ .Binary }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}`
  name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}"

  # 替换 存档名称中的 GOOS 和 GOARCH.
  # Keys 应为合法 GOOSs 或 GOARCHs.
  # Values 应为 恰当的替代名称.
  # 默认是 空.
  replacements:
    amd64: 64-bit
    386: 32-bit
    darwin: macOS
    linux: Tux

  # 设为 true, 如果你想 所有 文件都包裹进存档文件.
  # 若设为 true 和 你 解压'goreleaser_Linux_arm64.tar.gz',
  # 你会得到 'goreleaser_Linux_arm64' 文件夹.
  # If 设为 false, 所有文件都分离开来.
  # 默认是 false.
  wrap_in_directory: true

  # Archive 格式. 合法选项 `tar.gz`, `zip` and `binary`.
  # 若 `binary`, 压缩文件不创建,且 binaries 代之直接上传.
  # 与 name_template 合作 和 下面 files字段中会被忽略.
  # 默认是 `tar.gz`.
  format: zip

  # 可根据 GOOSs,指定 格式.
  # 常见情况是,window下为zip格式.
  # 默认是 空.
  format_overrides:
    - goos: windows
      format: zip

  # 你想加入到 archive,匹配的 files/globs,.
  # 默认为匹配 `LICENCE*`, `LICENSE*` ,
  # `README*` 和 `CHANGELOG*` (大小写略) 的文件.
  files:
    - LICENSE.txt
    - README.md
    - CHANGELOG.md
    - docs/*
    - design/*.png
    - templates/**/*

了解有关命名模板引擎的更多信息.

您可以使用 glob表示法 添加整个文件夹,其子文件夹和文件,例如:myfolder/**/*.

仅包装二进制文件

由于,如果文件列表为空,GoReleaser将始终添加READMELICENSE文件到存档。所以您需要提供把 archive 下的files填充.

极客工作,是使用这样的东西:

# goreleaser.yml
archive:
  files:
  - none*

这将添加 none* glob匹配的所有文件,假设您没有与该glob匹配的任何文件,会将二进制文件添加到存档中.

有关更多信息,请查看#602

Checksum-校验

GoReleaser生成一个project_1.0.0_checksums.txt文件,并在发布时上传,以便您的用户可以验证下载的文件是否正确.

checksum部分允许自定义文件名:

# .goreleaser.yml
checksum:
  # 选择 checksums 的名称.
  # 默认为 `{{ .ProjectName }}_{{ .Version }}_checksums.txt`.
  name_template: "{{ .ProjectName }}_checksums.txt"

了解有关命名模板引擎的更多信息.

Signing-签名

GoReleaser可以对部分或全部生成的存档进行签名。签名可确保您自己生成的存档与您的公共签名密钥,您的用户可以验证他们生成的签名.

签名与校验文件结合使用,通常只对签校验文件就足够了.

默认配置是,使用GnuPG的校验文件,创建签名和你的默认密钥。要启用签名,只需添加

# goreleaser.yml
sign:
   artifacts: checksum

要自定义签名流程,您可以使用以下选项:

# .goreleaser.yml
sign:
  #  signature 文件名称.
  # '${artifact}' 是应 sign 的存档路径.
  #
  # signature: "${artifact}.sig"

  # signature 命令路径
  #
  # cmd: gpg

  # 上面 command 的参数
  #
  # 使用特定 key,去sign 
  # args: ["-u", "<key id, fingerprint, email, ...>", "--output", "${signature}", "--detach-sign", "${artifact}"]
  #
  # args: ["--output", "${signature}", "--detach-sign", "${artifact}"]


  # 哪些要 sign
  #
  #   checksum: 只有 checksum 文件(s)
  #   all:      所有
  #   none:     不 signing
  #
  # artifacts: none

Snapshots-快照

有时我们希望生成项目的完整版本,但既不想验证任何内容,也不想将其上传到任何地方。GoReleaser支持这个--snapshot参数和snapshot的定制部分:

# .goreleaser.yml
snapshot:
  # 允许你更改生成的快照名称
  # 默认为 `SNAPSHOT-{{.Commit}}`.
  name_template: SNAPSHOT-{{.Commit}}

了解有关命名模板引擎的更多信息.

NFPM

GoReleaser可以连到nfpm,生成和发布.deb.rpm包.

可用选项:

#.goreleaser.yml
nfpm:
  # 包名
  # Default: `{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}`
  name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}"

  # 替换 存档名称中的 GOOS 和 GOARCH.
  # Keys 应为合法 GOOSs 或 GOARCHs.
  # Values 应为 恰当的替代名称.
  # 默认是 空.
  replacements:
    amd64: 64-bit
    386: 32-bit
    darwin: macOS
    linux: Tux

  # 你应用的 vendor.
  # 默认为 空
  vendor: Drum Roll Inc.
  # 你应用的 homepage.
  # 默认为 空
  homepage: https://example.com/

  # 你应用的 主项目人 (可能时 you).
  # 默认为 空
  maintainer: Drummer <drum-roll@example.com>

  # 你应用的 描述.
  # 默认为 空
  description: Software to create fast and easy drum rolls.

  # 你应用的 license.
  # 默认为 空
  license: Apache 2.0

  # 生成格式.
  formats:
    - deb
    - rpm

  # 你包所依赖的包。
  dependencies:
    - git
    - zsh

  # 软件包建议安装的软件包。
  # 对于RPM软件包,需要rpmbuild >= 4.13
  recommends:
    - bzr
    - gtk

  # 软件包建议安装的软件包。
  # 对于RPM软件包,需要rpmbuild >= 4.13
  suggests:
    - cvs
    - ksh

  # 与您的包冲突的包。
  conflicts:
    - svn
    - bash

  # 覆盖二进制文件的默认目的地为 /usr/local/bin
  bindir: /usr/bin

  # 应该由你程序实现创建和管理的空文件夹。
  # 默认为空
  empty_folders:
  - /var/log/foobar

  # 要添加到包中的文件或目录(超出二进制文件)。
  # Key 是从 源 路径/globs 中获取文件。
  # Value 是包中文件的目标位置。
  files:
    "scripts/etc/init.d/": "/etc/init.d"
    "path/**/glob": "/var/foo/glob"

  # 要添加到包中的配置文件。它们大致与上面fiels相同
  # ,但包管理器对待它们方式不同(同时
  # 卸载,主要是)。
  # Key 是从 源 路径/globs 中获取文件。
  # Value 是包中文件的目标位置。
  config_files:
    "tmp/app_generated.conf": "/etc/app.conf"
    "conf/*.conf": "/etc/foo/"

  # 在安装包期间执行的脚本。
  # Key 是安装过程的阶段
  # Values 是将要执行的脚本的路径
  scripts:
    preinstall: "scripts/preinstall.sh"
    postinstall: "scripts/postinstall.sh"
    preremove: "scripts/preremove.sh"
    postremove: "scripts/postremove.sh"

  # 每个包格式,可以覆盖一些属性。
  overrides:
    deb:
      conflicts:
        - subversion
      dependencies:
        - git
      suggests:
        - gitk
      recommends:
        - tig
      empty_folders:
      - /var/log/bar
    rpm:
      replacements:
        amd64: x86_64
      name_template: "{{ .ProjectName }}-{{ .Version }}-{{ .Arch }}"
      files:
        "tmp/man.gz": "/usr/share/man/man8/app.8.gz"
      config_files:
        "tmp/app_generated.conf": "/etc/app-rpm.conf"
      scripts:
        preinstall: "scripts/preinstall-rpm.sh"

了解有关命名模板引擎的更多信息.

请注意,GoReleaser不会为你安装rpmbuild或任何依赖.就目前而言,如果要生成rpm包,rpmbuild是需要的, 建议使用apt-get install rpm要么brew install rpm安装它.

Snapcraft

GoReleaser也可以生成snap包.snapcraft是一种新的打包格式,可以让您将项目直接发布到Ubuntu商店。从那里它将安装在所有的支持的Linux发行版,具有自动和更新事件。

你可以在snapcraft 文档中阅读更多相关信息.

可用选项:

# .goreleaser.yml
snapcraft:
  # 您可以更改包的名称。
  # Default: `{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}`
  name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}"

  # 替换包名称中的 GOOS和GOARCH。
  # key 应该是有效的 GOOS或GOARCH。
  # value 是各自的替代品。
  # 默认值为空。
  replacements:
    amd64: 64-bit
    386: 32-bit
    darwin: macOS
    linux: Tux

  # snap的名称。这是可选的。
  # 默认为项目名称。
  name: drumroll

  # 然后将snap发布到snapcraft商店。
  # 请记住,您首先需要`snapcraft login`。
  # 默认值为false。
  publish: true

  # 您提供了惊人的snap软件。
  # 最多79个字符。
  summary: Software to create fast and easy drum rolls.

  # 这是您的snap的描述。你有一两段话要告诉你
  # 关于snap的最重要的故事。保持在100字以内,
  # 我们住在推文空间,你的描述希望在短时间内看起来很好
  # 商店。
  description: |
    这是最好的滚筒应用。
     安装它,愉快!

  # 在它准备好了,将snap发布给所有用户之前的挡板,
  # `devel`将让你只发布到'edge`和'beta`版本到商店
  # `stable`也会让你发布`candidate`和`stable`版本
  # 有关该频道的更多信息:
  # Https://snapcraft.io/docs/reference/channels
  grade: stable

  # 您可以设置snap,以遵循三种不同的限制策略:
  # `strict`,`devmode`和`classic`。
  # 快速严格的限制建议仅在您自己的命名空间中进行读写。
  # 额外严格捕获的权限可以声明为应用程序的“插件”,这里
  # 我稍后会解释。有关限制的更多信息:
  # Https://snapcraft.io/docs/reference/confinement
  confinement: strict

  # GoReleaser构建的每个二进制文件都是snap中的应用程序。在这一部分
  # 您可以声明这些二进制文件的其他详细信息。这是可选的。
  apps:

    # 应用程序的名称必须,与二进制构建的名称或snap的名称相同。
    drumroll:

      # 如果您的应用需要其他权限,才能在其默认值之外工作
      # 下面空间中,宣布它们。
      # 您可以阅读有关可用插头的文档
      # 允许的可用内容:
      # Https://snapcraft.io/docs/reference/interfaces。
      plugs: ["home", "network"]

      # 如果您希望自己的应用始终自动后台启动
      # 你可以使它成为一个简单的守护进程。
      daemon: simple

      # 如果要将args传递给二进制文件,可以使用
      # Args选项。
      args: --foo

了解有关命名模板引擎的更多信息.

请注意,GoReleaser不会安装snapcraft,或它的任何依赖.

Homebrew

在发布到GitHub之后,GoReleaser可以生成,并发布一个*homebrew-tap*食谱放入您有权访问的存储库中.

brew部分指定应如何创建配方。你可以查看一下Homebrew文档配方-formula,食谱-cookbook更多细节.

# .goreleaser.yml
brew:
  # 食谱的名称模板
  # 默认为项目名称
  name: myproject

  # 用于push 的 tap存储库。
  github:
    owner: user
    name: homebrew-tap

  # 网址模板。
  # 默认为 "https://github.com/<repo_owner>/<repo_name>/releases/download/{{ .Tag }}/{{ .ArtifactName }}"
  url_template: "http://github.mycompany.com/foo/bar/releases/{{ .Tag }}/{{ .ArtifactName }}"

  # 允许您设置自定义下载策略。
  # 默认为空。
  download_strategy: GitHubPrivateRepositoryReleaseDownloadStrategy

  # 提交存储库的 Git作者。
  # 显示默认值。
  commit_author:
    name: goreleaserbot
    email: goreleaser@carlosbecker.com

  # 存储库中,放置配方的文件夹。
  # 默认为根文件夹。
  folder: Formula

  # 为二进制文件的用户提供警告。
  # 默认为空。
  caveats: "How to use this binary"

  # 您应用的主页。
  # 默认为空。
  homepage: "https://example.com/"

  # 你的应用程序的描述。
  # 默认为空。
  description: "Software to create fast and easy drum rolls."

  # 设置此项,将阻止goreleaser实际提交更新配方
  # 替代为,配方文件仅存储在dist文件夹中,
  # 将push的责任给用户。
  # 默认值为false。
  skip_upload: true

  # 你的包所依赖的包。
  dependencies:
    - git
    - zsh

  # 与您的包冲突的包。
  conflicts:
    - svn
    - bash

  # 指定作为服务运行的包。
  # 默认为空。
  plist: |
    <?xml version="1.0" encoding="UTF-8"?>
    ...

  # 你可以"brew test"你的配方。
  # 默认为空。
  test: |
    system "#{bin}/program --version"
    ...

  # brew的自定义安装脚本。
  # 默认为'bin.install "program"'。
  install: |
    bin.install "program"
    ...

了解有关命名模板引擎的更多信息.

通过定义brew部分,GoReleaser将负责发布Homebrew tap.假设当前标签是v1.2.3,上面的配置会生成一个program.rb配方, 其在user/homebrew-tap库的Formula文件夹中:

class Program < Formula
  desc "How to use this binary"
  homepage "https://github.com/user/repo"
  url "https://github.com/user/repo/releases/download/v1.2.3/program_v1.2.3_macOs_64bit.zip"
  version "v1.2.3"
  sha256 "9ee30fc358fae8d248a2d7538957089885da321dca3f09e3296fe2058e7fff74"

  depends_on "git"
  depends_on "zsh"

  def install
    bin.install "program"
  end
end

重点:请注意,GoReleaser尚未生成有效的homebrew-core配方.生成的配方旨在发布为homebrew taps,并且目前的形式不会被任何官方brew软件库接受.

Scoop

在发布到GitHub之后,GoReleaser可以生成,并发布一个 Scoop App Manifest 到您有权访问的存储库.

scoop部分指定应如何创建清单。请参阅下面的注释示例:

# .goreleaser.yml
scoop:
  # 网址模板。
  # 默认为"https://github.com/<repo_owner>/<repo_name>/releases/download/{{ .Tag }}/{{ .ArtifactName }}"
  url_template: "http://github.mycompany.com/foo/bar/releases/{{ .Tag }}/{{ .ArtifactName }}"

  # 将应用清单推送到的存储库。
  bucket:
    owner: user
    name: scoop-bucket

  # 提交存储库的Git作者。
  # 显示默认值。
  commit_author:
    name: goreleaserbot
    email: goreleaser@carlosbecker.com

  # 您应用的主页。
  # 默认为空。
  homepage: "https://example.com/"

  # 你的应用程序的描述。
  # 默认为空。
  description: "Software to create fast and easy drum rolls."

  # 你的应用许可证
  # 默认为空。
  license: MIT

  # 在应用程序更新之间,保留的数据
  persist:
  - "data"
  - "config.toml"

通过定义scoop部分,GoReleaser将负责发布Scoop应用程序。假设项目名称是drumroll且目前的标签是v1.2.3,上面的配置会生成一个drumroll.json清单,显示在bucket字段指定的存储库根目录.

{
  "version": "1.2.3",
  "architecture": {
    "64bit": {
      "url":
        "https://github.com/user/drumroll/releases/download/1.2.3/drumroll_1.2.3_windows_amd64.tar.gz",
      "bin": "drumroll.exe",
      "hash": "86920b1f04173ee08773136df31305c0dae2c9927248ac259e02aafd92b6008a"
    },
    "32bit": {
      "url":
        "https://github.com/user/drumroll/releases/download/1.2.3/drumroll_1.2.3_windows_386.tar.gz",
      "bin": "drumroll.exe",
      "hash": "283faa524ef41987e51c8786c61bb56658a489f63512b32139d222b3ee1d18e6"
    }
  },
  "homepage": "https://example.com/"
}

然后,您的用户可以执行以下操作来安装您应用

scoop bucket add app https://github.com/org/repo.git
scoop install app

你可以查看一下Scoop文档更多细节.

Release-版告

GoReleaser 根据当前标记,创建 GitHub 版本,上传所有存档,并根据自上一个标记以来的新提交生成更改日志-changelog.

让我们来看看可以定制的release部分内容:

# .goreleaser.yml
release:
  # 要release的存储库。
  # 默认值从原始远程URL中提取。
  github:
    owner: user
    name: repo

  # 如果设置为true,则不会自动发布该版本。
  # 默认值为false。
  draft: true

  # 如果设置为true,则将发布tag为 预发布版本。
  # 默认值为false。
  prerelease: true

  # 您可以更改GitHub版本的名称。
  # 默认是``
  name_template: '{{.ProjectName}}-v{{.Version}} {{.Env.USER}}'

  # 您可以禁用此管道,将不上传到GitHub
  # 默认为false。
  disable: true

了解有关命名模板引擎的更多信息.

自定义更改日志

您可以使用自定义配置文件中changelog的部分,来修改生成changelog的方式:

# .goreleaser.yml
changelog:
  # 可以是asc,desc或empty
  # 默认为空
  sort: asc
  filters:
    # 删除与下方列表匹配的commit信息,将不在changelog显示
    # 默认为空
    exclude:
      - '^docs:'
      - typo
      - (?i)foo

自定义发行说明

您可以自定义一个包含发行说明的文件,并将其传递给--release-notes=FILE参数。然后,GoReleaser 将使用您文件的内容,而跳过自己的发行说明生成。您可以使用 Markdown 格式化文件的内容.

在 Unix 系统上,您还可以使用process substitution命令,生成发行说明。即列出自上一个标记以来的所有提交,但跳过以Merge要么docs开头的提交,你可以运行这个命令:

$ goreleaser --release-notes <(some_changelog_generator)

您可以使用的,一些更改日志生成器-some_changelog_generator:

S3

v0.74.0起,GoReleaser 支持将存档推送到 Amazon S3 和其他 API 兼容的云存储(例如minio).

现在,实现非常简单,也可能不会涵盖所有用例。如果您需要其中一个用例,请打开问题/请求.

定制

# .goreleaser.yml
s3:
  # 你可以有多个s3配置
  - # Bucket名称(不带 s3:// 前缀)
    # 默认为空。
    bucket: my-bucket
    # AWS区域使用。
    # 默认值为 us-east-1
    region: us-east-1
    # Bucket内 路径/名称 的模板。
    # 默认为`{{ .ProjectName }}/{{ .Tag }}`
    folder: 'foo/bar/{{.Version}}'
    # 如果你有多个profiles在〜/.aws配置中, 
    # 设置用于此s3配置的自定义配置文件。这将有助于定义哪个
    # s3桶使用哪个配置文件。
    # 默认为空。
    profile: my-profile
    # Endpoint允许您设置自定义端点,这对
    # 例如,想要将您的存档推送到minio服务器很有用。
    # 默认为AWS S3 URL。
    endpoint: 'http://minio.foo.com'
    # 使用指定的固定ACL,设置对象的ACL。
    # 默认为私有。
    acl: public-read

了解有关命名模板引擎的更多信息.了解有关acl的更多信息.

认证

GoReleaser 使用由 aws-cli 定义的相同方法进行身份验证.你可以看看其文档了解更多信息.

目前它支持身份验证:

  • 一个是EnvProvider,它从正在运行的进程的环境变量中检索凭据。环境凭据永不过期.使用的环境变量:

    • 访问密钥ID-Access Key ID: AWS_ACCESS_KEY_IDAWS_ACCESS_KEY

    • Secret Access Key: AWS_SECRET_ACCESS_KEYAWS_SECRET_KEY

  • 一个是SharedCredentialsProvider,它从当前用户的主目录中检索凭据,并跟踪这些凭据是否已过期.

配置文件 ini 文件示例:$HOME/.aws/credentials

  • 还有具有启用 SharedConfigStateAssumeRoleTokenProvider,它使用 MFA 提示 stdin 上的令牌代码.去其会议文档了解更多细节.

您还可以为每个 S3 配置设置不同的配置文件名称,例如,您可以将其推送到不同帐户中的Bucket.

Artifactory-存档工厂

v0.38.0以来,GoReleaser支持构建和推送存档到Artifactory.

这个怎么运作

您可以声明多个Artifactory实例。您builds部分生成的所有二进制文件,都将被推送到每个配置的Artifactory.

如果您只有一个Artifactory实例,则配置就像添加上传目标和用户名一样简单.goreleaser.yml文件:

artifactories:
  - name: production
    target: http://<Your-Instance>:8081/artifactory/example-repo-local/{{ .ProjectName }}/{{ .Version }}/
    username: goreleaser

先决条件:

  • 正在运行的Artifactory实例
  • 用户+密码/ API密钥,用于上传存档

目标-target

target是,将存档上传到的URL(*没有*存档的名称).

在上传binary到目标模式下,一个goreleaser示例配置,可以看起来像

- mode: binary
  target: 'http://artifacts.company.com:8081/artifactory/example-repo-local/{{ .ProjectName }}/{{ .Version }}/{{ .Os }}/{{ .Arch }}{{ if .Arm }}{{ .Arm }}{{ end }}'

并将导致最终部署,如http://artifacts.company.com:8081/artifactory/example-repo-local/goreleaser/1.0.0/Darwin/x86_64/goreleaser.

支持的变量:

  • Version
  • Tag
  • ProjectName
  • Os
  • Arch
  • Arm

注意:变量 Os, ArchArm 仅在上传binary模式下,受支持.

用户名

您配置的用户名需要根据您的Artifactory进行身份验证.

您可以在配置文件中设置用户名,如上所示,也可以从环境变量中读取.配置的Artifactory实例名称,将用于构建环境变量名称。这样我们就支持多个实例的auth。这也意味着每个goreleaser配置中的每个配置的实例name是唯一的.

环境变量的名称将是ARTIFACTORY_NAME_USERNAME。如果您的实例已命名production,您可以将用户名存储在环境变量中ARTIFACTORY_PRODUCTION_USERNAME。该名称将转换为 大写.

如果在配置文件中,找到已配置的用户名,则根本不使用环境变量.

密码/ API密钥

密码或API密钥,将存储在环境变量中。使用您的Artifactory实例的已配置名称。通过这种方式,我们支持多个实例的auth.这也意味着每个goreleaser配置中的每个配置的实例name是唯一的.

环境变量的名称将是ARTIFACTORY_NAME_SECRET.如果您的实例已命名production,您需要将密码存储在环境变量中ARTIFACTORY_PRODUCTION_SECRET。该名称将转换为大写.

服务器认证

您可以对您的Artifactory TLS服务器进行身份验证,在您的配置中添加X.509可信证书链.

可信证书链,用于验证服务器证书.

您可以使用trusted_certificates设置artifactory部分的可信证书链,在YAML字段区块上使用PEM编码证书,如下所示:

puts:
  - name: "some artifactory server with a private TLS certificate"
    #...(other settings)...
    trusted_certificates: |
      -----BEGIN CERTIFICATE-----
      MIIDrjCCApagAwIBAgIIShr2zchZo+8wDQYJKoZIhvcNAQENBQAwNTEXMBUGA1UE
      ...(edited content)...
      TyzMJasj5BPZrmKjJb6O/tOtEIJ66xPSBTxPShkEYHnB7A==
      -----END CERTIFICATE-----
      -----BEGIN CERTIFICATE-----
      MIIDrjCCApagAwIBAgIIShr2zchZo+8wDQYJKoZIhvcNAQENBQAwNTEXMBUGA1UE
      ...(edited content)...
      TyzMJasj5BPZrmKjJb6O/tOtEIJ66xPSBTxPShkEYHnB7A==
      -----END CERTIFICATE-----

定制

当然,你可以自定义很多东西:

# .goreleaser.yml
artifactories:
  # 您可以拥有多个Artifactory实例。
  -
    # artifactory实例的唯一名称。 用于标识实例
    name: production
    # 上传模式。 有效选项是`binary`和`archive`。
    # 如果mode是`archive`,则不支持目标名称的 _Os_,_ Arch_ 和 _Arm_ 变量。
    # 在这种情况下,这些变量是空的。
    # 默认是`archive`。
    mode: archive
    # 您的Artifactory实例的URL + 要部署到的路径
    target: http://artifacts.company.com:8081/artifactory/example-repo-local/{{ .ProjectName }}/{{ .Version }}/
    # 将用于部署的用户
    username: deployuser
    # 上传校验和(默认为false)
    checksum: true
    # 上传签名(默认为false)
    signature: true
    # 用于验证服务器证书的证书链
    trusted_certificates: |
      -----BEGIN CERTIFICATE-----
      MIIDrjCCApagAwIBAgIIShr2zchZo+8wDQYJKoZIhvcNAQENBQAwNTEXMBUGA1UE
      ...(edited content)...
      TyzMJasj5BPZrmKjJb6O/tOtEIJ66xPSBTxPShkEYHnB7A==
      -----END CERTIFICATE-----

这些设置应该能让您,将存档推送到多个Artifactories.

Bintray

这个怎么运作

上传Bintray是一个简单使用HTTP PUT的例子.

前后必备条件:

  • 在Bintray中,创建用户和/或组织
  • 在Bintray中,创建一个通用存储库
  • 创建一个名称与您的ProjectName名称匹配的包
  • 发布后,不要忘记发布上传的文件(通过UI或REST API)
puts:
  - name: bintray
    target: https://api.bintray.com/content/user.or.org.name/generic.repo.name/{{ .ProjectName }}/{{ .Version }}/
    username: goreleaser

请参阅HTTP Put的更多细节.

HTTP Put

GoReleaser支持构建和,只使用简单的HTTP PUT请求推送存档到HTTP服务器.

这个怎么运作

您可以声明多个Put实例。您builds部分生成的所有二进制文件,将被推送到每个配置的Put.

如果您只有一个Put实例,则配置就像添加上传目标和用户名到.goreleaser.yml文件一样简单:

puts:
  - name: production
    target: http://some.server/some/path/example-repo-local/{{ .ProjectName }}/{{ .Version }}/
    username: goreleaser

先决条件:

  • 接受PUT请求的HTTP服务器
  • 用户+密码,用于使用PUT请求上传存档(如果服务器需要)

目标-target

target是将存档上传到的URL(*没有*存档的名称).

在上传binary与目标模式下,一个goreleaser示例配置,可以看起来像

- mode: binary
  target: 'http://some.server/some/path/example-repo-local/{{ .ProjectName }}/{{ .Version }}/{{ .Os }}/{{ .Arch }}{{ if .Arm }}{{ .Arm }}{{ end }}'

将导致发送HTTP PUT请求http://some.server/some/path/example-repo-local/goreleaser/1.0.0/Darwin/x86_64/goreleaser.

支持的变量:

  • Version
  • Tag
  • ProjectName
  • Os
  • Arch
  • Arm

警告:变量Os,ArchArm仅在上传binary模式下受支持.

用户名

您配置的用户名必须对您的HTTP服务器有效.

您可以在配置文件中设置用户名,如上所示,也可以从环境变量中读取。你配置的HTTP服务器名称,将用于构建环境变量名称。这样我们就支持多个实例的auth。这也意味着每个goreleaser配置的每个配置的实例name是唯一的.

环境变量的名称将是PUT_NAME_USERNAME.如果您的实例已命名为production,您可以将用户名存储在PUT_PRODUCTION_USERNAME环境变量中。该名称将转换为大写。

如果在配置文件中找到已配置的用户名,则根本不使用环境变量.

密码

密码将存储在环境变量中.将使用配置的HTTP服务器名称.这样我们就支持多个实例的auth.这也意味着每个goreleaser配置的每个配置的实例name是唯一的。

环境变量的名称将是PUT_NAME_SECRET.如果您的实例已命名为production,您需要将秘密存储在PUT_PRODUCTION_SECRET环境变量中。该名称将转换为大写.

服务器认证

您可以对您的TLS服务器进行身份验证,在您的put配置中添加X.509可信证书链.

可信证书链,用于验证服务器证书.

您可以使用trusted_certificates设置artifactory部分的可信证书链,在YAML字段区块上使用PEM编码证书,如下所示:

puts:
  - name: "some HTTP/TLS server"
    #...(other settings)...
    trusted_certificates: |
      -----BEGIN CERTIFICATE-----
      MIIDrjCCApagAwIBAgIIShr2zchZo+8wDQYJKoZIhvcNAQENBQAwNTEXMBUGA1UE
      ...(edited content)...
      TyzMJasj5BPZrmKjJb6O/tOtEIJ66xPSBTxPShkEYHnB7A==
      -----END CERTIFICATE-----
      -----BEGIN CERTIFICATE-----
      MIIDrjCCApagAwIBAgIIShr2zchZo+8wDQYJKoZIhvcNAQENBQAwNTEXMBUGA1UE
      ...(edited content)...
      TyzMJasj5BPZrmKjJb6O/tOtEIJ66xPSBTxPShkEYHnB7A==
      -----END CERTIFICATE-----

定制

当然,你可以自定义很多东西:

# .goreleaser.yml
puts:
  # 您可以拥有多个Put实例。
  -
    # Put实例的唯一名称。 用于标识实例。
    name: production
    # 上传模式。 有效选项是`binary`和`archive`。
    # 如果mode是`archive`,则不支持目标名称的变量_Os _,_ Arch_和_Arm_。
    # 在这种情况下,这些变量是空的。
    # 默认是`archive`。
    mode: archive
    # 用作HTTP PUT请求目标的URL
    target: https://some.server/some/path/example-repo-local/{{ .ProjectName }}/{{ .Version }}/
    # 将用于部署的用户
    username: deployuser
    # 您可以使用可选标头,
    # 告诉GoReleaser在上传请求时,传递artifact的SHA256校验。
    # 默认为空。
    checksum_header: -X-SHA256-Sum
    # 上传校验和(默认为false)
    checksum: true
    # 上传签名(默认为false)
    signature: true
    # 用于验证服务器证书的证书链
    trusted_certificates: |
      -----BEGIN CERTIFICATE-----
      MIIDrjCCApagAwIBAgIIShr2zchZo+8wDQYJKoZIhvcNAQENBQAwNTEXMBUGA1UE
      ...(edited content)...
      TyzMJasj5BPZrmKjJb6O/tOtEIJ66xPSBTxPShkEYHnB7A==
      -----END CERTIFICATE-----

这些设置应该允许您,将存档推送到多个HTTP服务器.

Docker

v0.31.0以来,GoReleaser支持构建和推送Docker镜像.

这个怎么运作

您可以声明多个Docker镜像。它们将与您builds部分生成的二进制文件进行匹配.

如果你只有一个build设置,配置就像添加镜像名称到你.goreleaser.yml文件一样简单:

docker镜像声明支持模板。了解有关命名模板引擎的更多信息.

dockers:
  - image_templates:
    - user/repo

你还需要在项目的根文件夹中,创建一个Dockerfile:

FROM scratch
COPY mybin /
ENTRYPOINT ["/mybin"]

此配置将构建,并推送名为的Docker镜像user/repo:tagname.

注意:请注意,在docker构建阶段,没有构建任何go文件,我们只是将二进制文件复制到scratch镜像和设置入口点-ENTRYPOINT.

定制

当然,你可以自定义很多东西:

# .goreleaser.yml
dockers:
  # 您可以拥有多个Docker镜像。
  -
    # 应该使用的构建二进制文件的GOOS。
    goos: linux
    # 应该使用的构建二进制文件的GOARCH。
    goarch: amd64
    # 应该使用的构建二进制文件的GOARM。
    goarm: ''
    # 应使用的构建二进制文件的名称。
    binary: mybinary
    # Docker镜像名称的模板。
    image_templates:
    - "myuser/myimage:latest"
    - "myuser/myimage:{{ .Tag }}"
    - "myuser/myimage:{{ .Tag }}-{{ .Env.GO_VERSION }}"
    - "myuser/myimage:v{{ .Major }}"
    - "gcr.io/myuser/myimage:latest"
    # 跳过docker推送。 如果你也有草稿版本可能会有用。
    # 默认为false。
    skip_push: false
    # Dockerfile的路径(来自项目根目录)。
    dockerfile: Dockerfile 
    # docker构建参数的模板。
    build_flag_templates:
    - "--label=org.label-schema.schema-version=1.0"
    - "--label=org.label-schema.version={{.Version}}"
    - "--label=org.label-schema.name={{.ProjectName}}"
    - "--build-arg=FOO={{.ENV.Bar}}"
    # 如果您要Dockerfile复制二进制文件以外的文件,
    # 你也应该在这里列出它们。
    extra_files:
    - config.yml

了解有关命名模板引擎的更多信息.

这些设置应该允许您生成多个Docker镜像,例如,使用多个FROM语句,以及为项目中的每个二进制文件生成一个镜像.

通用镜像名称

某些用户可能希望将其镜像名称保持为通用名称。这可以通过在定义中添加模板语言来实现:

# .goreleaser.yml
project: foo
dockers:
  -
    binary: mybinary
    image_templates:
    - "myuser/{{.ProjectName}}"

这将构建,并公开以下镜像:

  • myuser/foo

了解有关命名模板引擎的更多信息.

当前主要版本,docker镜像就保持更新,

某些用户可能希望当v1.6.4(例如)已建成,之后在push docker标签版本,能使用:v1,:v1.6,:v1.6.4:latest。这可以通过使用多个image_templates来完成:

# .goreleaser.yml
dockers:
  -
    binary: mybinary
    image_templates:
    - "myuser/myimage:{{ .Tag }}"
    - "myuser/myimage:v{{ .Major }}"
    - "myuser/myimage:v{{ .Major }}.{{ .Minor }}"
    - "myuser/myimage:latest"

这将构建,并发布以下镜像:

  • myuser/myimage:v1.6.4
  • myuser/myimage:v1
  • myuser/myimage:v1.6
  • myuser/myimage:latest

通过这些设置,您可以使用多个标签推送几个不同的docker镜像.

了解有关命名模板引擎的更多信息.

发布到多个docker注册表

某些用户可能希望,将镜像推送到多个docker注册表。这可以通过使用多个image_templates来完成:

# .goreleaser.yml
dockers:
  -
    binary: mybinary
    image_templates:
    - "docker.io/myuser/myimage:{{ .Tag }}"
    - "docker.io/myuser/myimage:latest"
    - "gcr.io/myuser/myimage:{{ .Tag }}"
    - "gcr.io/myuser/myimage:latest"

这将构建,并发布以下镜像到docker.iogcr.io:

  • myuser/myimage:v1.6.4
  • myuser/myimage:latest

应用docker构建参数

可以使用build_flag_templates构建参数。参数必须是有效的docker build参数.

# .goreleaser.yml
dockers:
  -
    binary: mybinary
    image_templates:
        - "myuser/myimage"
    build_flag_templates:
    - "--label=org.label-schema.schema-version=1.0"
    - "--label=org.label-schema.version={{.Version}}"
    - "--label=org.label-schema.name={{.ProjectName}}"

这将执行以下命令:

docker build -t myuser/myimage . \
  --label=org.label-schema.schema-version=1.0 \
  --label=org.label-schema.version=1.6.4 \
  --label=org.label-schema.name=mybinary"

了解有关命名模板引擎的更多信息.