AWS CodeBuild をローカル環境で実行する(2019年7月版)

2019年7月14日

AWS CodeBuild

CodeBuild のスクリプトを組み立てるとき、修正のたびに GitHub にプッシュしてブラウザで動作確認をすると待ち時間が長くて辛いので、CircleCI のようにローカル環境でビルドを実行する方法を調べました。手順は、AWS DevOps Blog の Announcing Local Build Support for AWS CodeBuild で紹介されていますが、AWS のアップデートにより現在の手順が若干異なっていたので、2019年7月時点の手順をまとめておきます。

目次

  1. AWS CodeBild の Docker イメージをビルドする
  2. local agent image を DockerHub からプルする
  3. codebuild_build.sh をダウンロードする
  4. buildspec.yml を記載する
  5. ビルドを実行
  6. 環境変数を利用する

AWS CodeBild の Docker イメージをビルドする

aws/aws-codebuild-docker-images: Official AWS CodeBuild repository for managed Docker images にある手順で CodeBuild の Docker イメージをビルドします。

ちなみに私の MacBook Pro(2015年製) では、ビルドに 1 時間くらいかかりました。膨大な量のパッケージもダウンロードされますので、通信環境が安定したところでビルドすると良いです。ビルド後のイメージは 7GB くらいあります。

$ git clone https://github.com/aws/aws-codebuild-docker-images.git
$ cd aws-codebuild-docker-images
$ cd ubuntu/standard/2.0
$ docker build -t aws/codebuild/standard:2.0 .

local agent image を DockerHub からプルする

aws/aws-codebuild-docker-images/local_builds にある手順で local agent image を DockerHub からプルします。

$ docker pull amazon/aws-codebuild-local:latest --disable-content-trust=false

codebuild_build.sh をダウンロードする

aws/aws-codebuild-docker-images/codebuild_build.sh を PATH が通ったディレクトリにダウンロードし、実行権限をつけます。ここでは /usr/local/bin/codebuild_build.sh にダウンロードしています。

$ curl -sSk -o /usr/local/bin/codebuild_build.sh https://raw.githubusercontent.com/aws/aws-codebuild-docker-images/master/local_builds/codebuild_build.sh
$ chmod +x /usr/local/bin/codebuild_build.sh

buildspec.yml を記載する

CodeBuild のビルド仕様に関するリファレンス - AWS CodeBuild を参考に buildspec.yml を記載します。今回の例では docker version コマンドを実行しています。

buildspec.yml

Version: 0.2
phases:
  install:
    runtime-versions:
      docker: 18
  build:
    commands:
      - docker version

ビルドを実行

codebuild_build.sh を実行します。-i (ビルド環境イメージ)オプションと -a (アーティファクト) オプションが必須です。アーティファクトのディレクトリは自動で作成されます。詳しくはヘルプをご確認ください。

$ codebuild_build.sh -i aws/codebuild/standard:2.0 -a artifact_output

実行結果です。docker version コマンドが実行されていることが分かります。

...(略)
agent_1  | [Container] 2019/07/14 03:26:21 Entering phase BUILD
agent_1  | [Container] 2019/07/14 03:26:21 Running command docker version
agent_1  | Client: Docker Engine - Community
agent_1  |  Version:           18.09.6
agent_1  |  API version:       1.39
agent_1  |  Go version:        go1.10.8
agent_1  |  Git commit:        481bc77
agent_1  |  Built:             Sat May  4 02:33:34 2019
agent_1  |  OS/Arch:           linux/amd64
agent_1  |  Experimental:      false
agent_1  |
agent_1  | Server: Docker Engine - Community
agent_1  |  Engine:
agent_1  |   Version:          18.09.2
agent_1  |   API version:      1.39 (minimum version 1.12)
agent_1  |   Go version:       go1.10.6
agent_1  |   Git commit:       6247962
agent_1  |   Built:            Sun Feb 10 04:13:06 2019
agent_1  |   OS/Arch:          linux/amd64
agent_1  |   Experimental:     false
agent_1  |
agent_1  | [Container] 2019/07/14 03:26:22 Phase complete: BUILD State: SUCCEEDED
...(略)

環境変数を利用する

ビルドで環境変数を利用したい場合は、環境変数が書かれたファイルを作成して -e オプションで渡すことができます。

$AWS_ACCOUNT_ID$AWS_DEFAULT_REGION など、AWS 上では自動で値が入っているのに、ローカルだと入っていないものもあるので、必要に応じて自分で渡します。

環境変数を書いたファイルを作り

AWS_ACCOUNT_ID=123456789012
AWS_DEFAULT_REGION=ap-northeast-1

-e オプションでファイルを渡します。

$ codebuild_build.sh -i aws/codebuild/standard:2.0 -a artifact_output -e codebuild_local.env

-技術ブログ
-