背景・ユースケース
- CodePipeline で 2 つ以上のリポジトリやアーティファクト(例: SourceA, SourceB など)を取得し、それらをまとめてビルドしたい
- CloudFormation で CodePipeline + CodeBuild を定義する場合、「セカンダリソースをどう扱うか」「buildspec でどのようにパスを指定するか」が分かりにくい
- 本記事では、“CodePipeline の複数アーティファクト” を CodeBuild に渡して
$CODEBUILD_SRC_DIR_< artifactName > で参照する一連の手順を整理します
1.CloudFormation で CodePipeline に複数アーティファクトを設定
- Pipeline の例
Resources:
MyCodePipeline:
Type: AWS::CodePipeline::Pipeline
Properties:
ArtifactStore:
Location: !Ref ArtifactStoreS3
Type: S3
Name: !Ref PipelineName
RoleArn: !Ref PipelineServiceRole
Stages:
- Name: Source
Actions:
- Name: SourceA
ActionTypeId:
Category: Source
Owner: AWS
Provider: CodeCommit
Version: 1
OutputArtifacts:
- Name: SourceArtifactA
Configuration:
RepositoryName: my-repo-a
BranchName: main
RunOrder: 1
- Name: SourceB
ActionTypeId:
Category: Source
Owner: AWS
Provider: CodeCommit
Version: 1
OutputArtifacts:
- Name: SourceArtifactB
Configuration:
RepositoryName: my-repo-b
BranchName: dev
RunOrder: 1
- Name: Build
Actions:
- Name: BuildAction
ActionTypeId:
Category: Build
Owner: AWS
Provider: CodeBuild
Version: 1
Configuration:
ProjectName: !Ref MyCodeBuildProject
# PrimarySource は1つめのアーティファクトに紐づく(例: SourceArtifactA)
PrimarySource: SourceArtifactA
InputArtifacts:
- Name: SourceArtifactA
- Name: SourceArtifactB
OutputArtifacts:
- Name: BuildOutput
RunOrder: 1
- Sourceステージで 2 つの CodeCommit リポジトリ (my-repo-a, my-repo-b) を取得し、それぞれ SourceArtifactA, SourceArtifactB という名前で出力
- Buildステージ では、InputArtifacts に SourceArtifactA と SourceArtifactB を指定し、CodeBuild に同時に渡す
- PrimarySourceとしてSourceArtifactAを割り当てているので、CodeBuild側ではプライマリソースが$CODEBUILD_SRC_DIRに展開され、セカンダリソース(SourceArtifactB)は$CODEBUILD_SRC_DIR_SourceArtifactBに解凍される
2.CloudFormation で CodeBuild を設定
Resources:
MyCodeBuildProject:
Type: AWS::CodeBuild::Project
Properties:
Name: !Ref CodeBuildProjectName
ServiceRole: !Ref CodeBuildServiceRole
Artifacts:
Type: CODEPIPELINE
Environment:
ComputeType: BUILD_GENERAL1_SMALL
Image: aws/codebuild/standard:5.0
Type: LINUX_CONTAINER
Source:
Type: CODEPIPELINE
BuildSpec: buildspec.yml
- Type: CODEPIPELINE により、パイプラインが渡すアーティファクトをビルドに利用
- セカンダリソースをここでは定義せずとも、CodePipeline の Buildステージで InputArtifacts を複数指定すれば、CodeBuild の実行環境には複数アーティファクトが展開される
3. buildspec.yml で $CODEBUILD_SRC_DIR_ を使う
version: 0.2
phases:
build:
commands:
- echo "Primary Source is at: $CODEBUILD_SRC_DIR"
- echo "Additional Source is at: $CODEBUILD_SRC_DIR_SourceArtifactB"
- ls -R $CODEBUILD_SRC_DIR_SourceArtifactB
# 例: Bアーティファクト内のソースをzip
- cd $CODEBUILD_SRC_DIR_SourceArtifactB/some-subdir
- zip -r ../../build-output.zip .
- echo "Build or packaging steps completed"
artifacts:
files:
- "build-output.zip"
- ポイント
- プライマリソース(例: SourceArtifactA) → $CODEBUILD_SRC_DIR
- セカンダリソース(例: SourceArtifactB) → $CODEBUILD_SRC_DIR_SourceArtifactB
- コマンド内で cd $CODEBUILD_SRC_DIR_SourceArtifactB とすれば、ソースBの中身を自由に操作できる
- artifacts: セクションで build-output.zip などを指定すれば、CodeBuild は最終的に成果物をS3にアップロードし、後続ステージに受け渡せる
4. まとめ
- CloudFormation の CodePipeline 設定で 複数アーティファクト (InputArtifacts) を指定し、CodeBuild に同時に送る
- buildspec.yml では CODEBUILD_SRC_DIR_ (例: $CODEBUILD_SRC_DIR_SourceArtifactB) を使えば、どこに解凍されたかを意識せずに参照できる
- プライマリソースは CODEBUILD_SRC_DIR、追加のソースは $CODEBUILD_SRC_DIR_ の規則で展開される
- これにより、複数リポジトリをまとめてビルド・パッケージングするフローをシンプルに実装可能
この仕組みを使えば、1つの CodeBuild プロジェクトで複数ソースを組み合わせたビルドやデプロイ前準備がスムーズに行えます。