CodeBuild で Go 1.9 と dep を使ったビルドを行う
Posted on
- #aws
最近 CodeBuild を本格的に使い始めたのですが、Go 1.9 と dep を使ったビルドに苦労したのでポイントをまとめておきます。サンプルとして自分が書いた aws-billing のソースコードをビルドしてみます。
なお、自分が検証した Go のバージョンや環境は次のとおりです。
- Go のバージョン: 1.9.2
- dep のバージョン: devel
- CodeBuild のイメージ: Ubuntu 14.04
CodeBuild で Go 1.9 と dep を使う
CodeBuild の処理は Docker コンテナの中で実行されますが、AWS が提供している Docker イメージは Go 1.7.3 までしか用意されていません(2017 年 10 月時点)。 dep を使うには Go 1.8 以上が必要なので AWS の Docker イメージは使えません。
Go 1.9 でビルドするには、自分で Docker イメージを用意して Amazon ECR に登録するか、Ubuntu のベースイメージに Go をインストールする必要があります。今回は Go のバージョンアップに追従しやすい後者の方法でやってみました。
Go 1.9 と dep を使ったビルドを行うための buildspec.yml
aws-billing のリポジトリにコミットしている buildspec.yml です。
Go と dep を使ったビルドを行うときのポイント
Go のビルドはシンプルですが、CodeBuild 上で実際にやってみるといろいろとハマりました。自分がハマったポイントです。
envシーケンスで定義した値はリテラルの文字列になる- たとえば
GOPATH: $HOME/goと指定しても$HOMEは変数展開されない GOPATHやPATHを設定するときはphasesシーケンスの中でやる
- たとえば
dep ensureするときはGOPATH以下にソースコードを移動する- ソースコードは
CODEBUILD_SRC_DIRというディレクトリに展開されている GOPATH以下に移動しないとdep ensureでエラーになる
- ソースコードは
artifactsシーケンスのベースディレクトリはCODEBUILD_SRC_DIRになるGOPATH以下にビルドファイルがある場合はbase-directoryで明示的に指定しないといけない
あと、ビルドが安定するまでは buildspec.yml をリポジトリに毎回 push するのではなく、"Insert build commands" で YAML を貼り付けたほうがトライアンドエラーしやすいです。
こっちのが伝わりやすいかも。 pic.twitter.com/UAZJBlxNsl
— riywo (@riywo) October 23, 2017
この機能があることを知らずに Twitter につぶやいたら @riywo さんが教えてくれました。ありがとうございました!
まとめ
GOPATH など Go 独特の部分をクリアすれば、Go 1.9 と dep を使ったビルドも問題ありません。
CodeBuild は GitHub の Webhooks にも対応したので、push されるたびにビルドを走らせるのも簡単にできます。低コストでフルマネージド、かつ AWS とインテグレートされているのがいいですね。