Go 1.13 私有代理服務的構建

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

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

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

按官方文檔的說明,當第一個proxy在處理ge get所發出的HTTP請求時,返回HTTP狀態碼爲404410時,就會查找下一個proxygithub

這個提高確確實實是從Go Module功能開放以來我的最想要的補充。有了這個多代理proxy的設置, 就能夠在平常構建企業級項目中,將私有包代理與共有包代理分開,這樣就再也不須要維護一個巨型的Go Module倉庫,只須要要維護一個有限大小的私有包倉庫便可。私有包倉庫主要存放企業內部包,同時可加上牆外的共用包golang

下面簡單說明一下如何構建企業級私有代理服務。apache

私有包倉庫

首先在企業GitLab上建立代碼倉庫項目:private-modules.緩存

在開啓Go Module功能以後,每次構建程序的過程當中,Go 都會在$GOPATH/pkg/mod/cache/download/緩存全部下載到本地的Go Module包。安全

企業私有包以及牆外的共用包,對應的目錄提交到代碼倉庫項目:private-modules中便可。bash

$: 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進行限制訪問。app

代理服務器的實現很是簡單,以下:工具

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" ]

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

相關文章
相關標籤/搜索