前言
- 团队目前使用GitlabCE作为Golang代码仓库使用,需要把一些常用的公共代码块(工具类、RPC接口等)独立成模块供其他二方系统调用.这样能复用代码块,方便扩展与维护.因此考虑使用Gitlab配合go mod,实现私有而方包的管理.
准备
- Gitlab 13.10.3
- Golang 1.16.3
- 指向Gitlab的HTTPS域名,这里我们模拟域名为:my.gitlab.private
- Nginx 1.18.0
链路

原理
- go get 下载路径为域名+项目路径的格式,而且默认使用https下载,所以我们可以使用nginx搭建https服务,将请求通过http转发给gitlab,实现二方包的下载.
实践
Gitlab准备
启用 go proxy

准备go module工程
- 这里假定工程的完成路径为:my.gitlab.private/mytest/mysu…
- 我们的go.mod文件的module名要设置为
module my.gitlab.private/mytest/mysubtest/myproject.git
- 注意⚠️:go module的名称要和gitlab的路径保持一致


配置用户的AccessToken

- 注意⚠️:Scopes选择api;用户要有能访问上文仓库的权限.
Nginx配置
HTTPS配置
server {
listen 443 ssl;
server_name my.gitlab.private;
ssl_certificate /etc/nginx/conf.d/gitlab-ssl.crt;
ssl_certificate_key /etc/nginx/conf.d/gitlab-ssl.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:80; #gitlab的http地址
if ($args ~* "^go-get=1") {
set $condition goget;
}
if ($uri ~ ^/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/.*$) {
set $condition "${condition}path";
}
if ($condition = gogetpath) {
return 200 "<!DOCTYPE html><html><head><meta content='my.gitlab.private/$1/$2 git https://my.gitlab.private/$1/$2.git' name='go-import'></head></html>";
}
}
}
Golang环境配置
Golang全局环境配置
环境变量 | 内容 |
---|
GO111MODULE | on |
GOPROXY | goproxy.cn |
GOPRIVATE | my.gitlab.private |
- 使用GOPRIVATE,让私有库从my.gitlab.private上获取.
配置.netrc文件
- 此文件是让go get访问gitlab的仓库使用的
- 路径为
~/.netrc
- 内容为:
machine <url> login <username> password <token>

- 比如:
machine my.gitlab.private login admin password fqq3d7LsMxxa-hoK_sNvk
测试依赖包获取
- 运行命令:
go get my.gitlab.private/mytest/mysubtest/myproject.git
- 打开$GOPATH/pkg/mod/my.gitlab.private,可以看到私有库的依赖已被下载到本地

总结
- go get 需要用域名的方式,内网用户需要自己在内网搭建DNS解析服务
- go get 的时候,最后的.git不能忽略
参考