原文地址:Go 1.13 私有代理服務的構建.
在 Go 1.13 版本的發佈前,設置 GOPROXY
只能指定一個代理服務地址。進入 Go 1.13 版本後,GOPROXY
支持多代理設置,通過,
隔開即可。如下:
export GOPROXY=https://proxy.golang.org,direct
按官方文檔的說明,當第一個proxy
在處理ge get
所發出的HTTP請求時,返回HTTP狀態碼爲404
或410
時,就會查找下一個proxy
。
這個提升確確實實是從Go Module
功能開放以來個人最想要的補充。有了這個多代理proxy
的設置, 就可以在日常構建企業級項目中,將私有包代理與共有包代理分開,這樣就不再需要維護一個巨型的Go Module
倉庫,只需要要維護一個有限大小的私有包倉庫即可。私有包倉庫主要存放企業內部包,同時可加上牆外的共用包。
下面簡單說明一下如何構建企業級私有代理服務。
私有包倉庫
首先在企業GitLab
上創建代碼倉庫項目:private-modules
.
在開啓Go Module
功能之後,每次構建程序的過程中,Go 都會在$GOPATH/pkg/mod/cache/download/
緩存所有下載到本地的Go Module
包。
將企業私有包以及牆外的共用包,對應的目錄提交到代碼倉庫項目: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
項目中進行管理。
私有代理服務
編寫私有代理服務程序。私有代理服務程序非常簡單,就是一個簡單的基於文件系統的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" ]
企業私有代理服務主要的使用場景是在企業內網中使用,對於需要在家辦公的員工可以通過文件代理的方式進行構建。