AWS CodeBuildに入門失敗した話
こんにちは。エンジニアの島袋です。
今回のエントリ内容については表題の通りです。
typoで日曜の夜をふいにしました。
要約すると以下です。
- CodeBuildはbuildspec.ymlのphase名をtypoしてもエラーにはならない
- phase名をtypoすると、phasesが全て無視される?
AWS CodeBuildとは
re:invent 2016で発表されたAWSの新しいサービスの1つで、コンテナベースのフルマネージドなCI環境を提供する的なやつです。
(CodeBuild単体だとビルドに特化してるから、CIとは言わないかな?)
ユーザが自分で管理するjenkinsなどと比較して、勝手にスケールしてくれるので、ビルドキューが詰まって長時間ビルド完了待ちをすることがないというのがウリのようですね。
(あと根本的にサーバー管理の必要がない)
詳細については
あたりを参考にしてください。
早速使ってみようとしたところ。。。
CodeBuildではビルド手順をyaml形式でbuildspec.ymlというファイル名で保存し、ビルド対象のプロジェクトのルートディレクトリ直下に配置する必要があります。
今回は筆者が作ったslackにコメント投稿するためのgo言語製のCLIコマンドをビルドしました。
buildspec.ymlは以下のようになります。
version: 0.1 environment_variables: plaintext: GOPATH: "/go" phases: install: commands: - mkdir -p $GOPATH/{bin,src} - curl https://glide.sh/get | sh pre-build: commands: - echo prebuildstart - PATH=$PATH:$GOPATH/bin - echo prebuildend build: commands: - echo buildstrat - glide install - go build post_build: commands: - echo Build completed on `date` artifacts: type: zip files: - oshirase
一応buildspec.ymlの記法について説明すると、以下のようになります。
- environment_variables : 環境変数の設定
- phases : 実際のビルド手順
- install : ビルドに必要なコマンドなどのインストール
- pre_build : ビルド前の作業
- build : ビルド作業
- post_build : ビルド後の作業
- artifacts : zipにパッケージングするビルド成果物の指定
はい。pre_buildとするところをpre-buildとしてしまったんですね。
これに気づくのに二時間近く費やしました。
なぜそれほど時間がかかったかというと、phasesの中に誤ったphase名を記述しても、エラーにならず、ビルド完了となってしまったためです。
ビルドは完了しているにも関わらず、artifactsに指定したビルド成果物が見つからないとうログが出力されていたためおかしいと思い、artifactsの内容について試行錯誤してたんですね。
(そもそもビルド成果物見つからないのであればエラーにしてほしいところなんですが)
今回の場合、typoしたpre_buildだけじゃなく、phasesを全て素通りしてartifactsの処理だけ走っていたようです。
(それが規定動作なのかは現状不明ですが)
終わりに
typoには気をつけましょう。
あと、codebuildはビルド対象のブランチを指定できないようですね。codebuild単体だとjenkins氏やCircleCI等のCIサービスにすぐにとってかわるということは無さそうです。(他のcode〜シリーズと組み合わせること前提ですかね?)
コメント