直接改goproxy环境变量并持久化$home/go/pkg/mod目录可将go mod download从几分钟压至几秒,关键在于避免jenkins重复下载、绕过镜像或清空缓存,需同时配置goproxy=https://goproxy.cn,direct、goprivate和gosumdb,并挂载$home/go/pkg/mod实现缓存复用。

直接改 GOPROXY 环境变量 + 持久化 $HOME/go/pkg/mod 目录,就能把 go mod download 从几分钟压到几秒。不是靠“重试”或“换网络”,而是让 Jenkins 别重复下载、别绕过镜像、别清缓存。
为什么 Jenkins 里 go mod download 总是慢得离谱
不是 Go 本身慢,是默认走 proxy.golang.org,而 Jenkins 节点(尤其在内网或海外)直连它大概率触发 TLS 超时或 DNS 污染;更常见的是每次构建都清空 workspace 或重装 $HOME/go,导致 $GOPATH/pkg/mod 缓存被丢弃,所有模块重拉。
- 流水线里没设
GOPROXY,go命令就 fallback 到官方代理,卡在GET https://proxy.golang.org/...上不动 - CI 脚本里写了
go clean -modcache,等于主动废掉本地缓存 - Jenkins agent 每次用全新容器或临时目录,
$HOME/go/pkg/mod不复用,缓存形同虚设 - 私有模块路径没加进
GOPRIVATE,go工具链仍试图用代理查,结果 404 或超时
必须在 Jenkinsfile 或 agent 环境里设置的三个环境变量
只写 go env -w GOPROXY=... 没用——go 命令启动新进程时读不到它。必须让 Shell 环境变量真实生效。
-
GOPROXY=https://goproxy.cn,direct:国内首选,支持全量模块缓存和校验透传;,direct是关键,否则私有模块(如git.example.com/internal)会失败 -
GOPRIVATE=git.example.com/internal/*:匹配你私有仓库路径,避免go工具链对这些地址还去查代理 -
GOSUMDB=sum.golang.org(不建议关):保持校验,若遇checksum mismatch,先go clean -modcache再重试,而不是设GOSUMDB=off
在 Jenkinsfile 中写法示例:
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
environment {
GOPROXY = 'https://goproxy.cn,direct'
GOPRIVATE = 'git.example.com/internal/*'
GOSUMDB = 'sum.golang.org'
}
CI 缓存必须同时挂载两个目录
只缓存 ~/.cache/go-build(构建缓存)没用,go mod download 完全不依赖它;真正要复用的是 $HOME/go/pkg/mod。漏掉这个,每次都是全新拉取。
- GitHub Actions:
actions/cache的path必须包含${{ env.HOME }}/go/pkg/mod和${{ env.HOME }}/go/pkg/sumdb - Jenkins Pipeline with Docker:用
docker run -v $HOME/go/pkg/mod:/home/jenkins/go/pkg/mod显式挂载 - Kubernetes Agent:在 Pod template 里通过
volumeMounts挂载 PVC 到/home/jenkins/go/pkg/mod - 切忌在
sh步骤开头执行rm -rf $HOME/go或go clean -modcache
验证是否真生效:用 -x 看实际请求地址
别只信 go env GOPROXY 输出,要确认 go 命令运行时到底连了谁。加 -x 参数是最准的验证方式。
- 在 Jenkins 流水线中加一步:
sh 'go mod download -x github.com/gin-gonic/gin@v1.9.1' - 看日志里是否出现
GET https://goproxy.cn/github.com/gin-gonic/gin/@v/v1.9.1.info - 如果看到
GET https://proxy.golang.org/...或git clone行,说明GOPROXY没生效,或GOPRIVATE没覆盖到对应模块
最易被忽略的一点:Jenkins agent 启动时若未加载用户 profile(比如用 jenkins 用户跑 systemd service),export 设置的环境变量根本不会继承——必须在 Jenkinsfile 的 environment 块或 sh 步骤里显式 export。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










