go test在ci中卡住主因是未设超时及遗留goroutine,须加-timeout 60s、用httptest.newunstartedserver、跳过真实db连接;私有模块拉取失败因漏配goprivate和go.sum缓存key。

go test 在 CI 里卡住,基本就是没设 timeout
本地秒过、CI 里挂半天不动,不是测试慢,是某个 http.Server 没关,或者 goroutine 泄漏卡在 channel 上。GitHub Actions 默认不限单命令时长(上限 6 小时),但你等不起。
- 所有
go test命令必须加-timeout 60s,集成测试可放宽到120s - HTTP 测试别用
http.ListenAndServe,改用httptest.NewUnstartedServer+srv.Start()+defer srv.Close() - 数据库连接跳过真实实例:用
file::memory:(SQLite)或testcontainers-go;若必须连,加-short标志跳过耗时逻辑 - 删掉所有
time.Sleep,改用sync.WaitGroup或chan struct{}等待条件达成
私有模块拉不到,错在 GOPRIVATE 和缓存 key
CI 报 cannot find module providing package xxx,本质是 go mod download 阶段不认你的私有域名(比如 gitlab.com/org/repo),既没配代理也没告诉 Go “这是私有库”。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 必须在 CI 步骤开头显式设置:
GOPRIVATE=gitlab.com/org/*(按实际域名填) -
go.sum缓存 key 要包含GOPRIVATE值,否则缓存失效导致重复下载失败 - 避免用
goproxy=direct硬切——它会绕过企业级 proxy,反而断连内部镜像源;推荐GOPROXY=https://proxy.golang.org,direct+GOPRIVATE组合 - 确认
go.mod中私有模块路径与 Git URL 完全一致(含 .git 后缀与否)
交叉编译产物发不到 GitHub Releases,权限和路径全错
softprops/action-gh-release 只认 ./dist/* 下的文件,且默认 workflow token 不带 packages: write 权限(新版 Actions 已默认关闭写权限)。
- 发布前强制清理并重建目录:
rm -rf ./dist && mkdir -p ./dist,否则上次残留文件一起推上去 - 构建时显式指定输出路径和平台标识:
GOOS=linux GOARCH=amd64 go build -o ./dist/myapp-linux-amd64 - 检查
.github/workflows/*.yml是否声明了permissions: contents: write(不是packages) - 确保
on: push: tags触发的是附注型 tag:git tag -a v1.2.3 -m "release",轻量 tag 不触发
测试覆盖率报告点不开源码,因为工作目录没对齐
go tool cover -html=coverage.out 生成的 HTML 里点不了源码行,常见原因是生成 profile 时的当前目录和 HTML 渲染时的根路径不一致,导致路径解析偏移。
- 统一用
-covermode=count(非atomic),计数模式支持跨包聚合且更稳定 - 所有
go test命令在项目根目录执行,避免cd切目录后跑go test ./... - 多包聚合用
gocovmerge coverage-*.out > coverage.out,别依赖go tool cover -func直接读子目录 - 校验阈值别只看数字:用
grep -q 'total.*8[0-9]\.\|[9][0-9]\.\|100\.' coverage.out || exit 1
~/.netrc 里的 git 凭据。漏掉任意一个假设,就会在凌晨两点的 PR 里突然炸开。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










