Google Cloud Container Builderでgo-depを使う

  • 5
    いいね
  • 0
    コメント

tl;dr

  • depはまだ人柱感満載
  • GCCBでdep使うなら-vendor-onlyをつけるべし

Google Cloud Container Builder(GCCB)でdepが転ける

ちょっと大きめの開発ブランチで作業していたんで、2週間ぶりぐらいにGCCBでdeployしたら、depでこける。
エラーメッセージは以下のような感じ。

Step #6 - "dep-ensure": Running: dep ensure
Step #6 - "dep-ensure": Found 5 errors:
Step #6 - "dep-ensure": 
Step #6 - "dep-ensure": import path app/gopath/src/github.com/golang/dep/internal/gps/_testdata/src/relimport/dotslash had a local import: "./simple"
Step #6 - "dep-ensure": import path app/gopath/src/github.com/golang/dep/internal/gps/_testdata/src/relimport/dotdotslash had a local import: "../github.com/golang/dep/internal/gps"
Step #6 - "dep-ensure": import path app/gopath/src/github.com/golang/dep/internal/gps/_testdata/src/relimport/dotdot had a local import: ".."
Step #6 - "dep-ensure": /workspace/gopath/src/github.com/golang/dep/cmd/dep/testdata/harness_tests/ensure/pkg-errors/case2/initial/bar/bar.go:3:51: expected 'package', found 'EOF'
Step #6 - "dep-ensure": /workspace/gopath/src/github.com/golang/dep/internal/gps/_testdata/src/bad/bad.go:6:43: expected 'package', found 'EOF'

なんかdep内の_testdata内でlocal import使ってるからだめよって。。
ってこれ、depのtest用のソースなんですけど…

ちなみにローカルではもちろんエラーになっていない。

depのリリースを確認

GCCBでは毎回Docker内でgo-getしてdepをいれるので最新のdepで実行されてしまう。
つまり、dependencyのバージョン固定のためのツールであるdep自体のバージョンを現状では固定できない。
(Docker作っておけばいいんだけど)

それでdepのリリースをみてみる。
0.3.0というバージョンで大きめのリファクタがされたらしい。
たしかにこのリリースの後にデプロイしたことない。

-vendor-onlyオプション

0.3.0からensureにいくつかオプションが追加されたのですが、-vendor-onlyオプションが追加されました。
helpみると

-vendor-only populate vendor/ from Gopkg.lock without updating it first (default: false)

とあります。
導入の経緯はIssueにありますが、*.goを解析することなく、Gopkg.lockからvendorにDLしてくれるだけのようです。
前述のエラーは*.goの解析時にエラーとなっていたので、このオプションを指定することで無事回避1できました。

まとめ

  • depはまだ人柱感があって地雷を踏みぬく覚悟が必要そうです
    • depがv1.0になって、GCCB Official Repositoryでサポートしてくれないかなー
    • それまではDockerHubあたりにバージョン固定でimageを作っておくのが無難かも

  1. オプションの本来の目的と違いますが…