何の話?
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
した結果の差異は以下のような形。
[[projects]]
branch = "master"
name = "github.com/mjibson/goon"
packages = ["."]
revision = "0c01b4bc4f4970fa6f91409bf7f134a10809219c"
[[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が合うようになった。