在 GitHub Actions 中需用 actions/setup-go@v4 设置 Go 环境,指定 go-version='1.21',配置 CGO_ENABLED、GOOS/GOARCH 跨平台编译,设置 GOPROXY 避免模块拉取失败,并严格校验 go.sum。

怎么在 GitHub Actions 里正确设置 Go 环境
GitHub Actions 默认不带 Go,直接用 go build 会报 command not found: go。必须显式安装 Go 版本,不能靠系统预装。
- 用
actions/setup-go@v4动作,别用v3或更老版本(v3 在 macOS 上有缓存 bug) -
go-version推荐写成'1.21'这种带单引号的字符串,避免 YAML 解析成浮点数(比如1.21可能被当成 1.2100000000000002) - 如果项目依赖
CGO_ENABLED=0静态编译,记得在steps里提前设环境变量,而不是只写在build命令里
Go test 怎么跑才不漏覆盖率又不卡住
go test 在 CI 里默认不输出详细失败信息,且并发行为和本地不同,容易误判通过。
- 加
-v参数看每个测试函数的输出,CI 日志里没这参数,失败时你只能看到FAIL两个字母 - 加
-timeout 30s,防止某个测试卡死拖垮整个 workflow(尤其是涉及网络或 time.Sleep 的 case) - 覆盖率要用
go test -coverprofile=coverage.out ./...,注意./...才能覆盖子模块;别用.,否则跳过 internal/ 下的包
交叉编译产物怎么自动上传到 GitHub Release
Go 本身支持跨平台编译,但 GitHub Actions 的 runner 是 Linux,默认产出的是 Linux 二进制,想打 Windows/macOS 包得手动指定 GOOS/GOARCH。
- 用
matrix策略同时构建多平台:strategy: {matrix: {goos: [linux, windows, darwin], goarch: [amd64, arm64]}} - Windows 下生成的文件名要加
.exe后缀,否则用户下载后双击打不开;可用if: matrix.goos == 'windows'条件追加 - 上传 release 用
softprops/action-gh-release@v1,注意files路径要匹配artifact实际输出位置,比如dist/myapp-*.zip,别写成./dist/...(Action 不认相对路径前缀)
为什么 go mod download 总是超时或校验失败
Actions 默认走公网拉 module,国内用户大概率遇到 verifying github.com/xxx@v0.x.x: checksum mismatch 或 context deadline exceeded。
立即学习“go语言免费学习笔记(深入)”;
- 在
go mod download前加一步:运行go env -w GOPROXY=https://goproxy.cn,direct(不是export,Action 不继承 shell 环境变量) - 别把
go mod vendor当万能解——vendor 目录一旦提交,后续go.sum更新容易不同步,CI 和本地行为反而不一致 - 如果用了私有模块(比如 GitLab 或自建 Nexus),要在
go env -w GONOPROXY=git.example.com显式排除代理,否则 proxy 会 404
Go module 的校验逻辑在 CI 里比本地更严格,一个没 commit 的 go.sum 变更就足以让整个 workflow 报错。别跳过 go mod verify 步骤,哪怕它多花两秒。


















