Gitlab下私有Go modules的搭建配置

3,411 阅读1分钟

前言

  • 团队目前使用GitlabCE作为Golang代码仓库使用,需要把一些常用的公共代码块(工具类、RPC接口等)独立成模块供其他二方系统调用.这样能复用代码块,方便扩展与维护.因此考虑使用Gitlab配合go mod,实现私有而方包的管理.

准备

  • Gitlab 13.10.3
  • Golang 1.16.3
  • 指向Gitlab的HTTPS域名,这里我们模拟域名为:my.gitlab.private
  • Nginx 1.18.0

链路

未命名文件.png

原理

  • go get 下载路径为域名+项目路径的格式,而且默认使用https下载,所以我们可以使用nginx搭建https服务,将请求通过http转发给gitlab,实现二方包的下载.

实践

Gitlab准备

启用 go proxy

image.png

准备go module工程

  • 这里假定工程的完成路径为:my.gitlab.private/mytest/mysu…
  • 我们的go.mod文件的module名要设置为module my.gitlab.private/mytest/mysubtest/myproject.git
    • 注意⚠️:go module的名称要和gitlab的路径保持一致

image.png

  • 给工程打上tag,用于区分版本用

image.png

配置用户的AccessToken

image.png

  • 注意⚠️:Scopes选择api;用户要有能访问上文仓库的权限.

Nginx配置

HTTPS配置

 server {
        listen    443 ssl;
        server_name  my.gitlab.private;
        ssl_certificate     /etc/nginx/conf.d/gitlab-ssl.crt;
        ssl_certificate_key   /etc/nginx/conf.d/gitlab-ssl.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;

        location / {
            proxy_pass http://127.0.0.1:80; #gitlab的http地址
            if ($args ~* "^go-get=1") {
                set $condition goget;
            }
            if ($uri ~ ^/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/.*$) {
                set $condition "${condition}path";   
            }
            if ($condition = gogetpath) {
             return 200 "<!DOCTYPE html><html><head><meta content='my.gitlab.private/$1/$2 git https://my.gitlab.private/$1/$2.git' name='go-import'></head></html>";
            }
        }
}
  • 当可以通过浏览器访问my.gitlab.private 到达gitlab的页面,证明配置成功了.

Golang环境配置

Golang全局环境配置

环境变量内容
GO111MODULEon
GOPROXYgoproxy.cn
GOPRIVATEmy.gitlab.private
  • 使用GOPRIVATE,让私有库从my.gitlab.private上获取.

配置.netrc文件

  • 此文件是让go get访问gitlab的仓库使用的
  • 路径为 ~/.netrc
  • 内容为: machine <url> login <username> password <token>

image.png

  • 比如:machine my.gitlab.private login admin password fqq3d7LsMxxa-hoK_sNvk

测试依赖包获取

  • 运行命令: go get my.gitlab.private/mytest/mysubtest/myproject.git
  • 打开$GOPATH/pkg/mod/my.gitlab.private,可以看到私有库的依赖已被下载到本地

image.png

总结

  • go get 需要用域名的方式,内网用户需要自己在内网搭建DNS解析服务
  • go get 的时候,最后的.git不能忽略

参考