实现 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

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

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

    image-20231226105548706

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

    image-20231226113348876

  5. 配置 SSH Keys

    image-20231226113417169

  6. 创建一个 private repo

    image-20231226113459089

  7. git clone 测试

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

    image-20231226113534003

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

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

    1
    2
    
    go env -w GOPRIVATE=gitlab.yykk.com
    go env -w GOINSECURE="gitlab.yykk.com"
    
  10. 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
  1. 本地浏览器访问测试

    image-20231226115237596

  2. 设置 SSH Keys

  3. 设置 .gitconfig

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

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

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

    image-20231226142421824

  5. 搭建 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)
    	}
    }
    
  6. 设置 GOPRIVATE、GOINSECURE

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

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

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

    image-20231226142639771

    image-20231226142922663

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

    image-20231226143104541

    image-20231226143154111

参考链接

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

https://studygolang.com/articles/20527