使用govanityurls讓私有代碼倉庫中的go包支持go get
《定製Go Package的Go Get導入路徑》一文中我們講到了通過使用govanityurls服務,我們可以定製go package的go get導入路徑。不過,govanityurls的用途還不止這些,它還可以讓你的私有代碼倉庫中的go package支持go get。
很多人會問:為什麼要讓私有倉庫中的go package支持go get呢?直接git clone不就行了么?用過go get的gopher們都清楚:go get可以自動分析go package的依賴,並幫助自動下載相關依賴。雖然go get下載依賴有各種局限,但沒有go get的幫助,手工去下載各種依賴會更加「痛苦」。好了,接下來我們將用一個具體的例子來演示一下go get是如何一步步的支持從私有代碼倉庫下載Go包的。
我所在的開發團隊使用的代碼倉庫就是在阿里雲ECS上自行搭建的,使用的是Atlassian出品的bitbucket。雖然bitbucket在在線服務市場佔有率可能不及github,但在線下自建代碼倉庫方面,bitbucket也是不可小覷的重量級選手。
不過bitbucket如何安裝不是這裡的重點,bitbucket的安裝方法參考其官網manual即可。安裝後的bitbucket 倉庫中的Project foo的repository bar的clone地址樣式如下:
http://bitbucket_ip:bitbucket_port/scm/foo/bar.git
注意:我們的bitbucket倉庫沒有啟用https,auth的方式採用的是普通的user和password方式(bitbucket支持客戶端SSH key方式訪問repository)。除此之外,我們並沒有為bitbucket倉庫綁定域名。
一、嘗試go get「裸庫」
我們以foo這個在demo project下的go repository為例,這個repository的clone地址為:http://10.11.12.13:31990/scm/demo/foo.git,於是我們先來嘗試一下直接go get這個未經任何「修飾」的「裸庫」(由於沒有使用https,因此我們在go get的命令行參數中增加了-insecure選項):
# go get -insecure -v 10.11.12.13:31990/scm/demo/foo.git # cd .; git ls-remote git://10.11.12.13:31990/scm/demo/foo fatal: protocol error: bad line length character: HTTP # cd .; git ls-remote https://10.11.12.13:31990/scm/demo/foo fatal: unable to access https://10.11.12.13:31990/scm/demo/foo/ : gnutls_handshake() failed: An unexpected TLS packet was received. # cd .; git ls-remote http://10.11.12.13:31990/scm/demo/foo fatal: could not read Username for http://10.11.12.13:31990 : terminal prompts disabled # cd .; git ls-remote git+ssh://10.11.12.13:31990/scm/demo/foo ssh_exchange_identification: Connection closed by remote host fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. # cd .; git ls-remote ssh://10.11.12.13:31990/scm/demo/foo ssh_exchange_identification: Connection closed by remote host fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 10.11.12.13:31990/scm/demo/foo.git (download) root@10.11.12.13 s password:
以失敗告終!我們來分析一下go get -v輸出的日誌! 通過日誌可以看出go get先後嘗試用不同訪問方式去獲取repository數據,嘗試的順序依次是:git、https、http和git+ssh,結果都無功而返。
對於git方式,我們並未開通bitbucket的git訪問服務,失敗是必然的;
對於https,我們的bitbucket server同樣未予支持;
對於http方式,日誌提示:」 terminal prompts disabled」,即客戶端終端的提示被禁了,也就是無法輸入user和password;
對於最後一種git+ssh,由於沒有ssh登錄bitbucket主機的密碼也失敗了。
在四種訪問方式中,http是我們期望的。為了http方式能成功獲取數據,我們需要開啟termnial prompts(通過GIT_TERMINAL_PROMPT=1),於是我們再次嘗試:
我們看到這次go get在嘗試http訪問repository時,我們有機會輸入user和password了,go get也成功了!至於下面的「unrecognized import path」 error那是由於repository在GOPATH下的位置變更導致的。我們查看一下已經下載到本地的foo repository:
# tree -L 1 10.11.12.13:31990/scm/demo/foo.git/ 10.11.12.13:31990/scm/demo/foo.git/ ├── foo.json ├── foo.yaml ├── conf ├── config ├── controllers ├── Dockerfile ├── errors ├── front-static ├── index ├── main.go ├── Makefile ├── migrations ├── models ├── README ├── routers ├── service ├── static ├── tests ├── topic ├── utils ├── vendor ├── views └── websocket 17 directories, 6 files
雖然go get成功了, 但對於gopher來講,foo下package的導入路徑變成了:
import 10.11.12.13:31990/scm/demo/foo.git/some-package
這種格式、這種長度的導入路徑是無法接受的。那我們該如何解決呢?
一種方法就是在bitbucket server端進行配置,通過為私有鏡像倉庫賦予域名的方式來去除import path中ip、port、不必要的前綴路徑:scm/demo以及不必要的repository名中的後綴」.git」。但這種配置方式可能是非常複雜的,且是與你使用的git server軟體相關的:bitbucket可能有bitbucket的配置方法,換作gitlab,可能就需要另外一種配置方法了。
另外一種方法就是用govanityurls來屏蔽server端複雜的配置,也屏蔽了與git server軟體的相關性。
二、使用govanityurls讓私有代碼倉庫中的go包支持go get
在《定製Go Package的Go Get導入路徑》一文中,我們已經詳細說明了govanityurls的使用和配置方法,這裡就不贅述了,僅給出必要配置。
1、配置和啟動govanityurls/foo: repo: http://10.11.12.13:31990/scm/demo/foo.git
啟動govanityurls:
2、配置nginx並做域名重指向
在我的環境中,我將govanityurls部署到與bitbucket相同的server上了。在這台主機上,我們配置一下nginx,讓govanityurls的服務以80埠呈現:
# cat /etc/nginx/conf.d/default.conf server { listen 80; server_name pkg.tonybai.com; location / { proxy_pass http://10.11.12.13:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
重啟nginx使配置生效:nginx -s reload
go get成功!查看一下本地foo的repository情況:
通過govanityurls,我們可以很容易讓私有代碼倉庫中的go包支持go get;
對於本身就不支持go get的git server,那govanityurls也是無能為力的。
微博:@tonybai_cn
github.com: https://github.com/bigwhite
2017,bigwhite. 版權所有.
※首次創業慘敗!融資不成、孤單一人,21 歲創業者深度反思
※Flexbox 布局的正確使用姿勢
※劃重點!在為可穿戴設備設計時這11點超重要!
※探討通過Feign配合Hystrix進行調用時異常的處理
※功能開發SEO規範筆記
TAG:推酷 |
※ManageEngine Applications Manager 遠程代碼執行漏洞
※Spring Boot使用——Allatori代碼混淆
※iOS 代碼使用 C+的zero-cost abstraction 特性
※SynAck成首個使用Process Doppelg?nging代碼注入技術的勒索軟體
※代碼導師IntelliCode現身!Visual Studio IntelliSense全面進化
※如何使用Reviewboard進行代碼Review?
※一套代碼iOS、Android兩端運行,Google Flutter意味著什麼?
※Mybatis+velocity自動生成代碼
※SyncRequestProcessor 小代碼 大優雅
※如何優化代碼中大量的if/else,switch/case?
※WordPress代碼高亮插件Pure-Highlightjs
※Microsoft Exchange Server遠程代碼執行漏洞-高危
※clrinject:向CLR Runtimes和AppDomain中注入代碼的工具
※Oracle開源GraphPipe:幾行代碼讓你在TensorFlow部署PyTorch模型
※Canonical:可在Ubuntu軟體庫獲取Intel的最新微代碼補丁
※亞馬遜Rekognition被破,「黑客」是Facebook員工,用的還是谷歌的FaceNet開源代碼
※android 訪問webservice(解析一行代碼實現)
※Project Parfait將Photoshop文件轉換為代碼
※Google否認通過YouTube代碼來破壞微軟Edge瀏覽器
※微軟Windows 10移除Andromeda「仙女座」代碼,新增Windows Lite