Amazon Web Services ブログ

異なるAWS CodeBuildビルドスペックファイルを使用した、同じソースからの複数ビルド作成

2017年6月、 AWS CodeBuildプロジェクトで別のビルドスペックファイル名または場所を指定できるようになりました
この記事では、異なるビルドスペックファイルを同じリポジトリで使用して、異なるビルドを作成する方法を説明します。この投稿のソースコードは我々のGitHubリポジトリにあります。
 

前提要件

AWS CLIをインストールして設定しておく必要があります。

ソリューションの概要

共有ライブラリを作成するために使用されるCプログラム(cbsamplelib.c)と、そのライブラリを使用するための別のユーティリティプログラム(cbsampleutil.c)を作成しました。 Makefileを使ってこれらのファイルをコンパイルします。

このサンプルアプリケーションをRPMとDEBパッケージに入れてエンドユーザーが簡単に展開できるようにする必要があります。 RPM用のビルドスペックファイルを作成しました。ビルドスペックで設定されたこのコードとRPMスペックファイル(cbsample.rpmspec)をコンパイルしてRPMパッケージを作成するには、makeを使用します。同様に、DEB用のビルドスペックファイルも作成しました。このビルドスペックで構成されたコントロールファイル(cbsample.control)に基づいてDEBパッケージが作成されます。

 

RPMビルドプロジェクト:

次のビルドスペックファイル(buildspec-rpm.yml)は、ビルドスペックバージョン0.2を使用します。ドキュメントで説明されているように、このバージョンは環境変数の構文が異なります。このビルドスペックには、複数のフェーズがあります。

  • installフェーズの一部として、yumを使用して必要なパッケージがインストールされます
  • pre_buildフェーズでは、必要なディレクトリが作成され、RPMビルドスペックファイルを含む必要なファイルが適切な場所にコピーされます
  • buildフェーズでは、コードがコンパイルされ、RPMスペックに基づいてRPMパッケージが作成されます

artifactセクションで定義されているように、RPMファイルはビルドアーティファクトとしてアップロードされます。

version: 0.2 

env: 
  variables: 
    build_version: "0.1" 
	
phases: 
  install: 
    commands: 
      - yum install rpm-build make gcc glibc -y 
  pre_build: 
    commands: 
      - curr_working_dir=`pwd` 
      - mkdir -p ./{RPMS,SRPMS,BUILD,SOURCES,SPECS,tmp} 
      - filename="cbsample-$build_version" 
      - echo $filename 
      - mkdir -p $filename 
      - cp ./*.c ./*.h Makefile $filename 
      - tar -zcvf /root/$filename.tar.gz $filename 
      - cp /root/$filename.tar.gz ./SOURCES/ 
      - cp cbsample.rpmspec ./SPECS/ 
  build: 
    commands: 
      - echo "Triggering RPM build" 
      - rpmbuild --define "_topdir `pwd`" -ba SPECS/cbsample.rpmspec 
      - cd $curr_working_dir 
	  
artifacts: 
  files: 
    - RPMS/x86_64/cbsample*.rpm 
  discard-paths: yes 

cb-centos-project.jsonをリファレンスとして使用して、CLIコマンドの入力JSONファイルを作成します。このプロジェクトでは、codebuild-multispecというAWS CodeCommitリポジトリと、buildspec-rpm.ymlという名前のビルドスペックファイルを使用します。 RPMパッケージを作成するには、カスタムイメージ名を指定する必要があります。私はDocker Hubの最新のCentOS 7イメージを使用しています。CodeBuildServiceRoleという名前のIAMロールを使用しています。これには、CodeBuildServiceRole.jsonで定義されたものと同様の権限が含まれています。 (必要に応じて、ポリシー内のリソースフィールドを変更する必要があります。)

{ 
    "name": "rpm-build-project", 
    "description": "Project which will build RPM from the source.", 
    "source": { 
        "type": "CODECOMMIT", 
        "location": "https://git-codecommit.eu-west-1.amazonaws.com/v1/repos/codebuild-multispec", 
        "buildspec": "buildspec-rpm.yml" 
    }, 
    "artifacts": { 
        "type": "S3", 
        "location": "codebuild-demo-artifact-repository" 
    }, 
    "environment": { 
        "type": "LINUX_CONTAINER", 
        "image": "centos:7", 
        "computeType": "BUILD_GENERAL1_SMALL" 
    }, 
    "serviceRole": "arn:aws:iam::012345678912:role/service-role/CodeBuildServiceRole", 
    "timeoutInMinutes": 15, 
    "encryptionKey": "arn:aws:kms:eu-west-1:012345678912:alias/aws/s3", 
    "tags": [ 
        { 
            "key": "Name", 
            "value": "RPM Demo Build" 
        } 
    ] 
}

cli-input-jsonファイルが準備できたら、次のコマンドを実行してビルドプロジェクトを作成します。

$ aws codebuild create-project --name CodeBuild-RPM-Demo --cli-input-json file://cb-centos-project.json 
{ 
	"project": { 
		"name": "CodeBuild-RPM-Demo", 
		"serviceRole": "arn:aws:iam::012345678912:role/service-role/CodeBuildServiceRole", 
		"tags": [ 
			{ 
				"value": "RPM Demo Build", 
				"key": "Name" 
			} 
		], 
		"artifacts": { 
			"namespaceType": "NONE", 
			"packaging": "NONE", 
			"type": "S3", 
			"location": "codebuild-demo-artifact-repository", 
			"name": "CodeBuild-RPM-Demo" 
		}, 
		"lastModified": 1500559811.13, 
		"timeoutInMinutes": 15, 
		"created": 1500559811.13, 
		"environment": { 
			"computeType": "BUILD_GENERAL1_SMALL", 
			"privilegedMode": false, 
			"image": "centos:7", 
			"type": "LINUX_CONTAINER", 
			"environmentVariables": [] 
		}, 
		"source": { 
			"buildspec": "buildspec-rpm.yml", 
			"type": "CODECOMMIT", 
			"location": "https://git-codecommit.eu-west-1.amazonaws.com/v1/repos/codebuild-multispec" 
		}, 
		"encryptionKey": "arn:aws:kms:eu-west-1:012345678912:alias/aws/s3", 
		"arn": "arn:aws:codebuild:eu-west-1:012345678912:project/CodeBuild-RPM-Demo", 
		"description": "Project which will build RPM from the source." 
	} 
}

プロジェクトが作成されたら、次のコマンドを実行してビルドを開始します。ビルドが開始されたら、ビルドIDを取得します。ビルドIDを使用してビルドのステータスを取得することができます。

$ aws codebuild start-build --project-name CodeBuild-RPM-Demo 
{ 
    "build": { 
        "buildComplete": false,  
        "initiator": "prakash",  
        "artifacts": { 
            "location": "arn:aws:s3:::codebuild-demo-artifact-repository/CodeBuild-RPM-Demo" 
        },  
        "projectName": "CodeBuild-RPM-Demo",  
        "timeoutInMinutes": 15,  
        "buildStatus": "IN_PROGRESS",  
        "environment": { 
            "computeType": "BUILD_GENERAL1_SMALL",  
            "privilegedMode": false,  
            "image": "centos:7",  
            "type": "LINUX_CONTAINER",  
            "environmentVariables": [] 
        },  
        "source": { 
            "buildspec": "buildspec-rpm.yml",  
            "type": "CODECOMMIT",  
            "location": "https://git-codecommit.eu-west-1.amazonaws.com/v1/repos/codebuild-multispec" 
        },  
        "currentPhase": "SUBMITTED",  
        "startTime": 1500560156.761,  
        "id": "CodeBuild-RPM-Demo:57a36755-4d37-4b08-9c11-1468e1682abc",  
        "arn": "arn:aws:codebuild:eu-west-1: 012345678912:build/CodeBuild-RPM-Demo:57a36755-4d37-4b08-9c11-1468e1682abc" 
    } 
} 

$ aws codebuild list-builds-for-project --project-name CodeBuild-RPM-Demo 
{ 
    "ids": [ 
        "CodeBuild-RPM-Demo:57a36755-4d37-4b08-9c11-1468e1682abc" 
    ] 
} 

$ aws codebuild batch-get-builds --ids CodeBuild-RPM-Demo:57a36755-4d37-4b08-9c11-1468e1682abc 
{ 
    "buildsNotFound": [],  
    "builds": [ 
        { 
            "buildComplete": true,  
            "phases": [ 
                { 
                    "phaseStatus": "SUCCEEDED",  
                    "endTime": 1500560157.164,  
                    "phaseType": "SUBMITTED",  
                    "durationInSeconds": 0,  
                    "startTime": 1500560156.761 
                },  
                { 
                    "contexts": [],  
                    "phaseType": "PROVISIONING",  
                    "phaseStatus": "SUCCEEDED",  
                    "durationInSeconds": 24,  
                    "startTime": 1500560157.164,  
                    "endTime": 1500560182.066 
                },  
                { 
                    "contexts": [],  
                    "phaseType": "DOWNLOAD_SOURCE",  
                    "phaseStatus": "SUCCEEDED",  
                    "durationInSeconds": 15,  
                    "startTime": 1500560182.066,  
                    "endTime": 1500560197.906 
                },  
                { 
                    "contexts": [],  
                    "phaseType": "INSTALL",  
                    "phaseStatus": "SUCCEEDED",  
                    "durationInSeconds": 19,  
                    "startTime": 1500560197.906,  
                    "endTime": 1500560217.515 
                },  
                { 
                    "contexts": [],  
                    "phaseType": "PRE_BUILD",  
                    "phaseStatus": "SUCCEEDED",  
                    "durationInSeconds": 0,  
                    "startTime": 1500560217.515,  
                    "endTime": 1500560217.662 
                },  
                { 
                    "contexts": [],  
                    "phaseType": "BUILD",  
                    "phaseStatus": "SUCCEEDED",  
                    "durationInSeconds": 0,  
                    "startTime": 1500560217.662,  
                    "endTime": 1500560217.995 
                },  
                { 
                    "contexts": [],  
                    "phaseType": "POST_BUILD",  
                    "phaseStatus": "SUCCEEDED",  
                    "durationInSeconds": 0,  
                    "startTime": 1500560217.995,  
                    "endTime": 1500560218.074 
                },  
                { 
                    "contexts": [],  
                    "phaseType": "UPLOAD_ARTIFACTS",  
                    "phaseStatus": "SUCCEEDED",  
                    "durationInSeconds": 0,  
                    "startTime": 1500560218.074,  
                    "endTime": 1500560218.542 
                },  
                { 
                    "contexts": [],  
                    "phaseType": "FINALIZING",  
                    "phaseStatus": "SUCCEEDED",  
                    "durationInSeconds": 4,  
                    "startTime": 1500560218.542,  
                    "endTime": 1500560223.128 
                },  
                { 
                    "phaseType": "COMPLETED",  
                    "startTime": 1500560223.128 
                } 
            ],  
            "logs": { 
                "groupName": "/aws/codebuild/CodeBuild-RPM-Demo",  
                "deepLink": "https://console.aws.amazon.com/cloudwatch/home?region=eu-west-1#logEvent:group=/aws/codebuild/CodeBuild-RPM-Demo;stream=57a36755-4d37-4b08-9c11-1468e1682abc",  
                "streamName": "57a36755-4d37-4b08-9c11-1468e1682abc" 
            },  
            "artifacts": { 
                "location": "arn:aws:s3:::codebuild-demo-artifact-repository/CodeBuild-RPM-Demo" 
            },  
            "projectName": "CodeBuild-RPM-Demo",  
            "timeoutInMinutes": 15,  
            "initiator": "prakash",  
            "buildStatus": "SUCCEEDED",  
            "environment": { 
                "computeType": "BUILD_GENERAL1_SMALL",  
                "privilegedMode": false,  
                "image": "centos:7",  
                "type": "LINUX_CONTAINER",  
                "environmentVariables": [] 
            },  
            "source": { 
                "buildspec": "buildspec-rpm.yml",  
                "type": "CODECOMMIT",  
                "location": "https://git-codecommit.eu-west-1.amazonaws.com/v1/repos/codebuild-multispec" 
            },  
            "currentPhase": "COMPLETED",  
            "startTime": 1500560156.761,  
            "endTime": 1500560223.128,  
            "id": "CodeBuild-RPM-Demo:57a36755-4d37-4b08-9c11-1468e1682abc",  
            "arn": "arn:aws:codebuild:eu-west-1:012345678912:build/CodeBuild-RPM-Demo:57a36755-4d37-4b08-9c11-1468e1682abc" 
        } 
    ] 
}

DEB ビルドプロジェクト:

このプロジェクトでは、buildspec-deb.ymlというビルドスペックファイルを使用します。 RPMビルドプロジェクトと同様に、このビルドスペックには複数のフェーズが含まれています。ここでは、Debianコントロールファイルを使用してDEB形式のパッケージを作成します。ビルドが成功すると、ビルド成果物としてDEBパッケージがアップロードされます。

version: 0.2 

env: 
  variables: 
    build_version: "0.1" 

phases: 
  install: 
    commands: 
      - apt-get install gcc make -y 
  pre_build: 
    commands: 
      - mkdir -p ./cbsample-$build_version/DEBIAN 
      - mkdir -p ./cbsample-$build_version/usr/lib 
      - mkdir -p ./cbsample-$build_version/usr/include 
      - mkdir -p ./cbsample-$build_version/usr/bin 
      - cp -f cbsample.control ./cbsample-$build_version/DEBIAN/control 
  build: 
    commands: 
      - echo "Building the application" 
      - make 
      - cp libcbsamplelib.so ./cbsample-$build_version/usr/lib 
      - cp cbsamplelib.h ./cbsample-$build_version/usr/include 
      - cp cbsampleutil ./cbsample-$build_version/usr/bin 
      - chmod +x ./cbsample-$build_version/usr/bin/cbsampleutil 
      - dpkg-deb --build ./cbsample-$build_version 

artifacts: 
  files: 
    - cbsample-*.deb

ここでは、cb-ubuntu-project.jsonをリファレンスとして使用して、CLI入力JSONファイルを作成します。このプロジェクトは同じAWS CodeCommitリポジトリ(codebuild-multispec)を使用しますが、同じリポジトリ内の別のbuildspecファイル(buildspec-deb.yml)を使用します。デフォルトのCodeBuildイメージを使用してDEBパッケージを作成します。同じIAMロール(CodeBuildServiceRole)を使用します。

{ 
    "name": "deb-build-project", 
    "description": "Project which will build DEB from the source.", 
    "source": { 
        "type": "CODECOMMIT", 
        "location": "https://git-codecommit.eu-west-1.amazonaws.com/v1/repos/codebuild-multispec", 
        "buildspec": "buildspec-deb.yml" 
    }, 
    "artifacts": { 
        "type": "S3", 
        "location": "codebuild-demo-artifact-repository" 
    }, 
    "environment": { 
        "type": "LINUX_CONTAINER", 
        "image": "aws/codebuild/ubuntu-base:14.04", 
        "computeType": "BUILD_GENERAL1_SMALL" 
    }, 
    "serviceRole": "arn:aws:iam::012345678912:role/service-role/CodeBuildServiceRole", 
    "timeoutInMinutes": 15, 
    "encryptionKey": "arn:aws:kms:eu-west-1:012345678912:alias/aws/s3", 
    "tags": [ 
        { 
            "key": "Name", 
            "value": "Debian Demo Build" 
        } 
    ] 
}

CLI入力JSONファイルを使用して、プロジェクトを作成し、ビルドを開始し、プロジェクトのステータスを確認します。

$ aws codebuild create-project --name CodeBuild-DEB-Demo --cli-input-json file://cb-ubuntu-project.json 

$ aws codebuild list-builds-for-project --project-name CodeBuild-DEB-Demo 

$ aws codebuild batch-get-builds --ids CodeBuild-DEB-Demo:e535c4b0-7067-4fbe-8060-9bb9de203789

RPMおよびDEBビルドが正常に完了したら、ビルドパッケージのアーティファクトセクションで設定されているS3バケットを確認します。ビルドプロジェクトでは、ビルドプロジェクトの名前でディレクトリを作成し、内部にアーティファクトをコピーします。

$ aws s3 ls s3://codebuild-demo-artifact-repository/CodeBuild-RPM-Demo/ 
2017-07-20 16:16:59       8108 cbsample-0.1-1.el7.centos.x86_64.rpm 

$ aws s3 ls s3://codebuild-demo-artifact-repository/CodeBuild-DEB-Demo/ 
2017-07-20 16:37:22       5420 cbsample-0.1.deb

ビルド開始時のBuildspecのオーバーライド:

ビルドを開始するときに既存のプロジェクトのビルドスペックファイルをオーバーライドすることもできます。 RPM全体ではなくlibs RPMパッケージを作成する場合は、buildspec-libs-rpm.ymlという名前のビルドスペックファイルを使用します。このビルドスペックファイルは、以前のRPMビルドと似ています。唯一の違いは、別のRPMスペックファイルを使用してlibs RPMを作成することです。

version: 0.2 
env: 
  variables: 
    build_version: "0.1" 

phases: 
  install: 
    commands: 
      - yum install rpm-build make gcc glibc -y 
  pre_build: 
    commands: 
      - curr_working_dir=`pwd` 
      - mkdir -p ./{RPMS,SRPMS,BUILD,SOURCES,SPECS,tmp} 
      - filename="cbsample-libs-$build_version" 
      - echo $filename 
      - mkdir -p $filename 
      - cp ./*.c ./*.h Makefile $filename 
      - tar -zcvf /root/$filename.tar.gz $filename 
      - cp /root/$filename.tar.gz ./SOURCES/ 
      - cp cbsample-libs.rpmspec ./SPECS/ 
  build: 
    commands: 
      - echo "Triggering RPM build" 
      - rpmbuild --define "_topdir `pwd`" -ba SPECS/cbsample-libs.rpmspec 
      - cd $curr_working_dir 

artifacts: 
  files: 
    - RPMS/x86_64/cbsample-libs*.rpm 
  discard-paths: yes

先ほど作成したのと同じRPMビルドプロジェクトを使用して、新しいビルドを開始し、 `-buildspec-override`パラメータの値をbuildspec-libs-rpm.ymlに設定します。

$ aws codebuild start-build --project-name CodeBuild-RPM-Demo --buildspec-override buildspec-libs-rpm.yml 
{ 
    "build": { 
        "buildComplete": false,  
        "initiator": "prakash",  
        "artifacts": { 
            "location": "arn:aws:s3:::codebuild-demo-artifact-repository/CodeBuild-RPM-Demo" 
        },  
        "projectName": "CodeBuild-RPM-Demo",  
        "timeoutInMinutes": 15,  
        "buildStatus": "IN_PROGRESS",  
        "environment": { 
            "computeType": "BUILD_GENERAL1_SMALL",  
            "privilegedMode": false,  
            "image": "centos:7",  
            "type": "LINUX_CONTAINER",  
            "environmentVariables": [] 
        },  
        "source": { 
            "buildspec": "buildspec-libs-rpm.yml",  
            "type": "CODECOMMIT",  
            "location": "https://git-codecommit.eu-west-1.amazonaws.com/v1/repos/codebuild-multispec" 
        },  
        "currentPhase": "SUBMITTED",  
        "startTime": 1500562366.239,  
        "id": "CodeBuild-RPM-Demo:82d05f8a-b161-401c-82f0-83cb41eba567",  
        "arn": "arn:aws:codebuild:eu-west-1:012345678912:build/CodeBuild-RPM-Demo:82d05f8a-b161-401c-82f0-83cb41eba567" 
    } 
}

ビルドが正常に完了したら、CodeBuild-RPM-Demoビルドプロジェクトフォルダの下にあるアーティファクトS3バケットにパッケージが表示されているかどうかを確認します。

$ aws s3 ls s3://codebuild-demo-artifact-repository/CodeBuild-RPM-Demo/ 
2017-07-20 16:16:59       8108 cbsample-0.1-1.el7.centos.x86_64.rpm 
2017-07-20 16:53:54       5320 cbsample-libs-0.1-1.el7.centos.x86_64.rpm

まとめ

この記事では、同じソースリポジトリ内の複数のbuildspecファイルを使用して、複数のAWS CodeBuildビルドプロジェクトを実行する方法を紹介しました。また、ビルドを開始するときに別のビルドスペックファイルを提供する方法も示しました。
AWS CodeBuildの詳細については、AWS CodeBuildのドキュメントを参照してください。ステップバイステップガイドを使用して、AWS CodeBuildを使い始めることができます。
 
(翻訳はSA千葉が担当しました。原文はこちら)