Setup Gomod Proxy for Private Repository

update: #

git server(gitea,gitlab) 部署在linux环境中并且开启ssh 登录, git 代码中设置使用 ssh 的方式进行 clone/push/pull等操作,比如

git config --global url."[email protected]:".insteadOf "https://git.server.com/"

#~/.gitconfig
[url "[email protected]:"]
        insteadOf = https://git.server.com/

一般处理内网私有仓库会遇到好几个的问题:
- https证书生成,信任问题
- ip:port转成域名问题
- private repository config issue
- CI issue
- …

以目前内网git仓库的地址为192.168.1.199:3000,而且没有设置域名访问,最终要达到以git.server 域名访问,可通过 go get -v git.server/qnzs/helper 拉取内网包.

梳理出来的部署设置步骤如下:

host设置 #

nginx代理以及证书设置 #

upstream gitea {
    server 192.168.1.199:3000; #git(gitea)在内网的服务地址
}

server {
    listen 80;
    server_name git.server;

    # 选择重定向到https去
    rewrite ^(.*)$ https://${server_name}$1 permanent;
}

server{
	listen 443 ssl;
	server_name git.server;
#ssl on;
	ssl_session_cache        shared:SSL:10m;
	ssl_session_timeout      20m;
	ssl_session_tickets       on;

	ssl_certificate	/Users/jialinwu/go12/src/xo/myservice.cert; # 自签发的cert
	ssl_certificate_key	/Users/jialinwu/go12/src/xo/myservice.key; # 自生成的key


	location / {
        proxy_cache off;

        if ($http_user_agent ~* '^go.*') {
	 return 200 "<!DOCTYPE html><html><head><meta content='$host$uri git http://$host$uri.git' name='go-import'></head></html>";
	 }
        proxy_pass http://gitea;
    }
}

go环境设置私有repos地址 #

这样go 不会请求goproxy地址,而是从本地dns服务中搜寻repos的信息
go env -w GOPRIVATE=git.server

go项目中设置go mod文件 #

根据实际tag版本编辑更新

require helper v1.0.0
replace helper v1.0.0 => git.server/qnzs/helper v1.0.0

CI环境正常也要支持如上的配置,还有更直接快速的解决方法,可以在git clone $helper 后,sed 替换git.server/qnzs/helper v1.0.0成绝对路径,如

git clone http://192.168.1.199:3000/qnzs/helper.git  /data/go/src/helper
sed -i ';s;git.server/qnzs/helper v1.0.0;/data/go/src/helper;g' go.mod

可能会遇到的问题错误提示: #

private repository 问题
verifying git.server/qnzs/[email protected]: git.server/qnzs/[email protected]: reading https://mirrors.aliyun.com/goproxy/sumdb/sum.golang.org/lookup/git$
server/qnzs/[email protected]: 410 Gone

证书信任问题
go get git.server/qnzs/gitproxy: unrecognized import path “git.server/qnzs/gitproxy” (https fetch: Get https://git.server/qnzs/gitproxy?go-get=1: x509: certifi
cate signed by unknown authority)

go.mod文件格式不对问题 很可能是 包名和=之间 少了空格,如
replace helper v1.0.0 =>git.server/qnzs/helper v1.0.0
正确应该为
replace helper v1.0.0 => git.server/qnzs/helper v1.0.0
usage: replace module/path [v1.2.3] => other/module v1.4
or replace module/path [v1.2.3] => ../local/directory

代理后meta信息不匹配问题 通过判断 $http_user_agent 设置meta信息解决(走https或者ssh)
?go-get=1: no go-import meta tags ())

2021-04-25