AWS CodeBuildのbuildspec.ymlをローカルでテストする

目的

AWS CodeBuildのbuildspec.ymlをローカルでテストできるようにします。

手順概要

1. CodeBuildで利用するDockerイメージをビルドする
2. codebuild_build.shを設定する
3. buildspec..ymlを記述
4. ビルドを動かす

手順詳細

1. CodeBuildで利用するDockerイメージをビルドする

AWS CodeBuildで提供されているDockerイメージをビルドするために、aws/aws-codebuild-docker-imagesをcloneします。

$ git clone git@github.com:aws/aws-codebuild-docker-images.git

公式githubリポジトリからのclone

今回は、aws/codebuild/amazonlinux2-x86_64-standard:3.0 を利用したいので、これをビルドします。

$ cd aws-docebuild-docker-images
$ docker build -t aws/codebuild/amazonlinux2-x86_64-standard:3.0 al2/x86_64/standard/3.0

Dockerイメージのビルド

$ docker images
REPOSITORY                                 TAG  IMAGE ID      CREATED             SIZE
aws/codebuild/amazonlinux2-x86_64-standard 3.0  f95defb497c5  21 minutes ago      11.2GB

ビルド結果(イメージサイズが非常に大きい)

おおよそ1時間くらいはビルドにかかるので注意してください。今回ビルドしたDokerfileはこんな感じで記述されています。一通り全部入りな感じのイメージとなっているので、ローカルで使うに当たってはダイエットの余地が多々ありそうです。

2. codebuild_build.shを設定する

取得したgitリポジトリのlocal_buildsディレクトリ配下にcodebuild_build.shがあるので、これに実行権限を付与してPATHの通ったディレクトリに移します。

$ chmod +x local_builds/codebuild_build.sh
$ sudo mv local_builds/codebuild_build.sh /usr/local/bin

code_build.shに実行権限を付与してPATHの通った場所に配置

スクリプトを実行できることを確認します。

$ codebuild_build.sh -h
usage: codebuild_build.sh [-i image_name] [-a artifact_output_directory] [options]
Required:
 -i        Used to specify the customer build container image.
 -a        Used to specify an artifact output directory.
Options:
 -l IMAGE  Used to override the default local agent image.
 -s        Used to specify source information. Defaults to the current working directory for primary source.
              * First (-s) is for primary source
              * Use additional (-s) in <sourceIdentifier>:<sourceLocation> format for secondary source
              * For sourceIdentifier, use a value that is fewer than 128 characters and contains only alphanumeric characters and underscores
 -c        Use the AWS configuration and credentials from your local host. This includes ~/.aws and any AWS_* environment variables.
 -p        Used to specify the AWS CLI Profile.
 -b FILE   Used to specify a buildspec override file. Defaults to buildspec.yml in the source directory.
 -m        Used to mount the source directory to the customer build container directly.
 -d        Used to run the build container in docker privileged mode.
 -e FILE   Used to specify a file containing environment variables.
           (-e) File format expectations:
              * Each line is in VAR=VAL format
              * Lines beginning with # are processed as comments and ignored
              * Blank lines are ignored
              * File can be of type .env or .txt
              * There is no special handling of quotation marks, meaning they will be part of the VA

codebuild_build.shの確認結果(-hでヘルプを表示)

3. buildspec.ymlを記述

サンプルのbuildspec.ymlを適当なディレクトリに記述します。

Version: 0.2
phases:
 build:
   commands:
     - echo 'test!'

buildspec.ymlのサンプル

echo 'test!' が実行されていることが確認できれば動作が確認できます。

4. ビルドを動かす

実際に動かしてみます。1.で作成したdockerイメージ( aws/codebuild/amazonlinux2-x86_64-standard:3.0)を指定します。今回成果物は何もないですが、成果物を指定するオプション(-a)は必須オプションなので、一旦artifactsを指定します

$ codebuild_build.sh  \
    -i aws/codebuild/amazonlinux2-x86_64-standard:3.0 \
    -a artifacts
Build Command:
docker run -it -v /var/run/docker.sock:/var/run/docker.sock -e "IMAGE_NAME=aws/codebuild/amazonlinux2-x86_64-standard:3.0" -e "ARTIFACTS=/home/fujiwara/repositories/codebuild-sample/artifacts" -e "SOURCE=/home/fujiwara/repositories/codebuild-sample" -e "INITIATOR=fujiwara" amazon/aws-codebuild-local:latest
Removing agent-resources_build_1 ... done
Removing agent-resources_agent_1 ... done
Removing network agent-resources_default
Removing volume agent-resources_source_volume
Removing volume agent-resources_user_volume
Creating network "agent-resources_default" with the default driver
Creating volume "agent-resources_source_volume" with local driver
Creating volume "agent-resources_user_volume" with local driver
Creating agent-resources_agent_1 ... done
Creating agent-resources_build_1 ... done
Attaching to agent-resources_agent_1, agent-resources_build_1
agent_1  | [Container] 2020/08/30 03:48:47 Waiting for agent ping
agent_1  | [Container] 2020/08/30 03:48:48 Waiting for DOWNLOAD_SOURCE
agent_1  | [Container] 2020/08/30 03:48:49 Phase is DOWNLOAD_SOURCE
agent_1  | [Container] 2020/08/30 03:48:49 CODEBUILD_SRC_DIR=/codebuild/output/src172437577/src
agent_1  | [Container] 2020/08/30 03:48:49 YAML location is /codebuild/output/srcDownload/src/buildspec.yml
agent_1  | [Container] 2020/08/30 03:48:49 Processing environment variables
agent_1  | [Container] 2020/08/30 03:48:49 Moving to directory /codebuild/output/src172437577/src
agent_1  | [Container] 2020/08/30 03:48:49 Registering with agent
agent_1  | [Container] 2020/08/30 03:48:49 Phases found in YAML: 1
agent_1  | [Container] 2020/08/30 03:48:49  BUILD: 1 commands
agent_1  | [Container] 2020/08/30 03:48:49 Phase complete: DOWNLOAD_SOURCE State: SUCCEEDED
agent_1  | [Container] 2020/08/30 03:48:49 Phase context status code:  Message: 
agent_1  | [Container] 2020/08/30 03:48:49 Entering phase INSTALL
agent_1  | [Container] 2020/08/30 03:48:49 Phase complete: INSTALL State: SUCCEEDED
agent_1  | [Container] 2020/08/30 03:48:49 Phase context status code:  Message: 
agent_1  | [Container] 2020/08/30 03:48:49 Entering phase PRE_BUILD
agent_1  | [Container] 2020/08/30 03:48:49 Phase complete: PRE_BUILD State: SUCCEEDED
agent_1  | [Container] 2020/08/30 03:48:49 Phase context status code:  Message: 
agent_1  | [Container] 2020/08/30 03:48:49 Entering phase BUILD
agent_1  | [Container] 2020/08/30 03:48:49 Running command echo 'test!'
agent_1  | test!
agent_1  | 
agent_1  | [Container] 2020/08/30 03:48:49 Phase complete: BUILD State: SUCCEEDED
agent_1  | [Container] 2020/08/30 03:48:49 Phase context status code:  Message: 
agent_1  | [Container] 2020/08/30 03:48:49 Entering phase POST_BUILD
agent_1  | [Container] 2020/08/30 03:48:49 Phase complete: POST_BUILD State: SUCCEEDED
agent_1  | [Container] 2020/08/30 03:48:49 Phase context status code:  Message: 
agent-resources_agent_1 exited with code 0
Stopping agent-resources_build_1 ... done
Aborting on container exit...

codebuild_build.shを使った実行結果サンプル

動きました。

agent_1  | [Container] 2020/08/30 03:48:49 Entering phase BUILD
agent_1  | [Container] 2020/08/30 03:48:49 Running command echo 'test!'
agent_1  | test!
agent_1  | 

実行結果サンプルからの抜粋(BUILDフェーズ)

実行結果サンプルから上記記述も見えるので、意図したとおりに動作しているようです。
-aで指定した成果物ディレクトリはカレントディレクトリに作成されています。

AWSの他サービスとの連携

AWSの他サービスと連携させる場合はAWS上でCodeBuildプロジェクトを実行する際は、IAMロールを使って権限管理を行うことになりますが、今回はローカルで動かしているのでその方法は使えません。よって、環境変数を記述したファイルを作成してそこにAWS_ACCESS_KEY_IDやAWS_SECRET__ACCESS_KEYなどを記述して利用しましょう。

AWS_ACCESS_KEY_ID='aws_access_key_id'
AWS_SECRET_ACCESS_KEY='aws_secret_access_key'
AWS_DEFAULT_REGION='ap-northeast-1'

environment_variables.envサンプル

これをCodeBuildに渡す際は以下の様に-eオプションで利用したい環境変数を記述したファイルを指定します。

$ codebuild_build.sh  \
    -i aws/codebuild/amazonlinux2-x86_64-standard:3.0 \
    -a artifacts \
    -e environment_variables.env

CodeBuildに読み込ませる環境変数ファイルを-eオプションで指定

他にもbuildspec.yml以外のファイルを指定したりなど基本的なオプションはすべて揃っているように見えるので、CodeBuildで開発を行う際は積極的に利用するようにしても良いでしょう。

この記事が気に入ったらサポートをしてみませんか?