实现 go get 内部 gitlab 私有库,go get 基本原理可以参考链接。

场景一

gitlab 地址比较常规时,比如 https://10.1.30.167/

  1. 查看 gitlab 的 external_url(如果为 ip,且无法修改配置时直接看场景二,可以修改配置时参考 https://blog.csdn.net/xiuxiuzhuanshu/article/details/115961449)

image-20231226113123873

go get 响应内容

image-20231226114518342

  1. 本地设置 Host,因为 go get 不能是 ip

    1
    
    10.1.30.167	gitlab.yykk.com
  2. 如果本地使用代理软件(没有可忽略),记得先配置绕过该域名,下图是 Clash For Windows

image-20231226105548706

  1. 本地浏览器测试访问成功

image-20231226113348876

  1. 配置 SSH Keys

image-20231226113417169

  1. 创建一个 private repo

image-20231226113459089

  1. git clone 测试

    1
    
    git clone https://gitlab.yykk.com/abc/test

image-20231226113534003

  1. 设置 .gitconfig,go get 默认走 https,这里让它走 ssh

    1
    2
    
    [url "ssh://git@gitlab.yykk.com"]
    	insteadOf = https://gitlab.yykk.com
  2. 设置 GOPRIVATE、GOINSECURE

    1
    2
    
    go env -w GOPRIVATE=gitlab.yykk.com
    go env -w GOINSECURE="gitlab.yykk.com"
  3. go get 测试及代码调用

    1
    
    go get gitlab.yykk.com/abc/test

    image-20231226113705734

    image-20231226113911837

场景二

场景二的解决方案更加通用,也能用来解决场景一的问题。

gitlab 地址非常规时,比如 http://10.1.1.57:9001,且 external_url 为 ip

  1. 本地设置 Host,这里我们需要另外搭建一个 httpserver 伪造 go get 响应来实现

    1
    2
    
    10.1.1.57	gitlab.yykk2.com
    127.0.0.1	nginx.yykk2.com
  2. 本地浏览器访问测试

image-20231226115237596

  1. 设置 SSH Keys

  2. 设置 .gitconfig

    1
    2
    
    [url "ssh://git@gitlab.yykk2.com"]
    	insteadOf = http://gitlab.yykk2.com:9001
  3. git clone 测试

    1
    
    git clone https://gitlab.yykk2.com:9001/aaa/bbb/ccc

这里 clone 域名只能通过 https 的方式

image-20231226142421824

  1. 搭建 httpserver

根据情况设置 minLen

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
   package main
   
   import (
   	"fmt"
   	"log"
   	"net/http"
   	"strings"
   )
   
   // Example
   // code server http://aaa.com:888/user/repo.git
   // code import path: bbb.com/user/repo
   //
   // host => aaa.com:888
   // vcs  => git
   // root => bbb.com
   
   type Getter struct {
   	host string //gitlab address
   	vcs  string //git
   	root string //git
   }
   
   func NewGetter(host string, vcs string, root string) *Getter {
   	return &Getter{
   		host: host,
   		vcs:  vcs,
   		root: root,
   	}
   }
   
   const minLen = 3
   
   func (x *Getter) ServeHTTP(w http.ResponseWriter, r *http.Request) {
   	if r.URL.Query().Get("go-get") == "1" {
   		sp := strings.Split(r.URL.Path[1:], "/")
   		if len(sp) < minLen {
   			http.Error(w, fmt.Errorf("unsupport path: %s", r.URL.Path).Error(), http.StatusBadRequest)
   			return
   		}
   		packageName := fmt.Sprintf("%v%v", x.root, r.URL.Path)
   		repository := fmt.Sprintf("https://%v%v.%v", x.host, r.URL.Path, x.vcs)
   		fmt.Fprintf(w, `<html><head><meta name="go-import" content="%s %s %s" /></head></html>`, packageName, x.vcs, repository)
   		log.Println("go get [", packageName, "] from repository [", repository, "].")
   		return
   	}
   	http.Error(w, fmt.Errorf("unsupport request: %s", r.URL.Path).Error(), http.StatusBadRequest)
   }
   
   func main() {
   	// 定义一个 GET 请求的路由
   	getter := NewGetter("gitlab.yykk2.com:9001", "git", "nginx.yykk2.com")
   	// 定义一个通配符路由
   	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
   		getter.ServeHTTP(w, r)
   	})
   	// 启动 HTTP 服务器,监听域名:端口
   	server := http.Server{
   		Addr: "0.0.0.0:80",
   	}
   	log.Printf("Starting server on %s", server.Addr)
   	err := server.ListenAndServe()
   	if err != nil {
   		fmt.Println(err)
   	}
   }
  1. 设置 GOPRIVATE、GOINSECURE

    1
    2
    
    go env -w GOPRIVATE=nginx.yykk2.com
    go env -w GOINSECURE=nginx.yykk2.com
  2. go get 测试

    1
    
    go get nginx.yykk2.com/aaa/bbb/ccc

若出现下面的错误,修改 go.mod 将你要导入的 module 修改为对应的域名

image-20231226142639771

image-20231226142922663

  1. 重新 go get 以及代码调用

image-20231226143104541

image-20231226143154111

参考链接

https://blog.csdn.net/qq_39647045/article/details/125042614

https://studygolang.com/articles/20527