go get 支持gitlab私有库

背景

  • 一般公司都会有自己的私有框架或者公共函数库,这些大都会部署在公司私有的gitlab上
  • 通过配置 GOPRIVATE 可以使 go-get 不走代理而直接访问私有库,但是 go get 默认会使用https 去请求私库

问题

  • 私有库不支持https, 仅支持 http
  • 私库端口号不是默认80端口
# 如果80端口被占用或者考虑到暴露80端口可能存在被攻击的风险,通常代码仓库可能不会用默认端口。
# go get 拉取仓库代码时不允许加端口号,不是默认端口时会报 unknown import path

解决办法

  • 私有库不支持https
# 添加 GOINSECURE 环境变量
GOINSECURE=git.private.com  // 此处设置为私库域名
  • 私有库端口不是默认80 端口
# 配置nginx反向代理,将gitlab服务端口转发。
需要注意的是,goget会通过发起https请求去获取仓库的真实路径,所以要伪造一个goget响应,避免验证匹配规则时失败

# 新建nginx配置文件
sudo vim /etc/nginx/conf.d/git.private.com.conf

# 添加如下配置
server {
    listen 80;
    listen 443 ssl;
    server_name gitlab.private.com;
    
    # 伪造goget响应,使得内部验证规则通过
    if ($args ~* "^go-get=1") {
      set $condition goget;
    }
    if ($uri ~ ^/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)(/[\p{L}0-9_.\-]+)*$) {
      set $condition "${condition}path";
    }
    if ($condition = "gogetpath") {
      return 200 "<!DOCTYPE html><html><head><meta content='gitlab.private.com/$1/$2 git http://gitlab.
private.com/$1/$2.git' name='go-import'></head></html>";
    }

    location / {
            proxy_pass http://git.private.com:9999;
    }

    ssl_certificate   cert/private.com.pem;
    ssl_certificate_key  cert/private.com.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;
}

参考

goget取包原理 https://studygolang.com/articles/18726
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值