Go

Gopkg.lockのフォーマットが変わってた

何の話?

Golangのパッケージ管理ツールのdepが生成するlockファイルの中身が変わってて戸惑った話

何に困ったのか

CircleCIを使って、Google AppEngine Standard Environment へのGolangアプリケーションのデプロイを行なっていた。
CircleCIの2.0にはキャッシュ機構があり、依存パッケージのインストール結果をキャッシュしておいてビルド時間を短縮することができる。
その機能を利用する際にGopkg.lockからchecksumを行なってハッシュ値を生成し、キャッシュのキーとすることで、Gopkg.lockに変更があったかどうかを確認して、変更がなければキャッシュを用いる仕組みにしている(公式推奨)。
しかし、ローカルのMacOS上でdep ensureしてできたGopkg.lockをCircleCI上でdep ensureするとフォーマットが変わってしまい、checksumが常にずれてしまう状態になっていた。

どうしたのか

ローカルのdep

インストールはHomebrew利用

$ dep version
dep:
 version     : v0.4.1
 build date  : 2018-01-27
 git hash    : 37d9ea0
 go version  : go1.9.3
 go compiler : gc
 platform    : darwin/amd64

CircleCIにインストールしたdep

インストール処理

go get -u github.com/golang/dep/cmd/dep
#!/bin/bash -eo pipefail
dep version
dep:
 version     : devel
 build date  : 
 git hash    : 
 go version  : go1.9.2
 go compiler : gc
 platform    : linux/amd64
 features    : ImportDuringSolve=false

こういう状態になっていた。

dep ensure した結果の差異は以下のような形。

ローカルのGopkg.lockの抜粋
[[projects]]
  branch = "master"
  name = "github.com/mjibson/goon"
  packages = ["."]
  revision = "0c01b4bc4f4970fa6f91409bf7f134a10809219c"
CircleCIのGopkg.lockの抜粋
[[projects]]
  branch = "master"
  digest = "1:51cf0d7dfb0def086ee1d36d3bc3ee5cad0a4130be9c144d85f7d1cfd7340ec3"
  name = "github.com/mjibson/goon"
  packages = ["."]
  pruneopts = ""
  revision = "0c01b4bc4f4970fa6f91409bf7f134a10809219c"

どうやらこのプルリクで変更されたみたい。
Homebrew経由でupgradeしても寄らなかったので、CircleCI側のインストール方法を変えて対応した。

mkdir /go/bin
curl -L -s https://github.com/golang/dep/releases/download/v${DEP_VERSION}/dep-linux-amd64 -o /go/bin/dep
chmod +x /go/bin/dep
/go/bin/dep ensure -v

DEP_VERSIONは環境変数でバージョンを指定できるようにしている。
これでHomebrewで入っているのと同じv0.4.1を入れて、checksumが合うようになった。