tl;dr
手元の端末で Docker ビルドするのって, Docker の環境を手元の端末に用意したりする必要があります. その環境を用意するにあたって, Mac や Windows 等の環境依存が発生することがあり, 結局, Docker という基盤の上に乗っけてしまえば環境に依存しないという Docker のメリットを殺してしまうよなーと思う機会がありました.
いっそのこと手元の端末での Docker ビルドは止めて, AWS の CodeBuild や CircleCI 等の CI/CD 環境にお任せすればいいんやないかな...その場合, 出来るだけ簡単に (コマンド一発か二発で) ビルド出来るようにしたいよなーと思ったので, AWS CodeBuild に特化しちゃうけどコマンドラインツールを作ってみました.
bibuild
これ
bibuild という名前です. 名前は星野源さんのシングル「ドラえもん」の初回特典 DVD に収録されていたらしい「ViVi Video」からインスピレーションを得ました.
尚, bibuild はソースコードは S3 に放り込むことを前提としていて, Github や AWS 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"
source_bucket
にはソースコードを置く S3 バケット名を指定しますproject_name
には CodeBuild のプロジェクト名を指定しますsource_key
にはソースコードを圧縮した際のファイル名 (S3 上ではキー名になる) を指定しますdirectory
には手元の端末上のソースコードが入っているディレクトリ名を指定します
尚, 今回は 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
を叩くのとそれほど変わらない気軽さはあるかなあと思っています.
もし, よろしければ, お手元にダウンロード頂きましてお試し頂ければ幸いです.