CodeBuild で複数のソースに別々のビルドを実行してみた
こんにちは。アノテーションの中村 (誠) です。
今回は 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
とします
- zip ファイル名は、
MessageUtil.zip |-- pom.xml |-- buildspec.yml `-- src |-- main | `-- java | `-- MessageUtil.java `-- test `-- java `-- TestMessageUtil.java
- セカンダリソースは以下のように buildspec.yml を除いたソースコードを zip 化します
- zip ファイル名は、
Secondary.zip
とします
- 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
と記載したため、sourceIdentifer
は source2
となり、ソース識別子にも 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 で複数のソースに別々のビルドを実行する方法について紹介しました。
どなたかの参考になれば幸いです。
参考資料
- 複数の入力ソースと出力アーティファクトのサンプル - AWS CodeBuild
- コンソールを使用した AWS CodeBuild の開始方法 - AWS CodeBuild
- AWS CodeBuild におけるビルドの詳細の表示 - AWS CodeBuild
- AWS CodePipeline を CodeBuild と複数の入力ソースおよび出力アーティファクトと統合するサンプル - AWS CodeBuild
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社 WEB サイトをご覧ください。