Go Module 支援 HTTP 協議的私有庫方案

jemygraw發表於2020-05-12

需要 go 1.14 及以上版本支援

背景

假設有個 ABC 公司,在內網部署了一個 gitlab 的服務,域名是 http://git.abc.com 。他們的程式設計師需要使用 Go Module 的功能。 由於有些公共程式碼是公司內部的,而有些依賴則是 Github 上開源的,另外為了提高 Go Module 下載速度,他們還打算用阿里雲的加速服務。

問題來了,Go Module 預設支援的是 https 的域名,所以內網的 gitlab 服務就比較麻煩,也就是說內網的 gitlab 的庫下載的時候要滿足兩點需求,一個是支援 http 協議,另外一個是不使用阿里雲的代理。

方案

首先升級 Git 版本,當然也可以試試下面的步驟先,如果編譯過程下載私有庫的時候沒有出現 unknown revision 的錯誤,就不需要升級 Git。升級 Git 肯定都會,貼一個 Centos 7 的升級指令碼。

wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.26.2.tar.gz
yum install libcurl-devel
yum install libcom_err-devel
yum install libopenssl-devel
CPPFLAGS="-I/usr/include/" LDFLAGS="-L/usr/lib64" ./configure --prefix /usr/local/git/
make && make install

其次,我們需要引入兩個環境變數來支援私有庫的 http 協議和忽略使用阿里雲的代理。

export GOINSECURE=git.abc.com
export GONOPROXY=git.abc.com

這樣的話,整個配置如下:

# set GOPATH
export GOPATH=/home/jenkins/go/GoProjects

# enable Go module
export GO111MODULE=on
export GOINSECURE=git.abc.com
export GONOPROXY=git.abc.com
export GOPROXY=https://mirrors.aliyun.com/goproxy/

上面的內容搞定之後,如果你下載私有庫的時候還會出現下面的錯誤,要求提供鑑權。

go: finding module for package git.abc.com/devops/base/wechat
go: finding module for package git.abc.com/devops/base/storage
conf/config.go:6:2: module git.abc.com/devops/base/storage: git ls-remote -q origin in /home/jenkins/go/GoProjects/pkg/mod/cache/vcs/c93a7972976a1967065d0c6e6991f8c13a161f1a51c5aa2079b1724afad589a1: exit status 128:
    fatal: could not read Username for 'http://git.abc.com': terminal prompts disabled
Confirm the import path was entered correctly.
If this is a private repository, see https://golang.org/doc/faq#git_https for additional information.
conf/config.go:7:2: module git.abc.com/devops/base/wechat: git ls-remote -q origin in /home/jenkins/go/GoProjects/pkg/mod/cache/vcs/c93a7972976a1967065d0c6e6991f8c13a161f1a51c5aa2079b1724afad589a1: exit status 128:
    fatal: could not read Username for 'http://git.abc.com': terminal prompts disabled
Confirm the import path was entered correctly.
If this is a private repository, see https://golang.org/doc/faq#git_https for additional information.
Build step 'Execute shell' marked build as failure

那麼,需要設定下面的內容。

git config --global http.extraheader 'PRIVATE-TOKEN: <AccessToken>'
git config --global url."git@git.abc.com:".insteadOf "http://git.abc.com/"

其中那個 替換為 Gitlab 裡面的訪問 AccessToken 即可,自己生成一個。

最後,就可以使用 go build 啦。

更多原創文章乾貨分享,請關注公眾號
  • Go Module 支援 HTTP 協議的私有庫方案
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章