Go 1.13 私有代理服務的構建

原文地址:Go 1.13 私有代理服務的構建.

在 Go 1.13 版本的發佈前,設置 GOPROXY 只能指定一個代理服務地址。進入 Go 1.13 版本後,GOPROXY 支持多代理設置,通過,隔開即可。如下:

export GOPROXY=https://proxy.golang.org,direct

按官方文檔的說明,當第一個proxy在處理ge get所發出的HTTP請求時,返回HTTP狀態碼爲404410時,就會查找下一個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" ] 

企業私有代理服務主要的使用場景是在企業內網中使用,對於需要在家辦公的員工可以通過文件代理的方式進行構建。

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