GoReleaser通过提供多种自定义的.goreleaser.yml
文件.
您可以通过运行goreleaser init
生成它,或者从头开始。默认值都是合理的,适合大多数项目.
某些构建可能需要在构建之前,进行预构建步骤,例如,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_template
和example_template
字段不是有效的GoReleaser配置.
可以通过多种方式自定义构建.您可以指定哪个GOOS
,GOARCH
和GOARM
构建二进制文件(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
了解有关命名模板引擎的更多信息。
你可以通过在模板中使用{{ .Env.VARIABLE_NAME }}
来做到这一点,例如:
builds:
- ldflags:
- -s -w -X "main.goversion={{.Env.GOVERSION}}"
然后你可以运行:
GOVERSION=$(go version) goreleaser
如果你使用Go 1.11的go模块或vgo,当GoReleaser运行时,它可能会尝试下载依赖项。由于多个构建并行运行,因此很可能会失败.
你可以在启动goreleaser
之前,通过运行go mod download
解决这个问题,或者添加一个hook,像这样.goreleaser.yaml
文件:
before:
hooks:
- go mod download
# rest of the file...
构建的二进制文件将与README
和LICENSE
文件一起存档到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将始终添加README
和LICENSE
文件到存档。所以您需要提供把 archive 下的files
填充.
极客工作,是使用这样的东西:
# goreleaser.yml
archive:
files:
- none*
这将添加 none*
glob匹配的所有文件,假设您没有与该glob匹配的任何文件,只会将二进制文件添加到存档中.
有关更多信息,请查看#602
GoReleaser生成一个project_1.0.0_checksums.txt
文件,并在发布时上传,以便您的用户可以验证下载的文件是否正确.
该checksum
部分允许自定义文件名:
# .goreleaser.yml
checksum:
# 选择 checksums 的名称.
# 默认为 `{{ .ProjectName }}_{{ .Version }}_checksums.txt`.
name_template: "{{ .ProjectName }}_checksums.txt"
了解有关命名模板引擎的更多信息.
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
有时我们希望生成项目的完整版本,但既不想验证任何内容,也不想将其上传到任何地方。GoReleaser支持这个--snapshot
参数和snapshot
的定制部分:
# .goreleaser.yml
snapshot:
# 允许你更改生成的快照名称
# 默认为 `SNAPSHOT-{{.Commit}}`.
name_template: SNAPSHOT-{{.Commit}}
了解有关命名模板引擎的更多信息.
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
安装它.
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
,或它的任何依赖.
在发布到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软件库接受.
在发布到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文档更多细节.
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
:
至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
GoReleaser 使用由 aws-cli 定义的相同方法进行身份验证.你可以看看其文档了解更多信息.
目前它支持身份验证:
一个是EnvProvider,它从正在运行的进程的环境变量中检索凭据。环境凭据永不过期.使用的环境变量:
访问密钥ID-Access Key ID: AWS_ACCESS_KEY_ID
或 AWS_ACCESS_KEY
Secret Access Key: AWS_SECRET_ACCESS_KEY
或 AWS_SECRET_KEY
一个是SharedCredentialsProvider,它从当前用户的主目录中检索凭据,并跟踪这些凭据是否已过期.
配置文件 ini 文件示例:$HOME/.aws/credentials
您还可以为每个 S3 配置设置不同的配置文件名称,例如,您可以将其推送到不同帐户中的Bucket.
至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
先决条件:
该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
.
支持的变量:
注意:变量 Os, Arch 和 Arm 仅在上传binary
模式下,受支持.
您配置的用户名需要根据您的Artifactory进行身份验证.
您可以在配置文件中设置用户名,如上所示,也可以从环境变量中读取.配置的Artifactory实例名称,将用于构建环境变量名称。这样我们就支持多个实例的auth。这也意味着每个goreleaser配置中的每个配置的实例name
是唯一的.
环境变量的名称将是ARTIFACTORY_NAME_USERNAME
。如果您的实例已命名production
,您可以将用户名存储在环境变量中ARTIFACTORY_PRODUCTION_USERNAME
。该名称将转换为 大写.
如果在配置文件中,找到已配置的用户名,则根本不使用环境变量.
密码或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是一个简单使用HTTP PUT的例子.
ProjectName
名称匹配的包puts:
- name: bintray
target: https://api.bintray.com/content/user.or.org.name/generic.repo.name/{{ .ProjectName }}/{{ .Version }}/
username: goreleaser
请参阅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
先决条件:
该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
.
支持的变量:
警告:变量
Os
,Arch
和Arm
仅在上传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服务器.
至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
了解有关命名模板引擎的更多信息.
某些用户可能希望当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注册表。这可以通过使用多个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.io
和gcr.io
:
myuser/myimage:v1.6.4
myuser/myimage:latest
可以使用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"
了解有关命名模板引擎的更多信息.