本文介紹了 Gitlab 私有倉(cāng)庫(kù)建設(shè)的實(shí)踐。
包管理是 Go 一直被詬病做的不好的功能。在 1.11 之前,go get 缺乏對(duì)依賴包版本管理和 reproducible build 的支持。當(dāng)時(shí)在 Go 社區(qū)當(dāng)時(shí)誕生了許多好用的工具,比如 glide,dep 等。在 1.11 版本之后, Go 引入了 Go Module,再也沒(méi)有 GOPATH 的限制,你可以隨意在任何路徑寫項(xiàng)目,但是此時(shí)對(duì)私有倉(cāng)庫(kù)的支持還不是很好。而在 1.13 版本之后, Go 對(duì) Go Module 又進(jìn)行了優(yōu)化,支持了GOPRIVATE環(huán)境變量,可以指定私有倉(cāng)庫(kù)的地址,使用十分便捷。大家在使用過(guò)程中,或多或少地會(huì)遇到一些問(wèn)題,下面我針對(duì)自己遇到的問(wèn)題進(jìn)行總結(jié)。
go get
如果在沒(méi)有進(jìn)行任何設(shè)置的情況下直接執(zhí)行go get your.gitlab.com/pkg/example,你很可能會(huì)遇到以下錯(cuò)誤:
goget:moduleyour.gitlab.com/pkg/example:gitls-remote-qoriginin/go/pkg/mod/cache/vcs/a39fc2dbfb0a9645950d24df5d7e922bb7a6a877aecfe2b20f74b96385a83109:exitstatus128:
fatal:couldnotreadUsernamefor'https://your.gitlab.com':terminalpromptsdisabled
Confirmtheimportpathwasenteredcorrectly.
Ifthisisaprivaterepository,seehttps://golang.org/doc/faq#git_httpsforadditionalinformation.
其實(shí)錯(cuò)誤提示已經(jīng)把解決方案給到我們了,我們只需要點(diǎn)擊 golang.org/doc/faq#git_https 查看即可。
下面是原文:
Why does “go get” use HTTPS when cloning a repository?
Companies often permit outgoing traffic only on the standard TCP ports 80 (HTTP) and 443 (HTTPS), blocking outgoing traffic on other ports, including TCP port 9418 (git) and TCP port 22 (SSH). When using HTTPS instead of HTTP, git enforces certificate validation by default, providing protection against man-in-the-middle, eavesdropping and tampering attacks. The go get command therefore uses HTTPS for safety.
Git can be configured to authenticate over HTTPS or to use SSH in place of HTTPS. To authenticate over HTTPS, you can add a line to the $HOME/.netrc file that git consults:
machinegithub.comloginUSERNAMEpasswordAPIKEYFor GitHub accounts, the password can be a personal access token. Git can also be configured to use SSH in place of HTTPS for URLs matching a given prefix. For example, to use SSH for all GitHub access, add these lines to your ~/.gitconfig:
[url"ssh://git@github.com/"] insteadOf=https://github.com/
大概意思是,HTTPS 更安全,所以go get命令使用 HTTPS。
如果你要用 HTTPS,那你就需要配置 HTTPS 的用戶名和密碼:
machinegithub.comloginUSERNAMEpasswordAPIKEY
當(dāng)然也可以使用 ssh,需要修改你的 git 配置,
修改當(dāng)前用戶的~/.gitconfig,添加:
[url"ssh://git@your.gitlab.com/"]
insteadOf=https://your.gitlab.com/
另外執(zhí)行下面的命令也能達(dá)到同樣的效果:
gitconfig--globalurl."git@your.gitlab.com/".insteadof"https://your.gitlab.com/"
操作完之后,我們就可以使用go get了,使用go get -v可以展示執(zhí)行日志。
GONOPROXY
眾所周知,國(guó)內(nèi)用戶大多設(shè)置代理,我們?cè)?Go 1.12 之前如果使用GOPROXY這個(gè)環(huán)境變量設(shè)置代理,并使用私有倉(cāng)庫(kù),很有可能會(huì)遇到下面的錯(cuò)誤:
gogetyour.gitlab.com/pkg/example:moduleyour.gitlab.com/pkg/example:
readinghttps://goproxy.cn/your.gitlab.com/pkg/example/@v/list:404NotFound
這是因?yàn)榇矸?wù)不可能訪問(wèn)到我們的私有代碼倉(cāng)庫(kù),所以報(bào)錯(cuò) 404。而且,就算使用上文提到的ssh鑒權(quán)也不行。
Go 1.13 后可以設(shè)置GONOPROXY這個(gè)環(huán)境變量來(lái)指定不使用代理的域名,支持逗號(hào)分隔多個(gè)值。
GONOSUMDB
go mod 需要對(duì)下載后的依賴包進(jìn)行 checksum 校驗(yàn),當(dāng)你的 git 倉(cāng)庫(kù)是開(kāi)放的話沒(méi)問(wèn)題,但是如果是不可訪問(wèn)的私有倉(cāng)庫(kù),甚至在公司內(nèi)網(wǎng)。很可能出現(xiàn)校驗(yàn)失敗的錯(cuò)誤:
get"your.gitlab.com/pkg/example":foundmetatagget.metaImport{Prefix:"your.gitlab.com/pkg/example",VCS:"git",RepoRoot:"https://your.gitlab.com/pkg/example.git"}at//your.gitlab.com/pkg/example?go-get=1
verifyingyour.gitlab.com/pkg/example@v0.0.0:your.gitlab.com/pkg/example@v0.0.0:readinghttps://sum.golang.org/lookup/your.gitlab.com/pkg/example@v0.0.0:410Gone
和代理一樣,我們的私有倉(cāng)庫(kù)對(duì) sum.golang.org 是不可見(jiàn)的,所以肯定沒(méi)辦法執(zhí)行安全校驗(yàn)。
同樣的在 Go 1.13 后可以設(shè)置GONOSUMDB環(huán)境變量指定跳過(guò)校驗(yàn)的的域名,支持逗號(hào)分割多個(gè)值。
GOPRIVATE
最后 Go 1.13 還引入的GOPRIVATE環(huán)境變量,可以說(shuō)設(shè)置后一勞永逸,能自動(dòng)跳過(guò) proxy server 和 校驗(yàn)檢查, 這個(gè)變量值也支持逗號(hào)分割,可以填寫多個(gè)值,如:
GOPRIVATE=*.corp.example.com,your.gitlab.com
當(dāng)然,設(shè)置GOPRIVATE之后,還可以在通過(guò)GONOPROXY和GONOSUMDB來(lái)單獨(dú)進(jìn)行控制,
不過(guò)需要注意下GOPRIVATE失效的問(wèn)題,
舉個(gè)例子,如果公司內(nèi)部有私有倉(cāng)庫(kù):your.corp.com,如果這樣設(shè)置:
GOPRIVATE=your.corp.com
GOPROXY=https://goproxy.cn
GONOPROXY=none
因?yàn)?code style="margin-right:2px;margin-left:2px;padding:2px 4px;font-size:14px;font-family:'Operator Mono', Consolas, Monaco, Menlo, monospace;color:rgb(233,105,0);background:rgb(248,248,248);">GONOPROXY的值是none,那么用戶還是會(huì)從GOPROXY的地址下載所有私有和共有的倉(cāng)庫(kù), 此時(shí)可能還是會(huì)報(bào)錯(cuò),GONOSUMDB同理,大家注意一下這個(gè)問(wèn)題。
原文標(biāo)題:Go module 使用 Gitlab 私有倉(cāng)庫(kù)
文章出處:【微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
功能
+關(guān)注
關(guān)注
3文章
590瀏覽量
30285 -
管理
+關(guān)注
關(guān)注
2文章
389瀏覽量
27079 -
工具
+關(guān)注
關(guān)注
4文章
317瀏覽量
28874
原文標(biāo)題:Go module 使用 Gitlab 私有倉(cāng)庫(kù)
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
《開(kāi)關(guān)電源設(shè)計(jì)與調(diào)試》課程建設(shè)實(shí)踐與探索
【新功能】企業(yè)級(jí)Maven私有倉(cāng)庫(kù)服務(wù)結(jié)束公測(cè),全面開(kāi)放使用
華為云ServiceStage完美支持多個(gè)主流源碼托管倉(cāng)庫(kù)
Gitlab安裝及集成LDAP
基于Linux系統(tǒng)的私有鏡像倉(cāng)庫(kù)搭建
關(guān)于小流域防災(zāi)預(yù)警體系建設(shè)的實(shí)踐與思考
GitHub宣布無(wú)限制的免費(fèi)為普通用戶提供私有倉(cāng)庫(kù)服務(wù)
公共云與私有云的區(qū)別及應(yīng)用
私有鏡像倉(cāng)庫(kù)Harbor極簡(jiǎn)搭建指南(HTTP版)
極狐GitLab—新一代源代碼管理倉(cāng)庫(kù)
在KubeSphere 容器中快速部署使用 GitLab 并構(gòu)建 DevOps 項(xiàng)目
使用Nexus在本地搭建npm、yum和maven私有倉(cāng)庫(kù)
云服務(wù)器Flexus X實(shí)例,Docker集成搭建Gitea私有倉(cāng)庫(kù)
華為云 Flexus X 實(shí)例:極速搭建個(gè)人代碼倉(cāng)庫(kù) GitLab 平臺(tái)
Flexusx 實(shí)例與 Harbor 私有鏡像倉(cāng)庫(kù)的完美結(jié)合
關(guān)于Gitlab私有倉(cāng)庫(kù)建設(shè)的實(shí)踐
評(píng)論