[アップデート]CodeBuildが複数ビルドの並列実行と逐次実行に対応しました!

CodeBuildが"Batch"ビルドを利用した、ビルドの並列実行と逐次実行をサポートしました! バッチビルドを利用することで、複数のビルドタスクを並列に実行したり、順番に実行していくことが可能になります。
2020.07.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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_smalllinux_medium 2つのバッチタスクが成功していることが確認できます。 linux_mediumlinux_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_smalllinux_medium 2つのバッチタスクが成功していることが確認できます。今度は linux_mediumlinux_small に依存関係が無く、並列で実行されています。

各バッチタスクのビルドログも見てみます。

こちらは linux_small のバッチログです。

こちらは linux_medium のバッチログです。

linux_smalllinux_medium に順番はなく、並列して実行されているのがわかります。

終わりに

CodeBuildがビルドの並列実行と逐次実行をサポートしたことで、複数のビルド成果物を必要とする場合や、成果物を生成するために互いに依存しているようなビルドを実行する場合にも利用できそうです。