原文地址:Go 1.13 私有代理服務的構建.git
在 Go 1.13 版本的發佈前,設置 GOPROXY
只能指定一個代理服務地址。進入 Go 1.13 版本後,GOPROXY
支持多代理設置,經過,
隔開便可。以下:github
export GOPROXY=https://proxy.golang.org,direct
複製代碼
按官方文檔的說明,當第一個proxy
在處理ge get
所發出的HTTP請求時,返回HTTP狀態碼爲404
或410
時,就會查找下一個proxy
。golang
這個提高確確實實是從Go Module
功能開放以來最想要的補充。有了這個多代理proxy
的設置, 就能夠在平常構建企業級項目中,將私有包代理與共有包代理分開,這樣就再也不須要維護一個巨型的Go Module
倉庫,只須要要維護一個有限大小的私有包倉庫便可。私有包倉庫主要存放企業內部包,同時可加上牆外的共用包。apache
下面簡單說明一下如何構建企業級私有代理服務。緩存
首先在企業GitLab
上建立代碼倉庫項目:private-modules
.安全
在開啓Go Module
功能以後,每次構建程序的過程當中,Go 都會在$GOPATH/pkg/mod/cache/download/
緩存全部下載到本地的Go Module
包。bash
將企業私有包以及牆外的共用包,對應的目錄提交到代碼倉庫項目:private-modules
中便可。服務器
$: tree -L 1 $GOPATH/pkg/mod/cache/download/
$GOPATH/pkg/mod/cache/download/
├── **cloud.google.com** //牆外包
├── **your.company.com** //私有包
├── git.apache.org
├── github.com
├── go.etcd.io
├── go.opencensus.io
├── go.uber.org
├── golang.org
├── gonum.org
├── google.golang.org
├── gopkg.in
├── gotest.tools
├── honnef.co
├── k8s.io
├── layeh.com
└── rsc.io
複製代碼
如圖示中,就能夠將牆外的包與企業內部包對應目錄添加到private-modules
項目中進行管理。app
編寫私有代理服務程序。私有代理服務程序很是簡單,就是一個簡單的基於文件系統的HTTP服務便可,同時添加User/Password
進行安全認證。更加安全的控制能夠經過對非內網的IP進行限制訪問。工具
代理服務器的實現很是簡單,以下:
func ProxyHandler(wr http.ResponseWriter, req *http.Request) {
//認證
user, password, ok := req.BasicAuth()
if !ok {
http.Error(wr, "basic auth required", http.StatusForbidden)
return
}
if user != "[YOUR-USER]" || password != "[YOUR-PASSWORD]" {
http.Error(wr, "basic auth failed", http.StatusForbidden)
return
}
//牆外包
if strings.HasPrefix(req.URL.RequestURI(), "cloud.google.com") {
http.FileServer("[PrivateModulePath]").ServeHTTP(wr, req)
return
}
//私有包
if strings.HasPrefix(req.URL.RequestURI(), "your.company.com") {
http.FileServer("[PrivateModulePath]").ServeHTTP(wr, req)
return
}
//404
http.NotFound(wr, req)
}
複製代碼
私有代理程序結合企業CI
工具,保證[PrivateModulePath]
目錄下的包實時更新便可。
構建好以上的企業私有代理服務以後,就能夠在CI
階段進行多階段構建 Go 程序了。簡單展現一下樣例Dockerfile
,方便讀者自行測試。
FROM golang:1.13-alpine3.10 AS builder
RUN apk --update --no-cache add git mercurial subversion bzr ca-certificates
ENV GOPROXY=https://[YOUR-USER]:[YOUR-PASSWORD]@proxy.yourcompany.com,direct
WORKDIR /app
COPY . .
RUN go build -o main
FROM alpine:3.10
WORKDIR /app
COPY --from=builder /app/main /usr/local/bin
ENTRYPOINT [ "main" ]
複製代碼
企業私有代理服務主要的使用場景是在企業內網中使用,對於須要在家辦公的員工能夠經過文件代理的方式進行構建。