最近使用 Go 写了好多小工具,在发布时需要手动打多系统的可执行程序,并且需要手动在 GitLab 中创建发布,手动上传,体验很糟糕。直到遇到了 GoReleaser,使用体提升了好几个档次。
GoReleaser 的官网是:https://goreleaser.com/
首先 GoReleaser 是一个命令行工具,在 Windows 下使用需要将可执行文件路径加入到环境变量 Path 中。在日常使用中,我最常用的命令主要有三个:
1
2
3
|
goreleaser init
goreleaser release --snapshot --rm-dist
goreleaser release --rm-dist
|
第一个命令是初始化,在 Go 项目工程目录下执行,执行完成后会生成 .goreleaser.yaml
文件。
第二个命令是测试构建,用于验证配置是否正确。
第三个命令是正式发布。
了解完命令,下面介绍一下 GoReleaser 的配置,即初始化时生成的 .goreleaser.yaml
文件。在介绍配置之前,先要明确一下我们发布的目标:
-
构建生成
- 多系统多架构的交叉编译
- 构建参数设置
-
压缩,主要是使用 upx 进行可执行程序的压缩
-
打包,部分小工具会有对应配置文件,需要一起打包
-
发布到 GitLab
为了实现发布过程中的这些目标,我的配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
# This is an example .goreleaser.yml file with some sensible defaults.
# Make sure to check the documentation at https://goreleaser.com
before:
hooks:
# You may remove this if you don't use go modules.
- go mod tidy
# you may remove this if you don't need go generate
- go generate ./...
env_files:
gitlab_token: ./gitlab_token
gitlab_urls:
api: http://192.168.0.200/api/v4/
download: http://192.168.0.200/
# set to true if you use a self-signed certificate
skip_tls_verify: true
# set to true if you want to upload to the Package Registry rather than attachments
# Only works with GitLab 13.5+
use_package_registry: false
builds:
- env:
- CGO_ENABLED=0
goos:
- windows
goarch:
- amd64
hooks:
post:
- upx "{{ .Path }}"
archives:
- replacements:
darwin: Darwin
linux: Linux
windows: Windows
386: i386
amd64: x86_64
format: zip
files:
- config.json
checksum:
name_template: 'checksums.txt'
snapshot:
name_template: "{{ incpatch .Version }}-next"
changelog:
sort: asc
filters:
exclude:
- '^docs:'
- '^test:'
|
首先是构建,配置文件中主要体现在 L22-L25。由于此工具只适用于 Windows 环境,所以限定了 goos 为 windows,goarch 为 amd64。
其次是压缩,配置文件中为 L26-L28。设置钩子,在构建完成后执行 upx 命令,其中.Path 表示生成的可执行程序的路径。
再次是打包,配置文件中为 L36-L38。设置最终压缩包格式为 zip,压缩包中包含 confing.json
文件。
最后是发布到 GitLab,配置文件中为 L9-L18。设置自建的 GitLab 地址和需要的 GitLab Token。