ようへいの日々精進XP

よかろうもん

AWS CodeBuild のビ・ビ・ビルドを実行したり, ビルドのステータスを確認出来るコマンドラインツールを作ってみたので, 何卒, ご容赦下さい

tl;dr

手元の端末で Docker ビルドするのって, Docker の環境を手元の端末に用意したりする必要があります. その環境を用意するにあたって, MacWindows 等の環境依存が発生することがあり, 結局, Docker という基盤の上に乗っけてしまえば環境に依存しないという Docker のメリットを殺してしまうよなーと思う機会がありました.

いっそのこと手元の端末での Docker ビルドは止めて, AWS の CodeBuild や CircleCI 等の CI/CD 環境にお任せすればいいんやないかな...その場合, 出来るだけ簡単に (コマンド一発か二発で) ビルド出来るようにしたいよなーと思ったので, AWS CodeBuild に特化しちゃうけどコマンドラインツールを作ってみました.

bibuild

これ

github.com

bibuild という名前です. 名前は星野源さんのシングル「ドラえもん」の初回特典 DVD に収録されていたらしい「ViVi Video」からインスピレーションを得ました.

www.hoshinogen.com

尚, bibuild はソースコードは S3 に放り込むことを前提としていて, GithubAWS CodeCommit には対応していません. すいません.

bibuild で出来ること

  • 指定したディレクトリに入っているソースコードを zip で固めます
  • zip で固めたソースコードを S3 にアップロードします
  • 指定した CodeBuild プロジェクトのビルドを実行します
  • 指定したビルドの状態を確認します

使い方

インストール

インストールはリリースページがダウンロードして頂いて, パスの通ったディレクトリにバイナリを放置して下さい. 強いて言えば, 念の為, 実行権限を付与して下さい.

chmod +x ~/bin/bibuild

尚, CodeBuild にアクセスするにあたって, 適切な権限が付与されたクレデンシャルを用意する必要がありますので, 合わせて用意しましょう. この記事では, direnv を利用して, AWS の Profile 名を環境変数にセットしています.

export AWS_PROFILE=washino-profile
export AWS_REGION=ap-northeast-1

例えば

以下のようなディレクトリ構成を用意します.

$ tree -L 1 .
.
├── config.yml
├── docker
└── terraform

2 directories, 1 file

terraform ディレクトリは気にしないで下さい. config.yml は bibuild で利用します. config.yml の内容は以下の通りです.

default:
  source_bucket: "codebuild-docker-build-project-sources"
  project_name: "codebuild-docker-build-project"
  source_key: "source.zip"
  directory: "docker"

尚, 今回は Docker イメージをビルドして ECR に push するようなプロジェクトをすでに CodeBuild に作成しているという体 (てい) でいきます. docker ディレクトリ以下に Dockerfile と buildspec.yml を用意しています.

$ tree -L 1 ./docker
./docker
├── Dockerfile
└── buildspec.yml

0 directories, 2 files

ちなみに, Dockerfile は以下のような内容です.

$ cat docker/Dockerfile
FROM ruby:latest
RN echo "Hello World"

あえて, エラーを発生させたいので, 構文エラーをしちゃっています.

docker ディレクトリ以下のファイルを source.zip というファイル名で圧縮して S3 バケットにアップロードし, CodeBuild プロジェクトにてビルドを実行するところまでを bibuild がやってくれることになります.

実際にやってみる

実際に bibuild を使って Docker イメージをビルドしてみたいと思います.

$ bibuild -version
0.0.2

以下のように -zip-put-build フラグを付与することで source.zip を生成, S3 バケットにアップロード, CodeBuild プロジェクトにてビルドをキックという処理を行います. フラグを個別に指定することで, 指定した処理のみを行わせることが出来ます.

$ bibuild -zip -put -build

以下のように出力されます.

✅  ソースファイルの zip 圧縮に成功しました.
✅  ソースファイルの S3 へのアップロードに成功しました.
✅  ビルドを開始しました. Project Name: codebuild-docker-build-project, Build ID: codebuild-docker-build-project:bc9be7f1-e9a7-4397-a5c5-3c9405cb1ccb

次に, ビルドの状態を確認してみます. bibuild に -stat=ビルド ID を指定すると, 以下のようにビルドの状態を確認することが出来ます.

$ bibuild -stat=codebuild-docker-build-project:bc9be7f1-e9a7-4397-a5c5-3c9405cb1ccb
Build ID: codebuild-docker-build-project:bc9be7f1-e9a7-4397-a5c5-3c9405cb1ccb
Build Status: FAILED
+------------------+---------------+---------------------+---------------------+
|       名前       |  ステータス   |      開始時刻       |      終了時刻       |
+------------------+---------------+---------------------+---------------------+
| SUBMITTED        | ✅  SUCCEEDED | 2018-12-22 09:56:02 | 2018-12-22 09:56:03 |
| QUEUED           | ✅  SUCCEEDED | 2018-12-22 09:56:03 | 2018-12-22 09:56:04 |
| PROVISIONING     | ✅  SUCCEEDED | 2018-12-22 09:56:04 | 2018-12-22 09:56:25 |
| DOWNLOAD_SOURCE  | ✅  SUCCEEDED | 2018-12-22 09:56:25 | 2018-12-22 09:56:26 |
| INSTALL          | ✅  SUCCEEDED | 2018-12-22 09:56:26 | 2018-12-22 09:56:26 |
| PRE_BUILD        | ✅  SUCCEEDED | 2018-12-22 09:56:26 | 2018-12-22 09:56:31 |
| BUILD            | ‼️   FAILED    | 2018-12-22 09:56:31 | 2018-12-22 09:56:32 |
| POST_BUILD       | ‼️   FAILED    | 2018-12-22 09:56:32 | 2018-12-22 09:56:32 |
| UPLOAD_ARTIFACTS | ✅  SUCCEEDED | 2018-12-22 09:56:32 | 2018-12-22 09:56:32 |
| FINALIZING       | ✅  SUCCEEDED | 2018-12-22 09:56:32 | 2018-12-22 09:56:34 |
| COMPLETED        | N/A           | 2018-12-22 09:56:34 | N/A                 |
+------------------+---------------+---------------------+---------------------+

あらー, 見事に BUILD フェーズで FAILED になっていることが判ります. 正常にビルドが終了するように Dockerfile を修正して, 再度, ビルドしてみたいと思います.

$ bibuild -zip -put -build
✅  ソースファイルの zip 圧縮に成功しました.
✅  ソースファイルの S3 へのアップロードに成功しました.
✅  ビルドを開始しました. Project Name: codebuild-docker-build-project, Build ID: codebuild-docker-build-project:aa626cb1-7395-4e9a-8910-aa85091853af

ステータスを確認してみます.

$ bibuild -stat=codebuild-docker-build-project:aa626cb1-7395-4e9a-8910-aa85091853af
Build ID: codebuild-docker-build-project:aa626cb1-7395-4e9a-8910-aa85091853af
Build Status: IN_PROGRESS
+--------------+---------------+---------------------+---------------------+
|     名前     |  ステータス   |      開始時刻       |      終了時刻       |
+--------------+---------------+---------------------+---------------------+
| SUBMITTED    | ✅  SUCCEEDED | 2018-12-22 10:00:13 | 2018-12-22 10:00:13 |
| QUEUED       | ✅  SUCCEEDED | 2018-12-22 10:00:13 | 2018-12-22 10:00:15 |
| PROVISIONING | N/A           | 2018-12-22 10:00:15 | N/A                 |
+--------------+---------------+---------------------+---------------------+

まだ, ビルド中のようですね.

$ bibuild -stat=codebuild-docker-build-project:aa626cb1-7395-4e9a-8910-aa85091853af
Build ID: codebuild-docker-build-project:aa626cb1-7395-4e9a-8910-aa85091853af
Build Status: SUCCEEDED
+------------------+---------------+---------------------+---------------------+
|       名前       |  ステータス   |      開始時刻       |      終了時刻       |
+------------------+---------------+---------------------+---------------------+
| SUBMITTED        | ✅  SUCCEEDED | 2018-12-22 10:00:13 | 2018-12-22 10:00:13 |
| QUEUED           | ✅  SUCCEEDED | 2018-12-22 10:00:13 | 2018-12-22 10:00:15 |
| PROVISIONING     | ✅  SUCCEEDED | 2018-12-22 10:00:15 | 2018-12-22 10:00:35 |
| DOWNLOAD_SOURCE  | ✅  SUCCEEDED | 2018-12-22 10:00:35 | 2018-12-22 10:00:36 |
| INSTALL          | ✅  SUCCEEDED | 2018-12-22 10:00:36 | 2018-12-22 10:00:36 |
| PRE_BUILD        | ✅  SUCCEEDED | 2018-12-22 10:00:36 | 2018-12-22 10:00:41 |
| BUILD            | ✅  SUCCEEDED | 2018-12-22 10:00:41 | 2018-12-22 10:01:15 |
| POST_BUILD       | ✅  SUCCEEDED | 2018-12-22 10:01:15 | 2018-12-22 10:01:16 |
| UPLOAD_ARTIFACTS | ✅  SUCCEEDED | 2018-12-22 10:01:16 | 2018-12-22 10:01:17 |
| FINALIZING       | ✅  SUCCEEDED | 2018-12-22 10:01:17 | 2018-12-22 10:01:19 |
| COMPLETED        | N/A           | 2018-12-22 10:01:19 | N/A                 |
+------------------+---------------+---------------------+---------------------+

おおー, 正常にビルドが完了したようです.

以上

俺のクソコードシリーズ, 第 N 弾である, bibuild をご紹介しました. 完全に俺得でしかないツールですが, コマンド一発で zip で圧縮して S3 にアップロードしてビルドまで実行してくれるので, docker build を叩くのとそれほど変わらない気軽さはあるかなあと思っています.

もし, よろしければ, お手元にダウンロード頂きましてお試し頂ければ幸いです.