必须用 actions/setup-go@v4 显式安装 Go,禁用系统预装;go test 必加 -timeout 30s 和 -v 参数;Windows 交叉编译产物须带 .exe 后缀;go-version 推荐写 '1.21'(取最新 patch)或 '1.21.6'(精确锁定),且需加单引号防 YAML 浮点解析错误。

直接用 actions/setup-go@v4 装 Go,别信系统预装;go test 不加 -timeout 和 -v 就是埋雷;交叉编译产物没 .exe 后缀,Windows 用户点不开——这些不是“可能出问题”,而是每次都会翻车。
go-version 写成 '1.21' 还是 '1.21.6'?
语义化写法更稳:'1.21' 表示取 1.21.x 最新 patch 版,'1.21.6' 是精确锁定。别写 latest,它不等于 Go 官方最新稳定版,而是 actions 缓存的滞后版本,可能差两周。
-
go-version: '1.21'适合日常开发,能自动吃到安全补丁 -
go-version: '1.21.6'适合发布分支或需要强一致性的场景(比如 CI 和生产环境必须完全同版) - YAML 里必须加单引号,否则
1.21可能被解析成浮点数1.2100000000000002,导致匹配失败 - 如果项目用了
go.work,actions/setup-go必须放在actions/checkout@v4之后,否则识别不到多模块结构
go test 在 CI 里总超时或只跑一半?
本地能过、CI 报 timeout: failed to run tests 或静默退出,大概率是参数和上下文没对齐。
- 必加
-timeout 30s:默认 10 分钟,卡住后 job 被平台强制终止,日志只留FAIL - 必加
-v:不加就看不到哪个测试函数挂了,CI 日志里只剩一行FAIL - 显式设
GO111MODULE=on:尤其当 repo 根目录没go.mod但子目录有多个 module 时,CI 容易误判为 GOPATH 模式 - 用
./而不是.:前者递归进所有子目录(含internal/),后者只测当前包 - 若启用
-race,必须加-count=1:竞态检测不支持多次运行,否则静默失败
交叉编译产物上传到 Release 却打不开?
Linux runner 上用 GOOS=windows go build 确实能生成可执行文件,但默认没扩展名——Windows 不认 myapp_Windows_x86_64,双击无反应,这不是权限问题,是系统根本没把它当可执行文件。
监控一个或多个 GitCode 仓库的 PR,通过 OpenClaw Gateway 自动执行 AI 审查,发布 PR 评论,并发送钉钉和企业微信通知。
立即学习“go语言免费学习笔记(深入)”;
- Windows 产物必须带
.exe后缀,且只能通过模板判断:{{ if eq .Os "windows" }}.exe{{ end }},不能硬写 - 用
softprops/action-gh-release@v1上传时,files路径要严格匹配输出位置,比如dist/myapp-*.exe,别写./dist/myapp-*.exe(Action 不认./前缀) - GitHub Actions 默认
${{ secrets.GITHUB_TOKEN }}只有contents: read权限,创建 Release 至少要contents: write,必须手动进 Settings → Actions → General 开启 “Read and write permissions” - 标签触发要用
if: startsWith(github.ref, 'refs/tags/'),别依赖github.event.head_commit.tag,它在 PR 合并时不可靠
为什么 goreleaser 总是静默跳过构建?
不是配置错,是环境没对齐:goreleaser v2+ 默认要求 Go 1.21+,但如果你的 go.mod 里写的是 go 1.19,它会直接跳过构建,连 warning 都不打。
- 先用
actions/setup-go@v4显式指定 Go 版本,和go.mod里的声明严格一致 - 安装 goreleaser 推荐用
curl -sL https://git.io/goreleaser | sh,别信文档里“自动检测”的说法 -
.goreleaser.yml中archives.name_template必须处理 Windows 后缀:"{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if eq .Os \"windows\" }}.exe{{ end }}" - 本地验证用
goreleaser build --snapshot,比反复 push tag 快得多 - 私有仓库下,
GITHUB_TOKEN默认无法创建 Release,必须手动开权限,否则报403 Forbidden却不提示缺哪项
最容易被忽略的其实是工作流中环境变量的生效范围:比如 CGO_ENABLED=0 写在 run: 行里,只对那条命令生效;要全局生效,得提成 env: 块。还有 GOOS 这种变量,在 shell 步骤里不能写成 GOOS=linux go build —— GitHub Actions 的 run 默认走 sh,不支持这种语法,得拆成两行或改用 env:。

















