gcpug / nouhau

Google Cloud Platformのノウハウを共有するRepository
https://gcpug.jp
MIT License
653 stars 23 forks source link

go modulesを利用するとデプロイが遅くなる問題の解決策 #87

Open sonatard opened 5 years ago

sonatard commented 5 years ago

Go 1.11から export GO111MODULE=on と環境変数を設定することでgo modulesを利用することができる。 Google App Engine 2nd genと Cloud Functionsはgo modulesに対応している。

しかしデプロイが遅くなるので、従来通りvendorディレクトリを用意してデプロイすることで高速になる。 私の環境のGoogle App Engineでは 4:20が2:20くらいになったので約2分速くなる。

また日常の開発ではgo modulesを使いたいという場合にはデプロイ時だけvendorを用意してgo modulesをオフにするとよい。

go mod vendor
export GO111MODULE=off
gcloud app deploy xxxxx
export GO111MODULE=on
rm vendor -rf

以下のようにすることでgcloudコマンド実行時だけoffにすることもできる

go mod vendor
GO111MODULE=off gcloud app deploy xxxxx
rm vendor -rf

Cloud Functionsは試していないが、おそらく同じはず。

go.modgo.sum.gcloudignore に追加することでvendorを利用できるとドキュメントにあるが、実際には GO111MODULE=off が必要である。

https://cloud.google.com/functions/docs/concepts/go-runtime#vendor_directory

Go 1.13以降go modules onがデフォルトになってしまうとこの回避方法が使えなくなる可能性はある。

またgo modulesを使うと遅くなる原因は恐らくGCP側でgo getが走ってビルドするためなので、将来的にソースコードと同様に依存ファイルもキャッシュされるようになればgo modulesでも高速になるかもしれない。

sinmetal commented 5 years ago

@sonatard 以下の順番が逆さま?

export GO111MODULE=off
go mod vendor
apstndb commented 5 years ago

Cloud Functions Go runtime の dependency 周りはドキュメントが分かれたっぽい https://cloud.google.com/functions/docs/writing/specifying-dependencies-go?hl=en

sonatard commented 4 years ago

Go 1.13からGO_PROXYの効果で高速になりました

Go 1.11 (vendor) 55秒 Go 1.12 (go mod) 157秒 Go 1.13 (go mod) 68秒

sinmetal commented 4 years ago

早くするという文脈ではないが、 .gcloudignore に go.mod, go.sum を入れるみたいな話もあった

apstndb commented 4 years ago

ちなみに GO_PROXY で高速化はされたが、プライベート repo にあるモジュールに依存している場合は vendoring が必要になる場合もある。おそらく Go 1.14 以降は vendor と go.mod が両立するので GO111MODULE=off は必要なさそう https://golang.org/doc/go1.14#tools