应使用 actions/setup-go@v4 显式指定 go 版本(如 '1.21.6'),在 checkout 后执行;go test 需加 -timeout 30s、go111module=on 和 -count=1(若启用 -race);go build 应用绝对路径输出并设 cgo_enabled=0;私有模块需通过 git config url 重写注入 token。

GitHub Actions 中 go 环境怎么选对版本?
GitHub Actions 默认的 ubuntu-latest 上预装的 go 版本经常不是你项目需要的——比如你用 go 1.21 开发,CI 却跑在 go 1.19 上,embed 或泛型行为可能出偏差。
- 用
actions/setup-go@v4显式指定版本,别依赖系统自带 -
go-version支持语义化写法:'1.21'(取最新 patch)、'1.21.6'(精确锁定) - 如果项目用了
go.work,确保setup-go在checkout之后执行,否则工作区识别失败 - 避免写
go-version: 'latest'——它不指向 Go 官方最新稳定版,而是 actions 自维护的“最近缓存版”,可能滞后两周
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v4
with:
go-version: '1.21.6'
为什么 go test 在 CI 里总超时或漏跑?
本地能过,CI 报 timeout: failed to run tests 或只跑了个 TestMain 就退出,大概率是没传对参数或没处理好模块上下文。
- 默认
go test ./...会递归进vendor/或internal/子模块,但某些目录含非标准测试入口,导致 panic 或死循环 - 加
-timeout 30s是必须的,否则默认 10 分钟,卡住后整个 job 被平台强制终止 -
GO111MODULE=on必须显式设置,尤其当 repo 根目录没go.mod但子目录有多个 module 时,CI 容易误判为 GOPATH 模式 - 如果用
test -race,记得加-count=1:Go 的竞态检测不支持-count多次运行,否则静默失败
run: go test -v -timeout 30s -race -count=1 ./...
go build 输出二进制在 GitHub Actions 里找不到?
build 成功但后续步骤提示 No such file or directory: ./myapp,不是路径错了,是没设对输出目标或没处理跨平台问题。
-
go build默认输出到当前目录,但 Actions 的工作目录($GITHUB_WORKSPACE)和你cd进去的路径可能不一致 - 不要依赖相对路径,统一用绝对路径输出:
go build -o $GITHUB_WORKSPACE/bin/myapp . - 如果要发布多平台二进制(如 macOS/Linux/Windows),别用
GOOS=linux go build这种 shell 变量方式——Actions 的run步骤默认用sh,不支持GOOS=xxx cmd这种写法;得拆成两行或改用env: - 注意
CGO_ENABLED=0:默认开启 CGO,交叉编译时容易因缺失 C 工具链失败,静态链接需求下务必关掉
env: CGO_ENABLED: "0" GOOS: linux GOARCH: amd64 run: go build -o $GITHUB_WORKSPACE/bin/myapp .
私有模块拉不到?go get 提示 401 Unauthorized
项目依赖了 GitHub 私有库或企业内网 Git 服务,CI 里 go mod download 直接 401,不是 token 没配,是没告诉 Go 怎么用 token 认证。
-
GIT_AUTH_TOKEN这类自定义变量 Go 不认识,必须通过git config注入凭证 - 在
checkout后、setup-go前加一步配置 git: - 对 GitHub 私有库,用
@#@#@#@#@#@#@#@#@#@0:${{ secrets.GITHUB_TOKEN }}@github.com格式重写 URL - 如果用其他 Git 服务商(如 GitLab),需对应替换 host 和 token 位置,且注意 URL 编码
run: |
git config --global url."https://www.php.cn/link/5dcf93a3757353548ad49dcc68d1c445:${{ secrets.GITHUB_TOKEN }}@github.com".insteadOf "https://github.com"
Go 的 module 认证逻辑很务实:它不碰环境变量,只信 git 的 URL 重写规则。漏掉这步,go mod tidy 就会在私有依赖上卡住,而且错误信息里完全不提 token 事——只报 401。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











