离线环境下搭建Go Module代理仓库服务
由于公司突然要求内外网隔离,不允许在内网搭建任何代理服务器访问外网,之前使用go proxy搭建的内网go mod仓库代理也关停了,CI/CD环境直接崩溃,无奈只能找新的方式搭建内网代理仓库。尝试了很多种方式,最后在github上找到了 Athens 这个项目,其使用方式如下
0、环境准备
内网环境:ubuntu20.04 物理服务器
外网环境:ubuntu20.04 虚拟机,go1.21
1、安装配置内网Athens
在外网环境下,参考官网的构建流程即可直接编译源码
git clone https://github.com/gomods/athens
cd athens
make build-ver VERSION="0.2.0"
编译好之后得到一个二进制文件athens,然后拷贝到内网,
再拷贝源码内的配置文件模板config.dev.toml到内网,并修改以下内容
SorageType = "disk" //存储类型选择本地磁盘
Port = ":3000" // 代理服务端口根据自己需求修改
NetworkMode = "offline" // 内外哇不通,设置为离线模式
DownloadMode = "none"
[Storage]
[Storage.Disk]
RootPath = "/opt/athens/data" //本地存储路径
其它配置项可参考文件注释,及自己的实际需求修改
启动athens服务
nohup ./athens -config_file=./config.dev.toml &
内网开发环境、CI/CD环境配置go mod 代理
go env -w GOPROXY="http://athens_server_ip:3000"
go env -w GOSUMDB="off" //必须关闭GOSUMDB
2、安装配置外网athens
外网的athens配置文件config.dev.toml修改如下
GoBinaryEnvVars = ["GOPROXY=https://goproxy.cn"]
SumDBs = ["https://sum.golang.google.cn"]
GlobalEndpoint = "https://goproxy.cn"
SorageType = "disk" //存储类型选择本地磁盘
Port = ":3000" // 代理服务端口根据自己需求修改
NetworkMode = "offline" // 内外哇不通,设置为离线模式
DownloadMode = "none"
[Storage]
[Storage.Disk]
RootPath = "/opt/athens/data" //本地存储路径
直接启动athens服务
nohup ./athens -config_file=./config.dev.toml &
设置外网机器的本地go mod 代理
go env -w GOPROXY="http://127.0.0.1:3000"
go env -w GOSUMDB="sum.golang.google.cn"
3、外网下载module包,拷贝到内网
在外网搭建了athens服务的机器上,go get 所需的mod依赖包,然后拷贝/opt/athens/data下的文件到内网athens服务器的存储路径下即可
附:快速批量下载go mod包的方法
1)、快速下载一个项目的所有依赖
拷贝项目的go.mod文件到外网的athens服务器上执行如下命令
go list -modfile=./go.mod -m -json -mod=mod all #gosetup
2)、快速下载某个依赖包的所有历史版本及其子依赖包
复制粘贴如下python脚本到外网athens服务器上,命名为go_mod_download.py
创建文件mod.txt,将要下载的go mod依赖包按行写入mod.txt文件,注意不要带版本号
执行如下命令即可
python3 ./go_mod_download.py
python脚本如下:
#!/usr/bin/python3
import time
import os
def run():
fileHandler = open("mod.txt", "r")
num = 0
while True:
line = fileHandler.readline()
if not line:
break;
str = os.popen("go list -m -versions " + line).read()
versions = str.split()
for i in range(1, len(versions)):
cmd = 'rm ./go.mod; touch ./go.mod; go mod edit -module=example.com/mod'
os.system(cmd)
go_download = 'go mod download ' + versions[0] + '@' + versions[i]
os.system(go_download)
go_download = 'go get ' + versions[0] + '@' + versions[i]
os.system(go_download)
num += 1
if num > 10:
num = 0
os.system("go clean -modcache;sleep 2")
print("sleep 2s")
fileHandler.close()
if __name__ == '__main__':
os.system("go clean -modcache")
run()
os.system("go clean -modcache")
浙公网安备 33010602011771号