CodeBuild で複数のソースに別々のビルドを実行してみた

2023.01.11

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

こんにちは。アノテーションの中村 (誠) です。
今回は CodeBuild で複数のソースに別々のビルドを実行する方法について紹介します。

概要

以下の AWS 公式ドキュメントを参考に、複数のソースに別々のビルドを実行し、アーティファクトも別々に生成してみます。

やってみた

以下の CodeBuild のチュートリアルを参考に複数のソースに対するビルドをやってみました。

ステップ 1: ソースコードを作成する

チュートリアル通りで OK です。

  • ディレクトリ構造を間違えないように注意してください
  • ソースコードは編集不要です

ステップ 2: buildspec ファイルを作成する

チュートリアルの buildspec ファイル に追記します。

version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto11
  pre_build:
    commands:
      - echo Nothing to do in the pre_build phase...
  build:
    commands:
      - echo Build started on `date`
      - mvn install
      - cd $CODEBUILD_SRC_DIR_source2 # 追記
      - mvn install # 追記
  post_build:
    commands:
      - echo Build completed on `date`
artifacts:
  files:
    - target/messageUtil-1.0.jar
  # 以下追記
  secondary-artifacts:
    artifact2:
      base-directory: $CODEBUILD_SRC_DIR_source2
      files:
        - target/messageUtil-1.0.jar

追記箇所については AWS 公式ドキュメントの以下の部分が該当します。

プライマリソースは、source 属性で定義されます。他のすべてのソースはセカンダリソースと呼ばれ、secondarySources の下に表示されます。すべてのセカンダリソースは、独自のディレクトリにインストールされます。このディレクトリは、組み込みの環境変数 CODEBUILD_SRC_DIR_sourceIdentifer に保存されます。

つまり以下のような内容です。

  • プライマリソース
    • CodeBuild サーバーのデフォルトのディレクトリ
    • cd コマンド不要な場所でビルド
  • セカンダリソース
    • cd $CODEBUILD_SRC_DIR_sourceIdentifer でディレクトリを変更してビルド
    • sourceIdentifer はソース識別子で任意の名前を指定可能
    • CODEBUILD_SRC_DIR_sourceIdentifer は CodeBuild にデフォルトで存在する環境変数

おそらく DOWNLOAD_SOURCE フェーズでプライマリソースとセカンダリソースをソースコードがある S3 や Git リポジトリから、CodeBuild サーバー内の特定のディレクトリへダウンロードしていると思われます。

その際、プライマリソースは CodeBuild サーバーのデフォルトのディレクトリにダウンロードされ、セカンダリソースはソース識別子ごとに別々のディレクトリにダウンロードされるようになっていると思われます。

ステップ 3: 2 つの S3 バケットを作成する

チュートリアルでは 2 つの S3 バケットを作成しますが、今回は以下の 3 つの S3 バケットを作成します。

リージョンは任意ですが、CodeBuild プロジェクトを作成するリージョンと一致させてください。
S3 バケット作成時の設定はすべてデフォルトで OK です。

  • ソースコード保管用 S3 バケット
  • プライマリソースのアーティファクト保管用 S3 バケット
  • セカンダリソースのアーティファクト保管用 S3 バケット

ソースコード保管用 S3 バケットには任意の名前で 2 つのディレクトリを作成します。

  • Primary
  • Secondary

ステップ 4: ソースコードと buildspec ファイルをアップロードする

「ステップ 1: ソースコードを作成する」で作成したソースコード群を zip ファイルにまとめますが、プライマリソースとセカンダリソースで zip 化するファイルを変えます。

  • ルートディレクトリは含めないように zip 化します
  • プライマリソースは以下のソースコードを zip 化します
    • zip ファイル名は、Primary.zip とします

Primary.zip

MessageUtil.zip
    |-- pom.xml
    |-- buildspec.yml
    `-- src
         |-- main
         |     `-- java
         |           `-- MessageUtil.java
         `-- test
               `-- java
                     `-- TestMessageUtil.java
  • セカンダリソースは以下のように buildspec.yml を除いたソースコードを zip 化します
    • zip ファイル名は、Secondary.zip とします

Secondary.zip

MessageUtil.zip
    |-- pom.xml
    `-- src
         |-- main
         |     `-- java
         |           `-- MessageUtil.java
         `-- test
               `-- java
                     `-- TestMessageUtil.java

※セカンダリソースに buildspec.yml が含まれていてもエラーにはなりませんが、使用されないので含める意味がありません。

ソースコード保管用 S3 バケットに zip ファイルをアップロードします。

  • Primary
    • Primary.zip
  • Secondary
    • Secondary.zip

ステップ 5: ビルドプロジェクトを作成する

CodeBuild コンソールでビルドプロジェクトを作成します。

チュートリアルの設定とほぼ同じ内容で設定しますが、一部設定を変更します

  • 1 ~ 5 はチュートリアル通りで OK です
  • 6 の S3 バケットは、作成済みのソースコード保管用 S3 バケットを選択します
  • 7 の S3 オブジェクトキーは、「Primary/Primary.zip」と入力します

  • 「ソースの追加」をクリックしてセカンダリソースを指定します
    • ソース識別子は source2 と入力します
    • S3 バケットは、作成済みのソースコード保管用 S3 バケットを選択します
    • S3 オブジェクトキーは、「Secondary/Secondary.zip」と入力します

上記の設定で、プライマリソースとセカンダリソースを指定することができます。

ソース識別子は「ステップ 2: buildspec ファイルを作成する」の sourceIdentifer に入る値です。

今回は buildspec.yml 内で cd $CODEBUILD_SRC_DIR_source2 と記載したため、sourceIdentifersource2 となり、ソース識別子にも source2 と入力しました。

  • 8 ~ 14 はチュートリアル通りで OK です
  • 15 の S3 バケット名は作成済みのプライマリソースのアーティファクト保管用 S3 バケットを選択してください

  • 「アーティファクトの追加」をクリックします
    • アーティファクト識別子は artifact2 と入力します
    • buildspec.yml 内では以下の場所がアーティファクト識別子です
secondary-artifacts:
    artifact2: # ここがアーティファクト識別子
      base-directory: $CODEBUILD_SRC_DIR_source2
      files:
        - target/messageUtil-1.0.jar
  • S3 バケット名は作成済みのセカンダリソースのアーティファクト保管用の S3 バケットを選択してください

  • 16 ~ 17 はチュートリアル通りで OK です

ステップ 6: ビルドを実行する

チュートリアル通りで OK です。

上記の設定に従ってビルドを実行します。

ステップ 7: ビルド情報の要約を表示する

チュートリアル通りで OK です。

フェーズ詳細などからビルドの進行状況を確認できます。

ステップ 8: 詳細なビルド情報を表示する

チュートリアル通りで OK です。

Build フェーズでのビルドログを確認できます。

ここでプライマリソースやセカンダリソースのディレクトリ情報が環境変数に保持されたり、コマンドの実行結果を確認することができます。

プライマリソースとセカンダリソースにそれぞれビルドが実施されたことを確認するには、以下のログを探してください。

  • mvn install が 2 回ある
  • 2 回目の mvn install の前に cd $CODEBUILD_SRC_DIR_source2 がある

ステップ 9: ビルド出力アーティファクトを取得する

チュートリアル通りで OK です。

プライマリソースのアーティファクト保管用 S3 バケットと、セカンダリソースのアーティファクト保管用の S3 バケットにそれぞれ messageUtil-1.0.jar という名前のファイルが出力されています。

ビルド直後ではアーティファクトがアップロードされていない可能性があるので、ビルド後少し待つか、S3 コンソールでブラウザリロードしてください。

これでプライマリソースとセカンダリソースのビルド結果を別々に出力できることが確認できました。

おまけ

CodePipeline にも複数の入力ソースを使用するサンプルがありますので併せてご覧ください。

まとめ

今回は CodeBuild で複数のソースに別々のビルドを実行する方法について紹介しました。
どなたかの参考になれば幸いです。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社 WEB サイトをご覧ください。