最近使用 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 文件。在介绍配置之前,先要明确一下我们发布的目标:

  1. 构建生成

    1. 多系统多架构的交叉编译
    2. 构建参数设置
  2. 压缩,主要是使用 upx 进行可执行程序的压缩

  3. 打包,部分小工具会有对应配置文件,需要一起打包

  4. 发布到 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。