読者です 読者をやめる 読者になる 読者になる

DevDevデブ!!

プログラミングのこととか書きます。多分。。。

codebuildでハマってた

プログラミング aws

会社のブログに書いたけど、ここにもまとめておく

AWS CodeBuild使ってみようとして、以下の二点でハマった。

  • buildspec.ymlのphase名をtypoってもエラーにならず、phasesが全て素通りした。
  • go言語のプロジェクトをビルドしようとしたら、vendoringが有効になってなくてハマった

phase名をtypoってもエラーにならない件

ビルド完了してるのに、artifactsに指定したファイルが見つからないというログが出てて、なんでだろうと思ってたら、phasesを全て無視して、artifactsの処理だけ走ってたという話。

(そもそもartifactsに指定したビルド成果物が見つからなかったらエラーにしろって思うのですけど)

原因はpre_buildをpre-buildとtypoしてたせいでした。

phase名をミスったらphases全体をスキップしてしまうのは規定動作なのだろうか??

go言語のvendoringが有効になってなくてハマった

上記のtypoを修正して再実行したら、今度はbuildフェイズのgo buildでパッケージが見つからないと言われた。can not found package〜ね。

pre_buildフェイズでglideで依存パッケージは入れてるはずなので、おかしいなーと思いつつ、vendoring機能について確認してたら、そもそもビルド対象のプロジェクトディレクトリがGOPATH配下に無いことに気づいた。

(GOPATH配下じゃないとvendoringが有効にならないことを忘れていた)

codebuildはビルド対象として指定したリポジトリを/tmp/tmpランダム数字/srcって感じでチェックアウトしてくる。

で、ワーキングディレクトリは上記パスのsrc配下になっている。

この状態からvendoringを有効にするために行なったワークアラウンドが以下。

  pre_build:
    commands:
      - glide install
      - mkdir -p $GOPATH/src/github.com/stk132/tsg
      - mv * $GOPATH/src/github.com/stk132/tsg/.
  build:
    commands:
      - cd $GOPATH/src/github.com/stk132/tsg && go build

うん。GOPATH配下に自分でディレクトリ切って、ファイル全部コピーして、当該ディレクトリに移動してgo buildコマンドを叩いている。

cdとgo buildをつなげているのは、別の行にわけて実行すると、cdの次の行ではワーキングディレクトリに戻っているため。

(このあたりはDockerfileをビルドするときと同じ挙動ですかね?)

これはもうちょいスマートな方法ないですかね??

まとめ

しょうもないことでハマったせいでポケモンやる時間吸われてつらい