CodePipelineはGithubのpushイベントをウォッチし、ブランチにプッシュ後自動でbuild & deployすることが出来ます。
CodeBuildの設定
GitHubで管理しているプロジェクトのBulidの実行環境構成を記述します。
build-project.json
{ "timeoutInMinutes": 60, "name": "serverless-pipeline", "serviceRole": "your-codebuild-role", "tags": [], "artifacts": { "packaging": "NONE", "type": "CODEPIPELINE", "name": "serverless-pipeline" }, "cache": { "type": "NO_CACHE" }, "environment": { "computeType": "BUILD_GENERAL1_SMALL", "privilegedMode": false, "image": "aws/codebuild/python:3.5.2", "type": "LINUX_CONTAINER", "environmentVariables": [] }, "source": { "insecureSsl": false, "type": "CODEPIPELINE" } }
serviceRoleには、s3
、cloudwatchlog
、CodeBuild
へのssm:GetParameters
のpermissionを与えます。緩めのポリシーでよければ、AWSCodeBuildAdminAccess
を付与したロールを指定すればよい。
また、build settingに関してはbuildspec.yaml
に記述し、GitHub上に配置しておきます。
CodeBuildプロジェクトの作成
$ aws codebuild create-project --cli-input-json file://build-project.json
buildspec.yaml
buildspec.yaml
はGitHub上のリポジトリ最上位にpushするsettingファイル。このsettingをCodeBuildは実行してbuildを行います。
ステップ 3: buildspec ファイルを作成する - AWS CodeBuild
version: 0.1 phases: install: commands: - pip3 install boto3 - aws cloudformation package --template-file sample-sam.yaml --s3-bucket your-output-bucket --output-template-file sample-sam-output.yaml artifacts: type: zip files: - sample-sam-output.yaml
sample-sam.yaml
はcloudformationのスタックの定義。
CodePipelineプロジェクトの作成
pipeline.json
{ "pipeline": { "roleArn": "your-pipelinerole", "stages": [ { "name": "Source", "actions": [ { "inputArtifacts": [], "name": "Source", "actionTypeId": { "category": "Source", "owner": "ThirdParty", "version": "1", "provider": "GitHub" }, "outputArtifacts": [ { "name": "MyApp" } ], "configuration": { "Owner": "your-github-user-name", "Repo": "your-github-repository-name", "PollForSourceChanges": "true", "Branch": "master", "OAuthToken": "****" }, "runOrder": 1 } ] }, { "name": "Build", "actions": [ { "inputArtifacts": [ { "name": "MyApp" } ], "name": "CodeBuild", "actionTypeId": { "category": "Build", "owner": "AWS", "version": "1", "provider": "CodeBuild" }, "outputArtifacts": [ { "name": "MyAppBuild" } ], "configuration": { "ProjectName": "serverless-pipeline" }, "runOrder": 1 } ] }, { "name": "Staging", "actions": [ { "inputArtifacts": [ { "name": "MyAppBuild" } ], "name": "MyBetaStack", "actionTypeId": { "category": "Deploy", "owner": "AWS", "version": "1", "provider": "CloudFormation" }, "outputArtifacts": [], "configuration": { "ActionMode": "CHANGE_SET_REPLACE", "ChangeSetName": "MyBetaChangeSet", "RoleArn": "your-cloudformation-role", "Capabilities": "CAPABILITY_IAM", "StackName": "MyBetaStack", "TemplatePath": "MyAppBuild::sample-sam-output.yaml" }, "runOrder": 1 }, { "inputArtifacts": [], "name": "Execute_ChangeSet", "actionTypeId": { "category": "Deploy", "owner": "AWS", "version": "1", "provider": "CloudFormation" }, "outputArtifacts": [], "configuration": { "StackName": "MyBetaStack", "ActionMode": "CHANGE_SET_EXECUTE", "ChangeSetName": "MyBetaChangeSet" }, "runOrder": 2 } ] } ], "artifactStore": { "type": "S3", "location": "your-s3-bucket-of-buildpackage" }, "name": "serverless-pipeline" } }
roleArn
にはpipelineに許可するロールを。緩めで良いのであれば、AWSCodePipelineFullAccess
のポリシーをアタッチしたロールを指定するのが手取り早い。
Sourceセクション
ウォッチするGitHubの定義を記述します。OAuthToken
は対象のGitHubアカウントのDeveloper settingで取得します。
Buildセクション
Sourceセクションでの成果物、Artifacts
を受け取り、上記で作成したCodeBuidのProjectName
を指定する。
Stagingセクション
Buildでの成果物をデプロイするセクション。上記例ではCloudFormationでのデプロイを定義しています。
cloudformationのroleは、デプロイ対象となるLambda、DynamoDBなどのサービスについての操作ポリシーを設定したロールを与える。
artifactStore
各セクションでの成果物を保存するS3 Bucketを指定します。
codepipelineの作成
$ aws codepipeline create-pipeline --cli-input-json file://pipeline.json
コマンド実行後、まず最初に一度デプロイされ、GitHubリポジトリにプッシュされる度、デプロイが実行されます。