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

JFrog傑蛙科技發表於2020-06-02


引言

從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=

以上設定將所有模組下載請求重定向到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=

$ 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="

$ 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 獲取課程通知


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69954434/viewspace-2695783/,如需轉載,請註明出處,否則將追究法律責任。

相關文章