基于 Gitlab 快速搭建私有 Go Module
Contents
实现 go get 内部 gitlab 私有库,go get 基本原理可以参考链接。
场景一
gitlab 地址比较常规时,比如 https://10.1.30.167/
-
查看 gitlab 的 external_url(如果为 ip,且无法修改配置时直接看场景二,可以修改配置时参考 https://blog.csdn.net/xiuxiuzhuanshu/article/details/115961449)
go get 响应内容
-
本地设置 Host,因为 go get 不能是 ip
1
10.1.30.167 gitlab.yykk.com
-
如果本地使用代理软件(没有可忽略),记得先配置绕过该域名,下图是 Clash For Windows
-
本地浏览器测试访问成功
-
配置 SSH Keys
-
创建一个 private repo
-
git clone 测试
1
git clone https://gitlab.yykk.com/abc/test
-
设置 .gitconfig,go get 默认走 https,这里让它走 ssh
1 2
[url "ssh://git@gitlab.yykk.com"] insteadOf = https://gitlab.yykk.com
-
设置 GOPRIVATE、GOINSECURE
1 2
go env -w GOPRIVATE=gitlab.yykk.com go env -w GOINSECURE="gitlab.yykk.com"
-
go get 测试及代码调用
1
go get gitlab.yykk.com/abc/test
场景二
场景二的解决方案更加通用,也能用来解决场景一的问题。
gitlab 地址非常规时,比如 http://10.1.1.57:9001,且 external_url 为 ip
- 本地设置 Host,这里我们需要另外搭建一个 httpserver 伪造 go get 响应来实现
|
|
-
本地浏览器访问测试
-
设置 SSH Keys
-
设置 .gitconfig
1 2
[url "ssh://git@gitlab.yykk2.com"] insteadOf = http://gitlab.yykk2.com:9001
-
git clone 测试
1
git clone https://gitlab.yykk2.com:9001/aaa/bbb/ccc
这里 clone 域名只能通过 https 的方式
-
搭建 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) } }
-
设置 GOPRIVATE、GOINSECURE
1 2
go env -w GOPRIVATE=nginx.yykk2.com go env -w GOINSECURE=nginx.yykk2.com
-
go get 测试
1
go get nginx.yykk2.com/aaa/bbb/ccc
若出现下面的错误,修改 go.mod 将你要导入的 module 修改为对应的域名
-
重新 go get 以及代码调用
参考链接
Author niudaii
LastMod 2023-12-25