はじめに
Wercker で依存モジュールを管理を使った Golang の CI を実施しようとしてハマった。
次回は時間を取られないように記録。
※こういった類のものは Scrapbox.io に書いた方がいいのかと思いつつ、一旦こちらへ。
tl;dr
Wercker の golang box の WERCKER_SOURCE_DIR
がディフォルトでは GOPATH
の配下になっていないので wercker/setup-go-workspace などを利用して GOPATH
配下にする。
local の Wercker CLI での wercker build
が通るのに Wercker の Web 側で同じ原因で失敗するのでこの方法は間違いかもしれません。現在調査中。
追記(2018/01/04):
一旦 glide
でやることにしました。 Wercker で glide を使った Golang のビルド
環境
- Wercker
- box: golang:latest (※2017.01.01の実行時で Go 1.9)
困ったこと
Wercker の Golang の box の構成として
-
GOPATH
:/go
-
WERCKER_SOURCE_DIR
:/pipeline/source
となっている。そのため、Wercker が処理対象にするソースは /pipeline/source
となる。しかし、このパスは $GOPATH/src
配下ではない。
諸々調べたところ Go のモジュール依存関係管理は dep
を使うのが推奨されているようだった。
そこで dep
で依存モジュールをインストールすると、モジュールは /pipeline/source/vendor/*
に配置されてくれればよいのだが、実際には
/pipeline/source is not within a known GOPATH/src
とエラーメッセージが出る。このエラーメッセージ、本家にIssueが上がっていて
dep init fails if in not in $GOPATH[…]/src/{somedir..} #148
ステータスが Open なので $GOPATH/src
= /go/src
配下にインストールする必要があった。
解決方法
一番簡単なワークアラウンドとしては dep status
をパーズして go get
してプロジェクト配下の vendor
ディレクトリではなく、グローバルの GOPATH
側にインストール方法がある。
しかし、せっかく dep
を使っているのに「それどうなのよ」感があるので調べて wercker/setup-go-workspace にたどり着いた。
build:
steps:
- wercker/setup-go-workspace:
package-dir: <SOME_PATH>
を設定すると /go/src/<SOME_PATH>/vendor/*
にインストールされるようになり、これは $GOPATH/src
以下になるので dep
でのインストールが可能になる。
参考
-
Getting started with Wercker and Go
- wercker/getting-started-golang:標準ライブラリしか使用していないので、参考にならず...
-
wercker/step-setup-go-workspace
- Werckerを使ってフェーズ間のパッケージの受け渡し周りでハマった:トピックは違うけれど、モジュールの使い方はここで知った