离线环境下搭建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")

posted on 2024-07-12 15:28  孑遗  阅读(210)  评论(0)    收藏  举报

导航