[アップデート]CodeBuildが複数ビルドの並列実行と逐次実行に対応しました!
CodeBuildが "Batch" ビルドを利用した、ビルドの並列実行と逐次実行をサポートしました!
バッチビルドを利用することで、複数のビルドタスクを並列に実行したり、順番に実行していくことが可能になります。
異なるプラットフォームをターゲットにしていて複数のビルド成果物を必要とする場合や、成果物を生成するために互いに依存しているようなビルドを実行する場合に有効そうです。
この機能をさっそく試してみました!
CodeBuildのバッチビルドの種類
CodeBuildのバッチビルドでは、次の3種類のバッチがサポートされています。
- batch-graph
- 他のビルドタスクに依存するビルドタスクを定義できる。要するにビルドタスクに順番をつけて実行できる。
- batch-list
- ビルドタスクが並列実行できる。
- batch-matrix
- ビルドタスクを異なる環境と変数ごとに並列して実行できる。
このバッチビルドの種類は、1つ選択して利用することが期待されています。
buildspec.yml
へ複数のバッチビルドを記載することも記法上可能ですが、ビルド実行時にエラーが発生します。
ひとまず速報ということで、 batch-graph
タイプと batch-list
タイプを試してみます。
やってみた
CodeBuildプロジェクトの作成
まずはCodeBuildプロジェクトの作成をします。
マネジメントコンソールのCodeBuildの画面を開いて、CodeBuildプロジェクトを作成します。
プロジェクト名は適当につけます。今回は codebuild-batch-sample という名前にします。
今回はCodeBuildだけ動かしたいので、ソースは選びません。 通常は、CodeBuildやGitHub等のGitリポジトリを選択します。
環境は、Amazon Linux 2のマネジード型イメージを利用するように設定していきます。
buildspecは、ソースがないのでエディタに切り替えて次の内容を入力します。
次のyamlはbuild-graph
を利用する例です。これをコピー&ペーストして入力します。
version: 0.2 batch: fast-fail: false build-graph: - identifier: linux_small env: compute-type: BUILD_GENERAL1_SMALL - identifier: linux_medium env: compute-type: BUILD_GENERAL1_MEDIUM depend-on: - linux_small phases: build: commands: - "echo Start: $(date)" - "sleep 60" - "echo End: $(date)"
複数のビルドタスクが実行できるようになる、バッチ設定を定義していきます。 コンピュティーングリソースの制限やビルドの最大数を設定することもできますが、今回は特に制限しません。
成果物であるアーティファクトはなしにします。
ログはCloudWatch Logsに出力して確認できるようにしておきます。 全部入力できたら、ビルドプロジェクトを作成します。
これでバッチビルドを実行できるCodeBuildの環境ができました。
batch-graphタイプのビルドをやってみる
最初に batch-graph
タイプのビルドをやってみます。
先ほど、 buildspec
に設定したyamlを再掲します。
version: 0.2 batch: fast-fail: false build-graph: - identifier: linux_small env: compute-type: BUILD_GENERAL1_SMALL - identifier: linux_medium env: compute-type: BUILD_GENERAL1_MEDIUM depend-on: - linux_small phases: build: commands: - "echo Start: $(date)" - "sleep 60" - "echo End: $(date)"
この buildspec
では、まず最初に compute-typeを BUILD_GENERAL1_SMALL
でビルドタスクを実行し、それが終わったら BUILD_GENERAL1_MEDIUM
でビルドタスクを実行するよう定義しています。
何かしら依存するビルドタスクがあり、順番に複数のビルドタスクを実行したいときに利用できます。
ビルドフェーズでは、現在時刻を表示して60秒待機、また現在時刻を表示するだけのコマンドを実行しています。
それでは、実際にマネジメントコンソールで動かしてみます。
ビルドプロジェクトから先ほど作成した codebuild-batch-sample を選択して、ビルドの開始をクリックします。
ビルド設定として バッチビルド という複数のビルドを実行するオプションがあるのでこれを選択してビルドの開始をします。
そうするとビルドが開始するのでしばらく待ちます。
しばらくすると、 linux_small
と linux_medium
2つのバッチタスクが成功していることが確認できます。 linux_medium
は linux_small
の実行完了に依存していることもわかります。
各バッチタスクのビルドログも見てみます。
こちらは linux_small
のバッチログです。
こちらは linux_medium
のバッチログです。
たしかに、 linux_small
の実行完了を待って linux_medium
が実行されているのがわかります。
batch-listタイプのビルドをやってみる
次に batch-list
タイプのビルドをやってみます。
ビルドプロジェクトの buildspec
を、次のyamlで更新します。
version: 0.2 batch: fast-fail: false build-list: - identifier: linux_small env: compute-type: BUILD_GENERAL1_SMALL - identifier: linux_medium env: compute-type: BUILD_GENERAL1_MEDIUM phases: build: commands: - "echo Start: $(date)" - "sleep 60" - "echo End: $(date)"
その後、同じようにビルドを開始します。
しばらくすると、 linux_small
と linux_medium
2つのバッチタスクが成功していることが確認できます。今度は linux_medium
と linux_small
に依存関係が無く、並列で実行されています。
各バッチタスクのビルドログも見てみます。
こちらは linux_small
のバッチログです。
こちらは linux_medium
のバッチログです。
linux_small
と linux_medium
に順番はなく、並列して実行されているのがわかります。
終わりに
CodeBuildがビルドの並列実行と逐次実行をサポートしたことで、複数のビルド成果物を必要とする場合や、成果物を生成するために互いに依存しているようなビルドを実行する場合にも利用できそうです。