架設 Go Proxy 服務加速 go module 下載速度

golang logo

Go 語言在 1.11 推出 go module 來統一市面上不同管理 Go 套件的工具,像是 dep 或 govendor 等,還不知道如何使用 go module,可以參考之前寫的一篇文章『Go Module 導入到專案內且搭配 Travis CI 或 Drone 工具』,在團隊內如果每個人在開發專案時,都透過網路去下載專案使用到的套件,這樣 10 個人就會浪費 10 個人的下載時間,並且佔用公司網路頻寬,所以我建議在公司內部架設一台 Go Proxy 服務,減少團隊在初始化專案所需要的時間,也可以減少在跑 CI/CD 流程時,所需要花費的時間,測試過公司 CI/CD 流程,有架設 Go Proxy,一般來說可以省下 1 ~ 2 分鐘時間,根據專案使用到的相依性套件用量來決定花費時間。本篇來介紹如何架設 ATHENS 這套開源 Go Proxy 專案。

教學影片

架設 ATHENS 服務

你也可以使用外面公開的 GO Proxy 服務,非 China 地區請使用 goproxy.io,如果在中國內地,請使用 gorpoxy.cn,會降低不少 CI/CD 時間。架設 ATHENS 並不難,只需要透過 Docker 一個指令就可以完成,更詳細的步驟可以參考官方文件

export ATHENS_STORAGE=~/athens-storage
mkdir -p $ATHENS_STORAGE
docker run -d -v $ATHENS_STORAGE:/var/lib/athens \
   -e ATHENS_DISK_STORAGE_ROOT=/var/lib/athens \
   -e ATHENS_STORAGE_TYPE=disk \
   --name athens-proxy \
   --restart always \
   -p 3000:3000 \
   gomods/athens:latest

其中 ATHENS_STORAGE 請定義一個實體空間路徑,存放從網路抓下來的第三方套件,當然 ATHENS 還有支援不同的 storage type,像是 Memory, AWS S3 或公司內部有架設 Minio,都是可以設定的。

如何使用 Go Proxy

使用方式非常簡單,只要在您的開發環境加上一些環境變數

$ export GO111MODULE=on
$ export GOPROXY=http://127.0.0.1:3000

接著專案使用的任何 Go 指令,只要需要 Donwload 第三方套件,都會先詢問公司內部的 Proxy 服務,如果沒有就會透過 Proxy 抓一份下來 Cache,下次有團隊同仁需要用到,就不需要上 Internet 抓取了。

至於 CI/CD 流程該如何設定呢?非常簡單,底下是 drone 的設定方式:

- name: embedmd
  pull: always
  image: golang:1.12
  commands:
  - make embedmd
  environment:
    GO111MODULE: on
    GOPROXY: http://127.0.0.1:3000
  volumes:
  - name: gopath
    path: /go

心得

團隊如果尚未導入 GO Proxy 的朋友們,請務必導入,不然就要自己 cache mod 目錄,但是我覺得不是很方便就是了,架設一台 Proxy,不用一分鐘,但是可以省下團隊開發及部署很多時間,這項投資很值得的。