0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

buildspec ファイルで複数ソース(アーティファクト)を扱う方法

Posted at

背景・ユースケース

  • CodePipeline で 2 つ以上のリポジトリやアーティファクト(例: SourceA, SourceB など)を取得し、それらをまとめてビルドしたい
  • CloudFormation で CodePipeline + CodeBuild を定義する場合、「セカンダリソースをどう扱うか」「buildspec でどのようにパスを指定するか」が分かりにくい
  • 本記事では、“CodePipeline の複数アーティファクト” を CodeBuild に渡して
    $CODEBUILD_SRC_DIR_< artifactName > で参照する一連の手順を整理します

1.CloudFormation で CodePipeline に複数アーティファクトを設定

  1. 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

  1. Sourceステージで 2 つの CodeCommit リポジトリ (my-repo-a, my-repo-b) を取得し、それぞれ SourceArtifactA, SourceArtifactB という名前で出力
  2. Buildステージ では、InputArtifacts に SourceArtifactA と SourceArtifactB を指定し、CodeBuild に同時に渡す
  3. 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"
  • ポイント
  1. プライマリソース(例: SourceArtifactA) → $CODEBUILD_SRC_DIR
  2. セカンダリソース(例: SourceArtifactB) → $CODEBUILD_SRC_DIR_SourceArtifactB
  3. コマンド内で cd $CODEBUILD_SRC_DIR_SourceArtifactB とすれば、ソースBの中身を自由に操作できる
  4. 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 プロジェクトで複数ソースを組み合わせたビルドやデプロイ前準備がスムーズに行えます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?