社内向けにathensを構築する
athens
go1.13でGOPROXY
環境変数のデフォルトがproxy.golang.org
を向くようになりました。そのため会社などでプライベートなリポジトリを使っている場合、最初の一発目をproxy.golang.org
に取りにいってしまいます。単純に無駄なリクエストなのと、社内開発のリポジトリ名が漏洩するという意味でもあまりよろしくありません。
これを防ぐにはGOPRIVATE
環境変数にリポジトリ名を書いておけばいいのですが、それだとModules Mirrorの恩恵に預かれなくなってしまうため、折角なので社内向けにproxyサーバーであるathensを立ててみます。
Helmによる構築
athensはドキュメントがかなり充実しており、基本的には公式の手順に従うだけで構築できます。
kubernetesの環境があればHelm chartによる構築が一番楽そうなので、今回はこちらを使っていきます。
ストレージ
athensはパッケージをキャッシュするためのストレージを以下の中から選ぶことができます。
https://docs.gomods.io/configuration/storage/
- memory
- disk
- mongo
- Google Cloud Storage
- AWS S3
- Minio
各々の環境次第で好きなものを選べばいいと思いますが、今回は試しという意味でも運用が容易なdisk
を使っていきます。
構築
まずはoverride.yaml
という名前で設定ファイルを作成します。設定可能な値はドキュメントをあさるか、chartの元ファイル を見るのがいいと思います。
storage:
type: disk
disk:
persistence:
enabled: true
accessMode: ReadWriteOnce
size: 4Gi
ingress:
enabled: true
hosts:
- go-proxy.sample.com
service:
type: NodePort
replicaCount: 2
configEnvVars:
- name: ATHENS_GONOSUM_PATTERNS
value: private.git.com/*
設定ファイルを作成したら、あとは以下のようにHelmでサクッと構築しましょう。helmの環境構築などは省いています。
helm repo add gomods https://athens.blob.core.windows.net/charts
helm repo update
helm install gomods/athens-proxy -n athens -f override.yaml
go-proxy.sample.com
にアクセスして、"Welcome to The Athens Proxy"
が表示されれば成功です。
使ってみる
試しに手元でGOPROXY=https://go-proxy.sample.com
を設定して、go mod download
やgo get
してみましょう。
export GOPROXY=https://go-proxy.sample.com
go get golang.org/x/tools/cmd/goimports
storage=disk
の場合、athensはデフォルトで/var/lib/athens
以下にパッケージをキャッシュします。試しにコンテナに入り、/var/lib/athens
を覗くと、goimports
がキャッシュされているのが分かると思います。
v0.6.0 時点での問題点
ここまで書いておいてあれですが、実はathens v0.6.0時点では不具合でプライベートリポジトリを落としてくることができません。
athensはパッケージをリクエストされた際、内部的にはただgo mod download
を自分で叩いているため、GONOSUMDB
などを設定しないとプライベートリポジトリのchecksumに失敗してしまいます。
そのためATHENS_GONOSUM_PATTERNS
に自分のプライベートリポジトリを指定する必要がありますが、不具合でこの環境変数の内容がgo mod download
に渡されていないため、現状うまくいかないようです。
ただ修正は既に行われているので、次回のリリースでは直っていそうです。