目前go mod已成为go开发的标准模式,国内也有一些优秀的代理,例如 https://goproxy.io,https://goproxy.cn等,但是企业内部gitlab上的源码如何引用拉取呢?今天给大家两种解决方案:
x01
一、增加环境变量,go版本要求1.13+
export GOPRIVATE="gitlab.yourdomain.com"
声明指定的域名为私有仓库,go get在处理该域名下的所有依赖时,会直接跳过GOPROXY和CHECKSUM等逻辑。另外它默认前缀匹配,所有有人gitlab.yourdomain.com/xxx前缀的依赖模块都会被视为private-modules,它对于企业、私有Group等有着一劳永逸的益处。
x02
一、组件依赖:
-
athens:https://github.com/gomods/athens
-
nginx
二、安装athens
1、源码安装方式
git clone https://github.com/gomods/athens
cd athens
make build-ver VERSION="0.11.0"
./athens -version
输出如下信息说明编译成功:
Build Details:
Version: 0.11.0
Date: 2021-09-28-07:05:35-UTC
运行文件:
./athens -config_file=config.dev.toml
config.dev.toml部分配置文件修改如下:
GoGetDir = "/data/athens/storage" # go get时的目录, 根据情况指定
StorageType = "disk"
[Storage]
[Storage.Disk]
RootPath = "/data/athens/storage"
2、 docker安装方式:
export ATHENS_STORAGE=/data/athens/storage
mkdir -p $ATHENS_STORAGE
docker run -d -v $ATHENS_STORAGE:/var/lib/athens \
-e ATHENS_DISK_STORAGE_ROOT=/var/lib/athens \
-e ATHENS_STORAGE_TYPE=disk \
--name athens-proxy \
--restart always \
-p 3000:3000 \
gomods/athens:latest
三、增加nginx配置:
upstream go-private {
server 127.0.0.1:3000;
}
server {
listen 6666;
location / {
proxy_pass https://goproxy.cn; # 外网的统一走镜像代理服务
proxy_cache_valid 30d;
}
location ~ /(gitlab\.yourdomain\.com)/ {
proxy_pass http://go-private; # 企业内部走私有仓库
}
}
通过该配置可以清晰的看到走了两条路,一个走公网,一个走内网
四:增加环境变量
export GOPROXY=http://127.0.0.1:6666
五:验证
1、拉取外部包:
go get github.com/tal-tech/go-zero
通过nginx的日志就可以看到详细的请求
2、拉取内网包:
go get gitlab.yourdomain.com/demo/myproject@v0.0.1
然后可以看到
$ ls /data/athens/storage/gitlab.yourdomain.com/demo/myproject
v0.0.1
总结:为什么要使用athens?
摘抄几段来自官方的话,
不变性:
Go第一次向Athens请求依赖包时,Athens会从VCS(Github、Bitbucket等)获取。但一旦检索到该模块,它将永远保存在Athens的后端存储中,并且代理将不再返回到VCS中获取同一版本的依赖包。这就是雅典如何实现模块不变性。需要注意的是,后端存储掌握在您的手中
安全性:
软件包可能是恶意的,为了确保您的团队或公司不会安装此类恶意软件包,当go命令行请求一个被排除的模块(恶意软件)时,您可以让代理服务器返回500。这将导致构建失败,因为Go需要200 HTTP响应码。使用Athens,您可以通过过滤器(filter)文件实现此目的。
欢迎关注我的微信公众号,不定期更新,谢谢