爲什麼GOPROXY對Golang開發如此重要

引言

從Go 1.13開始,Go Module作爲Golang中的標準包管理器,在安裝時自動啓用,並附帶一個默認的GOPROXY。

但是對於其他的GOPROXY選項,比如JFrog

GoCenter,以及你自己的Go Module包,你需要在公衆視野中保持安全,你應該選擇什麼樣的配置? 你怎樣才能不讓你的公共和私人資源成爲一個糾纏的結?

先讓我們來看看GOPROXY是幹什麼的,以及如何爲一個快速、可靠和安全的系統設置一個GOPROXY。

什麼是GOPROXY?

GOPROXY控制Go Module下載的來源,有助於確保構建的確定性和安全性。(傳送門:大家可以在JFrog公衆號裏搜索 Go Module, 前文介紹裏Go Module 帶來的收益以及如快速轉型Go Module)

GOPROXY時代之前,在Golang開發時,模塊依賴關係直接從VCS系統中的源存儲庫下載,如GitHub、Bitbucket、Bazaar、Mercurial或SVN。來自第三方的依賴項通常從公共源repos下載。私有依賴項必須在存儲它們以下載模塊源文件的VCS系統中進行身份驗證。

雖然上面的工作流得到了廣泛的應用,但是它缺乏確定性和安全性構建,以及開發過程的兩個基本需求:不變性和可用性。模塊可以被作者刪除,也可以編輯修改當前被髮布的版本。雖然這些場景被認爲是不好的實踐,但它們確實經常發生,如下圖:

爲什麼GOPROXY對Golang開發如此重要

使用GOPROXY

爲您的Golang開發或CI環境設置GOPROXY,將Go Module下載請求重定向到GOPROXY 指向的緩存庫。

使用GOPROXY進行模塊依賴關係的管理的有助於開發構建不變性需求。通過從GOPROXY的緩存中返回模塊包,它能夠爲用戶請求的某模塊版本提供相同的返回(Go module模塊代碼),即使模塊最近在VCS repo中被不正確地修改過,從而保證多次構建結果一致。

另外GOPROXY的緩存還有助於確保模塊始終可用,即使VCS repo中的原始模塊已被銷燬。

使用GOPROXY有不同的方法,這取決於你想使用的go模塊依賴的來源,通常有公共的GOPROXY,私有Go Module,以及私有的GOPROXY

公共GOPROXY

公共GOPROXY是一個集中式的存儲庫,全球各地的Golang開發者都可以使用它。它緩存了大量開源的Go模塊,這些模塊可以從第三方公開訪問的VCS項目存儲庫中獲得。大多數此類GOPROXY,比如JFrog GoCenter,Goproxy.cn都是免費提供給Golang開發者社區的。此類GOPROXY 的架構拓撲如下圖,提供了Go Module 的一致性以及可用性能力:

爲什麼GOPROXY對Golang開發如此重要

要使用公共GOPROXY,將Golang環境變量設置爲其URL:

$ export GOPROXY=https://gocenter.io

以上設置將所有模塊下載請求重定向到GoCenter。從公共GOPROXY下載要比直接從VCS下載快得多。

除了完成下載之外,一個公共的GOPROXY還可以爲GoLang開發者提供關於它所擁有的模塊的更詳細的信息。JFrog GoCenter提供了豐富的UI,支持搜索和訪問模塊的安全信息(如cve)、非安全元數據(如Star數量,下載統計數據以及License信息)和gosumdb支持。這些元數據有助於用戶在選擇開源Go模塊時做出更好的決策。

爲什麼GOPROXY對Golang開發如此重要

私有Go Module

通常,GoLang項目會同時使用開源和私有模塊。一些用戶使用GOPRIVATE環境變量來指定一個必須繞過GOPROXY和GOSUMDB的路徑列表,並直接從VCS repos下載私有模塊。例如,您可能希望使用GoCenter檢索所有開源模塊,但只從公司的服務器請求私有模塊。如下圖:

爲什麼GOPROXY對Golang開發如此重要

要使用GoCenter公共GOPROXY和私有模塊,請設置Golang環境變量:

$ export GOPROXY=https://gocenter.io,direct

$ export GOPRIVATE=*.internal.mycompany.com

這種對GOPRIVATE的使用也確保了你對這些私有模塊的使用不會因爲請求到一個開放網絡上的公共GOPROXY &

checksum數據庫服務器而“泄露”。另一種替代方法是使用GONOSUMDB變量,該變量包含對私有go模塊的引用。雖然這種配置使Go客戶端能夠同時解析公共模塊和私有模塊依賴,但它並不強制私有模塊的不可變性或可用性要求。

私有GOPROXY

私有GOPROXY是一種在您自己的基礎設施上存儲公共和私有Go模塊的工具。

公共模塊通過在二進制存儲庫管理器(如JFrog Artifactory)中代理一個公共GOPROXY緩存到企業內部網絡。

私有模塊也可以從VCS repos緩存到改存儲庫中。通過這種方式,可以保證公共和私有Go模塊的不變性和可用性。

在Artifactory中,您可以通過設置GoCenter的遠程存儲庫(remote reposiroty),以及指向私有GitHub 倉庫(用於私有模塊)的遠程Go模塊存儲庫,以及本地Go模塊存儲庫,將上述三個倉庫組合到一個虛擬存儲庫中,作爲用戶統一單元進行訪問,如下圖:

爲什麼GOPROXY對Golang開發如此重要

在Artifactory中設置名爲“go”的虛擬存儲庫的GOPROXY:

$ export GOPROXY="https://:@my.artifactory.server/artifactory/api/go/go

$ export GONOSUMDB="github.com/mycompany/,github.com/mypersonal/"

因爲您的私有VCS repos中的模塊在sum.golang.org的公共校驗和數據庫中沒有條目,所以它們必須被排除在go客戶端的檢查之外。將GONOSUMDB設置爲您的私有VCS repos可以實現這一點,並將防止這些私有模塊的go get命令由於校驗和不匹配而失敗。

在這個配置中,您可以確保對私有模塊的引用不會“泄漏”,同時還確保了公共模塊和私有模塊的不可變性和可用性。

總結:打破斷結

正如您所看到的,使用私有GOPROXY提供了最確定、最可靠和最安全的功能。

您還可以通過您的私有GOPROXY到您的構建工具的網絡接近度來加速模塊依賴關係的解析。JFrog Artifactory可以安裝在您最需要它的地方:本地數據中心部署或雲中,或公共雲提供商的SaaS版本。

這些好處不僅僅侷限於Golang開發。大多數技術公司使用不止一種語言和多個包管理器。例如,如果代碼是用Golang編寫的,那麼npm可能用於UI,

Docker可能用於分發交付,Helm可能用於在k8上部署應用程序。

通過支持超過27種包類型,Artifactory可以爲所有應用程序提供確定性、穩定和安全的軟件開發過程。

**更多精彩內容可以專注我們的在線課堂

微信搜索公衆號:jfrogchina 獲取課程通知**

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章