Go 1.13 私有代理服务的构建

原文地址: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状态码为404410时,就会查找下一个proxygolang

这个提高确确实实是从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" ] 
复制代码

企业私有代理服务主要的使用场景是在企业内网中使用,对于须要在家办公的员工能够经过文件代理的方式进行构建。

相关文章
相关标签/搜索