一 项目背景

目前的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

Go-proxy私有仓库配置实践相关推荐

  1. 搭建docker私有仓库 配置用户名密码

    文章目录 1.系统配置 2.搭建服务端 3.配置Windows客户端 4.配置centos客户端 5.查看效果 6.注意点 1.系统配置 服务端:centos 7 客户端:Windows 10 2.搭 ...

  2. go mod拉取git私有仓库配置方法

  3. Nexus搭建私有仓库

    一.安装 1.官网下安装包 官网地址:Nexus Repository OSS - Software Component Management | Sonatype 但是需要连接V*N. 2.scp方 ...

  4. k8s-kubeadm和Harbor私有仓库部署

    部署k8s-kubeadm 文章目录 环境准备 需求: 环境部署 部署K8S集群 //设定kubectl //所有节点部署网络插件flannel //测试 pod 资源创建 部署 Dashboard ...

  5. 使用Nexus配置Maven私有仓库

    使用Nexus配置Maven私有仓库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装配置Nexus 1>.下载nexus 下载地址:https://www.sonat ...

  6. 企业级docker私有仓库的配置与使用

    1 搭建Harbor企业级docker仓库 搭建docker私有仓库是企业在docker使用中必不可少的步骤,harbor是由vmware几个大神开源出来的一款非常优秀的产品.因此今天来讲述一下如何在 ...

  7. 配置私有仓库(使用registry镜像搭建一个私有仓库)

    在使用Docker一段时间后,往往会发现手头积累了大量的自定义镜像文件,这些文件通过公有仓库进行管理并不方便:另外有时候只是希望在内部用户之间进行分享,不希望暴露出去.这种情况下,就有必要搭建一个本地 ...

  8. python包发布到pypi或私有仓库 实践及踩坑 ModuleNotFoundError: No module named 'keyring.util.escape' 等

    0.写在开头: 封装我们自己写好的python包然后分享到网络提供给大家使用, 这本来是一个基本操作. 但是之前个人没有主动上传过自己封装的库到pypi, 正好趁这次自己封装简单包提供给大家用的机会, ...

  9. nexus(maven仓库)搭建配置maven本地私有仓库

    一 私服的作用,为什么要使用私服? 内网访问,内网团队使用一个服务缓存节省外网宽带. 微服务开发中加速 Maven 项目构建,加快团队合作,提高工作效率 允许上传和下载私有库,并且不被外部访问,安全 ...

最新文章

  1. Github标星57k+,热榜第一,用Python实现所有算法
  2. fpga经典设计100例_图解运放电路/OP放大电路设计/OP放大器应用技巧100例
  3. Logging with Log4net (二)
  4. 三运放差分放大电路分析_信号源内阻对差动放大电路共模抑制比的影响分析与改善方法...
  5. ThinkPHP之add、save无法添加、修改的解决方案
  6. C# 异常处理(一)
  7. (产品)为什么知乎live采用分段语音输入而不是实时语音直播
  8. CF621E Wet Shark and Blocks
  9. 【计算机组成与设计:硬件/软件接口】第三章:计算机的算术运算
  10. Python开发3D游戏技术探索
  11. 三星android智能手机usb驱动程序,三星手机USB驱动
  12. uniapp中针对H5端做微信分享功能总结
  13. 在微信小程序中打造 MQTT 连接测试工具
  14. 步进电机驱动技术3:基于ULN2003的步进电机驱动
  15. Android App加壳中的整体dex加壳的原理和脱壳
  16. Windbg调试工具介绍
  17. sre和devops_什么是SRE,它与DevOps有什么关系?
  18. 报错解决:symbol lookup error-----undefined symbol: JLI_StringDup
  19. BMS-Pro电池巡检综合监控系统
  20. 【QGIS入门实战精品教程】8.1:QGIS制作地图案例教程

热门文章

  1. 最齐全的Cocos2D Cocos creator Cocos2Dx游戏源代码素材,速来收藏
  2. 进程介绍及和线程的关系
  3. AMD推动高性能数据中心计算迈进新世代
  4. 客服系统竞品分析报告Shein
  5. 基于Linux RHEL 5 5 安装Oracle 10g RAC
  6. DNS域名服务协议和其实现Bind应用
  7. Linux动态库环境变量设置
  8. Chris16堂外教实用口语课-让你的英语脱口而出
  9. 购买SSL证书的注意事项有哪些
  10. [译] Java 桥接方法详解