エムオーテックス株式会社が運営するテックブログです。

CodeBuild の build-matrix 活用してビルド時間を40%短縮した話

CodeBuild の build-matrix 活用してビルド時間を40%短縮した話

はじめに

こんにちは、アプリケーションチームの桑名です。 LANSCOPE エンドポイントマネージャー クラウド版では、CI/CD パイプラインに CodePipeline と CodeBuild を利用しています。 ソフトウェア開発において、ビルドプロセスは非常に重要なステップです。しかし、ビルドに時間がかかると開発効率が低下してしまいます。

以前、森田が CodeBuild のバッチビルド機能の一つである build-list を活用したビルド時間短縮についての記事を執筆しています。build-list を活用することで、複数のビルドをリスト形式で指定し、順次実行することができます。詳細は以下の記事をご参照ください。
tech.motex.co.jp

今回は、同じく CodeBuild のバッチビルド機能の一つである build-matrix を活用し、ビルド時間を短縮する方法について紹介します。

CodeBuildのbuild-matrixとは

CodeBuild の build-matrix は、異なる構成のビルドを並行して実行する機能です。これにより、複数のビルドを同時に実行することで、全体のビルド時間を大幅に短縮することができます。

build-matrix を利用する利点

  • 並列ビルド: 複数のビルドを同時に実行することで、ビルド時間を短縮。
  • 柔軟な設定: 環境変数を使って異なるビルド構成を簡単に設定可能。
  • スケーラビリティ: ビルドの数が増えても、ビルド時間がほぼ変わらない。

参考: ビルドをバッチで実行

導入

CodePipeline と CodeBuild の準備

CodePipeline の中でバッチビルドをするためには、CodePipeline の設定でバッチビルドを有効にする必要があります。
CodePipeline から CodeBuild を呼び出す際に、バッチビルドを利用するためには、以下の2点が必要です。

  • 適切な権限の付与

    • 以下の権限を付与する必要があります。(適切な権限範囲に絞ってご利用ください。)
      • codebuild:StartBuildBatch
      • codebuild:StopBuildBatch
      • codebuild:RetryBuildBatch
      • codebuild:BatchGet*
  • バッチ機能の有効化

    • 「Configuration」オブジェクトの「BatchEnabled」パラメータを「true」に設定する

参考: CodePipeline/CodeBuild 統合とバッチビルドのサンプル

buildspec.yaml ファイルの設定

まず、CodeBuild の定義で指定している buildspec ファイルを設定します。
以下はその例です。

version: 0.2
batch:
  fast-fail: true
  build-matrix:
    static:
      ignore-failure: false
    dynamic:
      buildspec:
        - matrix_build.yaml # 指定された変数ごとに実行する buildspec ファイル
      env:
        variables:
          PROJECT: # build-matrix の一部として使用される任意の変数定義
            - PROJECT1
            - PROJECT2
            - PROJECT3

次に、dynamic.buildspec で定義した並列実行する buildspec ファイルを設定します。
以下はその例です。

version: 0.2
phases:
  pre_build:
    commands:
      - XXXXX
  build:
    commands:
      - echo "build ${PROJECT}" # variables で定義した変数は展開される
      - XXXXX
# 生成物を次のアクションに渡す必要がある場合は artifacts セクションを利用する
artifacts: 
  files:
    - "**/*"

参考: batch/build-matrix

実際のビルドプロセス

CodePipeline から実行すると、バッチビルドが実行されます。並列に動いているビルドのプロセスは CodeBuild のプロジェクトから確認できます。

バッチビルドの様子

パフォーマンスの比較

とある機能群の CodePipeline での build-matrix 導入前後のビルド時間を比較しました。

Before After

導入前と比べ、40%以上短縮できました。

メリットとデメリット

メリット

  • ビルド時間の短縮: 並列ビルドにより、全体のビルド時間が大幅に短縮されます。
  • ビルドコマンドの簡素化: 一つの buildspec で変数を変えながら複数のビルドを実行できるため、コマンドの記述が簡素化できます。
  • スケーラビリティ: ビルドしたいプロジェクトが増えても、ビルド時間がほぼ変わらない。

デメリット

  • リソース制限: CodeBuild の同時実行数の制限にかかる可能性がありますが、これはソフトリミットであり、引き上げが可能です。
  • コスト増加: 複数のビルドを並行して実行するため、オーバーヘッドが発生し、コストが増加する可能性があります。ですが、ビルドに必要なリソース等を予めパッケージングしたコンテナを用意しておくことや、実行環境を Lambda にする、など工夫することで最適化は可能です。

おわりに

成果

  • ビルドにかかる時間を大幅に削減できました。
    • 今後、ビルドするプロジェクト数が増えても時間はほとんど変わりません。
  • 並列ビルドにより、開発時の待ち時間が短縮されました。

感想

今回はまず一つの機能群のパイプラインで実現してみましたが、うまく実装でき、成果も得られたので他のパイプラインにも導入していこうと思います。
CodeBuild のバッチビルド機能自体はそこまで新しくないですが、CodePipeline で実行する場合のバッチビルドの設定の仕方や、build-matrix のサンプルは少なかったように思ったので、今後実装する方の参考になれば幸いです。