Go-proxy私有仓库配置实践

2023-11-03

一 项目背景

目前的golang私有库依赖,可以放在git repo中,需要特别在go.mod中写replace条目,解决多重依赖很麻烦,git 的repo有可能比较大,使用该方案能够支持版本的统一管理(公共依赖和私有依赖都通过go get 获取)。

二 整体流程

     前言: 因为私有仓库不能直接go get, 所以需要自己开发一个<代理服务>,参https://segmentfault.com/a/1190000018398763的三篇帖子。

 

  1. 启动<代理服务>,启动的详细配置见附录https证书相关配置。普通的外部依赖包我们希望通过https://goproxy.cn去拉取,<your-company-domian>的包则希望通过http://<your-git-ip>:<your-git-porty>/pkg/pkg2拉取。但是公司内部的包都是以 “<your-company-domian>”开头,所以需要配置/etc/hosts文件,将g<your-company-domian>指向真实的仓库地址。此外还需要配置环境变量GONOPROXY=<your-company-domian>(详见附录GO(v>=v1.13)环境变量设置),配置好之后只要是<your-company-domian>的包都会向<代理服务>发送https请求(具体原理请参考附录go get原理)。

 

     2. <代理服务>响应html页面,页面包含了真实的仓库地址http://<ip>:<port>/pkg/pkg2.git。

 

     3. 获得真实的git仓库地址后,go get通过向git仓库发送git ls-remote请求获取仓库可用版本列表。通过git clone下载对应的源码。如果此时的git仓库不是公共仓库,下载会有权限问题,此时可以更改git的全局配置解决(详见附录git 的配置)。

 

      4. 返回对应的源码的$GOPATH/pkg/mod 里面。

 

      5. 需要拉取外部的依赖。

         直接通过https://goproxy.cn获取对应的源码并且下载到$GOPATH/pkg/mod 里面。

 

备注:目前国内的goproxy代理主要有https://goproxy.io 和https://goproxy.cn两者都是由中国人开发,https://goproxy.cn的延时是https://goproxy.io的一半。

 

三 集成配置方案

centos7:

1.配置环境变量

GOPROXY = http://ip:port

GONOPROXY=<your-company-domian>

2.配置 /etc/hosts

ip  <your-company-domian>

该ip指的是<代理服务>运行的地址

3.配置https证书

不同操作系统的配置方式不同,详见第四节(各种操作系统开发环境配置)

cat .../ca.crt >> /etc/pki/tls/certs/ca-bundle.crt 更新证书。

  1. Git的配置

如果所依赖的包不是公共权限能够访问到的包,需要对git做全局权限配置。具体参照附录Git的配置。

 

四 各种操作系统开发环境配置

Centos7

1.配置host文件

cat /etc/hosts

ip  <your-company-domian>

 

  1. 配置环境变量:

详见附录

 

  1. 更新证书:

cat <your-company-domian>-ca.crt >> /etc/pki/tls/certs/ca-bundle.crt

验证配置:curl https://<your-company-domian>/common/abc?go-get=1返回html页面则说明构建成功

 

  1. git全局配置:

git config --global url."ssh://<yourname>@<your-git-ip>:29418".insteadof "http://<your-git-ip>"

验证配置:去<your-git-ip>的git仓库查找一个仓库

如果执行 git ls-remote -q http://<your-git-ip>/<your-pkg> 返回正确的值即表示成功

 

Ubuntu

 

1.配置host文件

cat /etc/hosts

ip <your-company-domian>

 

2.配置环境变量:

详见附录

 

3.更新证书:

cp <your-company-domian>-ca.crt /usr/local/share/ca-certificates

update-ca-certificates

验证配置:curl https://<your-company-domian>/common/abc?go-get=1返回html页面则说明构建成功

 

4.git全局配置:

git config --global url."ssh://<yourname>@1<your-git-ip>:29418".insteadof "http://<your-git-ip>"

 

验证配置:去<your-git-ip>的git仓库查找一个仓库

如果执行 git ls-remote -q http://<your-pkg> 返回正确的值即表示成功

 

Macos

  1. 配置host文件

cat /etc/hosts

ip <your-company-domian>

 

2.配置环境变量:

详见附录

  1. 更新证书

双击证书点击安装,然后选择始终信任。

验证配置:curl https://<your-company-domian>/common/abc?go-get=1返回html页面则说明构建成功

4.git全局配置:

git config --global url."ssh://<yourname>@<your-git-ip>:29418".insteadof "http://<your-git-ip>"

验证配置:去<your-git-ip>的git仓库查找一个仓库

如果执行 git ls-remote -q http://<your-git-ip>/<your-pkg> 返回正确的值即表示成功

Windows

  1. 配置host文件

在C:\Windows\System32\drivers\etc\hosts中添加

ip <your-company-domian>

  1. 配置环境变量:

详见附录

  1. 更新证书

浏览器访问如下网址:

下载<your-company-domian>-ca.crt,如果没有下载,换个浏览器试一下

 

双击打开,安装证书

验证配置:curl https://<your-company-domian>/common/abc?go-get=1返回html页面则说明构建成功

 

4.git全局配置:git config --global url."ssh://<yourname>@<your-git-ip>:29418".insteadof "http://<your-git-ip>"

验证配置:去<your-git-ip>的git仓库查找一个仓库

如果执行 git ls-remote -q http://<your-company-domian>/<your-pkg> 返回正确的值即表示成功

 

 

 

 

日常使用手册

  1. 在.go文件中import需要依赖的包
  2. go build/ go mod tidy/go test 会自动添加需要的依赖

如果不需要自动拉取依赖,需要指定版本的依赖,使用go get foo@v1.2.3, go get foo@master (foo@tip with mercurial), go get foo@e3702bed2, or by editing go.mod directly

  1. 常用命令

cmd

decs

go list -m all

列出依赖和版本详情

go list -u -m all

查看可升级的依赖包

go get -u or go get -u=patch

更新依赖包

go mod vendor

继续使用verndor模式,依赖直接下载到工程的vendor目录

 

F&Q

如果开源的包没有规范的版本号,如何指定依赖?

有些包没有按照go module的规范打tag, 导致无法直接编辑go.mod,如果自动拉取会自动拉取最新依赖,和代码实际依赖的版本可能冲突。此时可以通过commit号来解决。

例如某个工程依赖:了k8s.io/api 分支release1.12,tag为kubernates-v1.10 。此时需要去github上找到对应的commit-id, 通过go get k8s.io/api@<commit-id>即可将对应版本的依赖自动写入到go mod文件中。github的分支和tag查找如下图所示:

 

如果依赖的包是git仓库的子集目录,能够自动获取吗?

可以,目前公司开发的<代理服务>支持直接获取依赖。

或者直接用go get命令下载对应的代码到本地,例如我们自己的私有依赖包:<your-company-domian>/common/go-pkg/common-util/flaghelper

,但是flaghelper是<your-company-domian>/common/go-pkg/common-util.git仓库的子集。如果直接在代码里面import了<your-company-domian>/common/go-pkg/common-util/flaghelper , go get会自动拉取

https://g<your-company-domian>/common/go-pkg/common-util/flaghelper.git 而报错,解决的办法是在对应的工程的go.mod目录下执行: go <your-company-domian>/common/go-pkg/common-util ,将依赖拉取到本地并且自动更新go.mod文件,在项目中就可以直接imoport :

<your-company-domian>/common/go-pkg/common-util/flaghelper了。

附录

https证书相关配置

  1. 生成服务端的根证书:

openssl genrsa -out ca.key 1024

openssl req -new -x509 -days 36500

  -sha512 -subj "/O=<your-company-domian>/CN=ca" -key ca.key -out ca.crt

  1. 生成服务端证书的私钥和签名请求

openssl genrsa -out server.key 1024

openssl req -new -subj "/O=<your-company-domian>/CN=registry" -key server.key -out server.csr

  1. 准备生成服务端证书的配置(其中<your-company-domian>是预期服务被访问的域名)

cp /etc/pki/tls/openssl.cnf openssl.cnf

cat >> openssl.cnf << EOF

[ SAN ]

basicConstraints = CA:FALSE

extendedKeyUsage = serverAuth, clientAuth

keyUsage = digitalSignature, keyEncipherment

subjectAltName = IP:xxx.xxx.xxx.xxx,IP:127.0.0.1,DNS:<your-company-domian>

EOF

4、生成服务端证书

openssl x509 -req -extfile openssl.cnf -extensions SAN -days 36500 -sha512  -CAcreateserial -CA ca.crt  -CAkey ca.key -in server.csr -out server.crt

5、更新机器认证信息

cat .../ca.crt >> /etc/pki/tls/certs/ca-bundle.crt

经过该配置后,访问https的服务就不会出现不信任证书的错误。

eg: curl https://<your-company-domian>/pkg1/pkg2 可以正常访问到<代理服务>。

Go get 原理

使用go get 取包时:go get <your-company-domian>/pkg/pkg2,,

会先默认发送一个https请求:https://<your-company-domian>/pkg/pkg1?go-get=1,

该请求响应为:

<html><head><meta name="go-import" content="<your-company-domian>/pkg/pkg2 git https://<ip>:<port>/pkg/pkg2.git" /></head></html>

通过响应的内容,确定git仓库地址。因为我们的git仓库并不会自动产生该响应,所以需要一个中间件来代理此服务。

 

Git 的配置

1.配置私有ssh访问方式

cat  ~/.gitconfig

[user]

name = xxx

email = xxx

[url "ssh://admin@192.168.60.7:29418"]

insteadof = <return of <your-company-domian>>

 

或者使用命令:

git config --global url."ssh://admin@192.168.60.7:29418".insteadof "<return of <代理服务>>"

 

GO (V >= V1.13)环境变量设置

export GOPROXY=https://goproxy.cn  #公共包的代理

export GOSUMDB=sum.golang.google.cn  #公共包版本校验地址,如果设置off可不校验包

export GO111MODULE=on  

export GONOPROXY=<your-company-domian>  #<your-company-domian>的包不去proxy.cn拉取,也不做版本校验

export GONOSUMDB=<your-company-domian>"#不做sum校验的包

 

Go modules 官方文档

https://github.com/golang/go/wiki/Modules

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go-proxy私有仓库配置实践 的相关文章

随机推荐

  • 虚幻4学习笔记(8)动手制作一个小游戏

    动手制作一个小游戏 新节点介绍 前期准备 搭建场景 门蓝图 灯蓝图 创建关卡蓝图 B站UP谌嘉诚课程 https www bilibili com video BV164411Y732 新节点介绍 前期准备 搭建场景 H隐藏 场景中当前选中
  • Caffe 在 win10 环境下配置

    参考 Caffe windows10下caffe安装 Windows 10下安装配置Caffe并支持GPU加速 整了好几天 终于实现 windows 环境下的 caffe 编译 实现 win10 caffe vs2013 anaconda2
  • windows10 安装wsl2+docker+php+nginx+mysql

    第一步在windows10 上安装docker 可视化桌面 第二步确定本地电脑开启虚拟化 同时确认下方图内容已经勾选 在cmd下使用命令 wsl install 安装wsl2 因 wsl2 默认安装ubuntu系统 如果安装wsl2后没有安
  • 最简单替换jar包class文件

    jar包右击 打开方式 360压缩 找到需要替换的地址 直接拖进去替换即可 方便快捷
  • 多元分类预测

    文章目录 效果一览 文章概述 部分源码 参考资料 效果一览 文章概述 多元分类预测 Matlab 基于K近邻算法 KNN 的数据分类预测 多特征输入模型 多特征输入单输出的二分类及多分类模型 程序内注释详细 直接替换数据就可以用 程序语言为
  • pytorch: torch.max() 使用与理解

    在使用 pytorch 进行训练时 会使用使用到改行代码 predict torch max outputs data 1 1 其中 output 为模型的输出 该函数主要用来求 tensor 的最大值 每次看到都不太理解 torch ma
  • 微服务:熔断,限流,降级

    1 熔断 限流 降级 2 从微观角度思考 2 1 超时 timeout 在接口调用过程中 consumer调用provider的时候 provider在响应的时候 有可能会慢 如果provider 10s响应 那么consumer也会至少1
  • uniCloud云函数操作云数据库增删改查

    uniCloud操作云数据库 1 获取集合的引用 const db uniCloud database 获取 users 集合的引用 const users db collection users 2 集合Collection 通过db c
  • 6G推进组发布《6G总体愿景与潜在关键技术》白皮书!(附PPT及白皮书下载)

    就在昨日 6月6日 我国工信部IMT 2030 6G 推进组正式发布了 6G总体愿景与潜在关键技术 白皮书 白皮书梳理出6G的总体愿景和八大业务应用场景及相应的指标需求 提出了十大潜在关键技术 并阐述了对6G发展中面临的若干关键问题的观点
  • 光照 (5) 法线矩阵(Normal Matrix)

    定义 模型矩阵左上角3x3部分的逆矩阵的转置矩阵 注意 大部分的资源都会将法线矩阵定义为应用到模型 观察矩阵 Model view Matrix 上的操作 但是由于我们只在世界空间中进行操作 不是在观察空间 我们只使用模型矩阵 1 1 法向
  • Java FTP上传多个相同文件,下载相同的文件乱码

    业务背景 上传临时目录业务 一个F XXXX 700100 XXX函件 里面有多个工程文件 每个工程文件里面文件名不一样 生成MD5保存在本地的临时目录不一样 根据MD5生成的路径 不可能有重复的文件 文件名 函件保存FTP业务 读取临时目
  • ImportError: No module named 'contestlib2'

    我在利用TensorFlow Object Detection API预训练模型训练自己的数据时出现 ImportError No module named contestlib2 解决方法 执行 sudo apt get install
  • openGL之API学习(一八二)Link failed because of invalid vertex shader

    essl版本使用不匹配 P0007 Language version 120 unknown this compiler only supports up to version 320 es
  • 动态规划相关

    动态规划理论基础 什么是动态规划 动态规划 英文 Dynamic Programming 简称DP 如果某一问题有很多重叠子问题 使用动态规划是最有效的 所以动态规划中每一个状态一定是由上一个状态推导出来的 这一点就区分于贪心算法 贪心没有
  • 计算机网络实验之IPV4地址 - - 构造超网(无分类编址)

    IPV4地址 构造超网 无分类编址 本实验把通信网络分为四个子网 第一个子网 主机0 主机1 交换机0 路由器的端口0 第二个子网 主机2 主机3 交换机1 路由器的端口1 第三个子网 路由器0的端口2和路由器1的端口0 第四个子网 路由器
  • layui 如何动态加载局部页面_最符合国情的开源Layui后端管理应用模板——KitAdmin...

    介绍 layui是国内开发者开发的一个面向所有层次的前后端开发者 零门槛开箱即用的前端UI解决方案 可以说它极度符合国人的风格 深受广大前后端开发者和爱好者的喜爱 也诞生了不少基于layui的框架模板 特别适合国内前中后端工程师使用 KIT
  • vision in transformer代码(attention的可视化)

    github地址 https github com lucidrains vit pytorch 这地方可以进行attention的可视化 在做不同方面的人体部分的特征整合时可以可视化看看对于不同子动作的attention值进行可视化
  • MySQL 8.0.23安装教程

    MySQL安装教程 第一步 下载MySQL 下载MySQL 我选择的第一个 第二步 安装MySQL 1 下载完成后 我们需要把文件解压到自己想要安装MySQL的位置 我的安装位置D mysql 8 0 23 winx64 2 配置环境变量
  • HLA库串口不进串口接收中断回调的处理方法

    使用回调首先 1 开启宏使能 2 配置回调 3 实现回调函数 注意it h中也要加入声明
  • Go-proxy私有仓库配置实践

    一 项目背景 目前的golang私有库依赖 可以放在git repo中 需要特别在go mod中写replace条目 解决多重依赖很麻烦 git 的repo有可能比较大 使用该方案能够支持版本的统一管理 公共依赖和私有依赖都通过go get