diff --git a/packages/@aws-cdk/aws-codebuild-codepipeline/test/test.pipeline.ts b/packages/@aws-cdk/aws-codebuild-codepipeline/test/test.pipeline.ts index 7ddcfa8b706f8..fa85c15522041 100644 --- a/packages/@aws-cdk/aws-codebuild-codepipeline/test/test.pipeline.ts +++ b/packages/@aws-cdk/aws-codebuild-codepipeline/test/test.pipeline.ts @@ -3,7 +3,6 @@ import codebuild = require('@aws-cdk/aws-codebuild'); import codecommit = require('@aws-cdk/aws-codecommit'); import codecommitPipeline = require('@aws-cdk/aws-codecommit-codepipeline'); import codepipeline = require('@aws-cdk/aws-codepipeline'); -import s3 = require('@aws-cdk/aws-s3'); import sns = require('@aws-cdk/aws-sns'); import cdk = require('@aws-cdk/cdk'); import { Test } from 'nodeunit'; @@ -132,11 +131,13 @@ export = { const pipeline = new codepipeline.Pipeline(stack, 'PL'); - new codepipeline.AmazonS3Source(new codepipeline.Stage(pipeline, 'S1'), 'A1', { - artifactName: 'Artifact', - bucket: new s3.Bucket(stack, 'Bucket'), - bucketKey: 'Key' + const repo = new codecommit.Repository(stack, 'MyRepo', { repositoryName: 'my-repo' }); + const sourceStage = new codepipeline.Stage(pipeline, 'source'); + new codecommitPipeline.PipelineSource(sourceStage, 'source', { + artifactName: 'SourceArtifact', + repository: repo, }); + new codepipeline.ApprovalAction(new codepipeline.Stage(pipeline, 'S2'), 'A2'); pipeline.onStateChange('OnStateChange', topic, { diff --git a/packages/@aws-cdk/aws-codepipeline/lib/actions.ts b/packages/@aws-cdk/aws-codepipeline/lib/actions.ts index 0a25581f778d7..6042397b8618f 100644 --- a/packages/@aws-cdk/aws-codepipeline/lib/actions.ts +++ b/packages/@aws-cdk/aws-codepipeline/lib/actions.ts @@ -1,5 +1,4 @@ import events = require('@aws-cdk/aws-events'); -import s3 = require('@aws-cdk/aws-s3'); import cdk = require('@aws-cdk/cdk'); import { Artifact } from './artifact'; import { cloudformation } from './codepipeline.generated'; @@ -241,8 +240,9 @@ export interface SourceProps { } /** - * Low level class for source actions. - * It is recommended that concrete types are used instead, such as {@link AmazonS3Source} or + * Low level class for source Actions. + * It is recommended that concrete types are used instead, + * such as {@link s3pipeline.SourceAction} or * {@link codecommit.PipelineSource}. */ export abstract class Source extends Action { @@ -262,55 +262,6 @@ export abstract class Source extends Action { } } -/** - * Construction properties of the {@link AmazonS3Source S3 source action} - */ -export interface AmazonS3SourceProps { - /** - * The name of the source's output artifact. Output artifacts are used by CodePipeline as - * inputs into other actions. - */ - artifactName: string; - - /** - * The Amazon S3 bucket that stores the source code - */ - bucket: s3.BucketRef; - - /** - * The key within the S3 bucket that stores the source code - */ - bucketKey: string; - - // TODO: use CloudWatch events instead - /** - * Whether or not AWS CodePipeline should poll for source changes - * - * @default true - */ - pollForSourceChanges?: boolean; -} - -/** - * Source that is provided by a specific Amazon S3 object - */ -export class AmazonS3Source extends Source { - constructor(parent: Stage, name: string, props: AmazonS3SourceProps) { - super(parent, name, { - provider: 'S3', - configuration: { - S3Bucket: props.bucket.bucketName, - S3ObjectKey: props.bucketKey, - PollForSourceChanges: props.pollForSourceChanges || true - }, - artifactName: props.artifactName - }); - - // pipeline needs permissions to read from the S3 bucket - props.bucket.grantRead(parent.pipeline.role); - } -} - /** * Construction properties of the {@link GitHubSource GitHub source action} */ diff --git a/packages/@aws-cdk/aws-codepipeline/test/test.general-validation.ts b/packages/@aws-cdk/aws-codepipeline/test/test.general-validation.ts index 04c1bb610729e..94993750afb8b 100644 --- a/packages/@aws-cdk/aws-codepipeline/test/test.general-validation.ts +++ b/packages/@aws-cdk/aws-codepipeline/test/test.general-validation.ts @@ -1,7 +1,6 @@ -import s3 = require('@aws-cdk/aws-s3'); import cdk = require('@aws-cdk/cdk'); import { Test } from 'nodeunit'; -import { AmazonS3Source } from '../lib/actions'; +import { GitHubSource } from '../lib/actions'; import { Pipeline } from '../lib/pipeline'; import { Stage } from '../lib/stage'; import { validateName } from '../lib/validation'; @@ -60,16 +59,17 @@ export = { const firstStage = new Stage(pipeline, 'FirstStage'); const secondStage = new Stage(pipeline, 'SecondStage'); - const bucket = new s3.Bucket(stack, 'PipelineBucket'); - new AmazonS3Source(firstStage, 'FirstAction', { + new GitHubSource(firstStage, 'FirstAction', { artifactName: 'FirstArtifact', - bucket, - bucketKey: 'key', + owner: 'awslabs', + repo: 'aws-cdk', + oauthToken: new cdk.Secret('not-secret'), }); - new AmazonS3Source(secondStage, 'SecondAction', { + new GitHubSource(secondStage, 'SecondAction', { artifactName: 'SecondAction', - bucket, - bucketKey: 'key', + owner: 'awslabs', + repo: 'aws-cdk', + oauthToken: new cdk.Secret('not-secret'), }); test.deepEqual(pipeline.validate().length, 1); diff --git a/packages/@aws-cdk/aws-lambda-codepipeline/package.json b/packages/@aws-cdk/aws-lambda-codepipeline/package.json index 1072ca708d0b8..3b23ef1661b71 100644 --- a/packages/@aws-cdk/aws-lambda-codepipeline/package.json +++ b/packages/@aws-cdk/aws-lambda-codepipeline/package.json @@ -50,6 +50,8 @@ "license": "Apache-2.0", "devDependencies": { "@aws-cdk/assert": "^0.8.0", + "@aws-cdk/aws-s3": "^0.8.0", + "@aws-cdk/aws-s3-codepipeline": "^0.8.0", "cdk-build-tools": "^0.8.0", "cdk-integ-tools": "^0.8.0", "pkglint": "^0.8.0" @@ -57,7 +59,6 @@ "dependencies": { "@aws-cdk/aws-codepipeline": "^0.8.0", "@aws-cdk/aws-lambda": "^0.8.0", - "@aws-cdk/aws-s3": "^0.8.0", "@aws-cdk/cdk": "^0.8.0" }, "homepage": "https://github.com/awslabs/aws-cdk" diff --git a/packages/@aws-cdk/aws-lambda-codepipeline/test/integ.pipeline.ts b/packages/@aws-cdk/aws-lambda-codepipeline/test/integ.pipeline.ts index fd132d3b1dfe1..52533516b505c 100644 --- a/packages/@aws-cdk/aws-lambda-codepipeline/test/integ.pipeline.ts +++ b/packages/@aws-cdk/aws-lambda-codepipeline/test/integ.pipeline.ts @@ -1,8 +1,9 @@ import codepipeline = require('@aws-cdk/aws-codepipeline'); import lambda = require('@aws-cdk/aws-lambda'); import s3 = require('@aws-cdk/aws-s3'); +import s3Pipeline = require('@aws-cdk/aws-s3-codepipeline'); import cdk = require('@aws-cdk/cdk'); -import lambda_codepipeline = require('../lib'); +import lambdaCodepipeline = require('../lib'); const app = new cdk.App(process.argv); @@ -14,7 +15,7 @@ const sourceStage = new codepipeline.Stage(pipeline, 'Source'); const bucket = new s3.Bucket(stack, 'PipelineBucket', { versioned: true, }); -new codepipeline.AmazonS3Source(sourceStage, 'Source', { +new s3Pipeline.SourceAction(sourceStage, 'Source', { artifactName: 'SourceArtifact', bucket, bucketKey: 'key', @@ -30,7 +31,7 @@ const lambdaFun = new lambda.Lambda(stack, 'LambdaFun', { runtime: lambda.LambdaRuntime.NodeJS610, }); const lambdaStage = new codepipeline.Stage(pipeline, 'Lambda'); -new lambda_codepipeline.PipelineInvokeAction(lambdaStage, 'Lambda', { +new lambdaCodepipeline.PipelineInvokeAction(lambdaStage, 'Lambda', { lambda: lambdaFun, }); diff --git a/packages/@aws-cdk/aws-s3-codepipeline/.gitignore b/packages/@aws-cdk/aws-s3-codepipeline/.gitignore new file mode 100644 index 0000000000000..e041419afd723 --- /dev/null +++ b/packages/@aws-cdk/aws-s3-codepipeline/.gitignore @@ -0,0 +1,15 @@ +*.js +*.js.map +*.d.ts +tsconfig.json +tslint.json +node_modules +*.generated.ts +dist +.jsii + +.LAST_BUILD +.nyc_output +coverage +.nycrc +.LAST_PACKAGE diff --git a/packages/@aws-cdk/aws-s3-codepipeline/.npmignore b/packages/@aws-cdk/aws-s3-codepipeline/.npmignore new file mode 100644 index 0000000000000..4301d6e22c589 --- /dev/null +++ b/packages/@aws-cdk/aws-s3-codepipeline/.npmignore @@ -0,0 +1,11 @@ +# Don't include original .ts files when doing `npm pack` +*.ts +!*.d.ts +coverage +.nyc_output +*.tgz + +dist +.LAST_PACKAGE +.LAST_BUILD +!*.js diff --git a/packages/@aws-cdk/aws-s3-codepipeline/LICENSE b/packages/@aws-cdk/aws-s3-codepipeline/LICENSE new file mode 100644 index 0000000000000..1739faaebb745 --- /dev/null +++ b/packages/@aws-cdk/aws-s3-codepipeline/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/@aws-cdk/aws-s3-codepipeline/NOTICE b/packages/@aws-cdk/aws-s3-codepipeline/NOTICE new file mode 100644 index 0000000000000..95fd48569c743 --- /dev/null +++ b/packages/@aws-cdk/aws-s3-codepipeline/NOTICE @@ -0,0 +1,2 @@ +AWS Cloud Development Kit (AWS CDK) +Copyright 2018-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. diff --git a/packages/@aws-cdk/aws-s3-codepipeline/README.md b/packages/@aws-cdk/aws-s3-codepipeline/README.md new file mode 100644 index 0000000000000..0040d85f6b859 --- /dev/null +++ b/packages/@aws-cdk/aws-s3-codepipeline/README.md @@ -0,0 +1,24 @@ +## AWS CodePipline Actions for AWS S3 + +This module contains an Action that allows you to use an S3 Bucket as a source in CodePipeline. + +Example: + +```ts +import codepipeline = require('@aws-cdk/aws-codepipeline'); +import s3 = require('@aws-cdk/aws-s3'); +import s3Pipeline = require('@aws-cdk/aws-s3-codepipeline'); + +const pipeline = new codepipeline.Pipeline(this, 'MyPipeline'); +const sourceStage = new codepipeline.Stage(pipeline, 'Source'); + +const bucket = new s3.Bucket(this, 'SourceBucket', { + // a Bucket used in a CodePipeline must have versioning enabled + versioned: true +}) +new s3Pipeline.SourceAction(buildStage, 'S3Source', { + artifactName: 'SourceArtifact', + bucket, + bucketKey: 'path/to/zip/file', +}); +``` diff --git a/packages/@aws-cdk/aws-s3-codepipeline/lib/index.ts b/packages/@aws-cdk/aws-s3-codepipeline/lib/index.ts new file mode 100644 index 0000000000000..890162998e10d --- /dev/null +++ b/packages/@aws-cdk/aws-s3-codepipeline/lib/index.ts @@ -0,0 +1 @@ +export * from './pipeline-action'; diff --git a/packages/@aws-cdk/aws-s3-codepipeline/lib/pipeline-action.ts b/packages/@aws-cdk/aws-s3-codepipeline/lib/pipeline-action.ts new file mode 100644 index 0000000000000..7971f020dc3fa --- /dev/null +++ b/packages/@aws-cdk/aws-s3-codepipeline/lib/pipeline-action.ts @@ -0,0 +1,51 @@ +import codepipeline = require('@aws-cdk/aws-codepipeline'); +import s3 = require('@aws-cdk/aws-s3'); + +/** + * Construction properties of the {@link SourceAction S3 source CodePipeline Action}. + */ +export interface SourceActionProps { + /** + * The name of the source's output artifact. Output artifacts are used by CodePipeline as + * inputs into other actions. + */ + artifactName: string; + + /** + * The Amazon S3 bucket that stores the source code + */ + bucket: s3.BucketRef; + + /** + * The key within the S3 bucket that stores the source code + */ + bucketKey: string; + + // TODO: use CloudWatch events instead + /** + * Whether or not AWS CodePipeline should poll for source changes + * + * @default true + */ + pollForSourceChanges?: boolean; +} + +/** + * Source that is provided by a specific Amazon S3 object + */ +export class SourceAction extends codepipeline.Source { + constructor(parent: codepipeline.Stage, name: string, props: SourceActionProps) { + super(parent, name, { + provider: 'S3', + configuration: { + S3Bucket: props.bucket.bucketName, + S3ObjectKey: props.bucketKey, + PollForSourceChanges: props.pollForSourceChanges || true + }, + artifactName: props.artifactName + }); + + // pipeline needs permissions to read from the S3 bucket + props.bucket.grantRead(parent.pipeline.role); + } +} diff --git a/packages/@aws-cdk/aws-s3-codepipeline/package.json b/packages/@aws-cdk/aws-s3-codepipeline/package.json new file mode 100644 index 0000000000000..0d155673e758e --- /dev/null +++ b/packages/@aws-cdk/aws-s3-codepipeline/package.json @@ -0,0 +1,62 @@ +{ + "name": "@aws-cdk/aws-s3-codepipeline", + "version": "0.8.0", + "description": "AWS CodePipline Actions for AWS S3", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "jsii": { + "outdir": "dist", + "targets": { + "java": { + "package": "software.amazon.awscdk.aws.s3.codepipeline", + "maven": { + "groupId": "software.amazon.awscdk", + "artifactId": "aws-s3-codepipeline" + } + }, + "dotnet": { + "namespace": "Amazon.CDK.AWS.S3.CodePipeline" + } + } + }, + "repository": { + "type": "git", + "url": "git://github.com/awslabs/aws-cdk" + }, + "scripts": { + "build": "cdk-build", + "watch": "cdk-watch", + "lint": "cdk-lint", + "test": "cdk-test", + "integ": "cdk-integ", + "pkglint": "pkglint -f", + "package": "cdk-package" + }, + "keywords": [ + "aws", + "actions", + "cdk", + "codepipeline", + "constructs", + "s3" + ], + "author": { + "name": "Amazon Web Services", + "url": "https://aws.amazon.com" + }, + "license": "Apache-2.0", + "devDependencies": { + "@aws-cdk/assert": "^0.8.0", + "@aws-cdk/aws-codebuild": "^0.8.0", + "@aws-cdk/aws-codebuild-codepipeline": "^0.8.0", + "cdk-build-tools": "^0.8.0", + "cdk-integ-tools": "^0.8.0", + "pkglint": "^0.8.0" + }, + "dependencies": { + "@aws-cdk/aws-codepipeline": "^0.8.0", + "@aws-cdk/aws-s3": "^0.8.0", + "@aws-cdk/cdk": "^0.8.0" + }, + "homepage": "https://github.com/awslabs/aws-cdk" +} diff --git a/packages/@aws-cdk/aws-s3-codepipeline/test/integ.pipeline-s3-code-build.expected.json b/packages/@aws-cdk/aws-s3-codepipeline/test/integ.pipeline-s3-code-build.expected.json new file mode 100644 index 0000000000000..5f8d0a1da53d1 --- /dev/null +++ b/packages/@aws-cdk/aws-s3-codepipeline/test/integ.pipeline-s3-code-build.expected.json @@ -0,0 +1,385 @@ +{ + "Resources": { + "PipelineArtifactsBucket22248F97": { + "Type": "AWS::S3::Bucket", + "DeletionPolicy": "Retain" + }, + "PipelineRoleD68726F7": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codepipeline.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "PipelineRoleDefaultPolicyC7A05455": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + "s3:PutObject*", + "s3:DeleteObject*", + "s3:Abort*" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::GetAtt": [ + "PipelineArtifactsBucket22248F97", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "PipelineArtifactsBucket22248F97", + "Arn" + ] + }, + "/", + "*" + ] + ] + } + ] + }, + { + "Action": [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::GetAtt": [ + "SourceBucketDDD2130A", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "SourceBucketDDD2130A", + "Arn" + ] + }, + "/", + "*" + ] + ] + } + ] + }, + { + "Action": [ + "codebuild:BatchGetBuilds", + "codebuild:StartBuild", + "codebuild:StopBuild" + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "MyBuildProject30DB9D6E", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "PipelineRoleDefaultPolicyC7A05455", + "Roles": [ + { + "Ref": "PipelineRoleD68726F7" + } + ] + } + }, + "PipelineC660917D": { + "Type": "AWS::CodePipeline::Pipeline", + "Properties": { + "ArtifactStore": { + "Location": { + "Ref": "PipelineArtifactsBucket22248F97" + }, + "Type": "S3" + }, + "RoleArn": { + "Fn::GetAtt": [ + "PipelineRoleD68726F7", + "Arn" + ] + }, + "Stages": [ + { + "Actions": [ + { + "ActionTypeId": { + "Category": "Source", + "Owner": "AWS", + "Provider": "S3", + "Version": "1" + }, + "Configuration": { + "S3Bucket": { + "Ref": "SourceBucketDDD2130A" + }, + "S3ObjectKey": "path/to/zip", + "PollForSourceChanges": true + }, + "InputArtifacts": [], + "Name": "S3Source", + "OutputArtifacts": [ + { + "Name": "SourceArtifact" + } + ], + "RunOrder": 1 + } + ], + "Name": "Source" + }, + { + "Actions": [ + { + "ActionTypeId": { + "Category": "Build", + "Owner": "AWS", + "Provider": "CodeBuild", + "Version": "1" + }, + "Configuration": { + "ProjectName": { + "Ref": "MyBuildProject30DB9D6E" + } + }, + "InputArtifacts": [ + { + "Name": "SourceArtifact" + } + ], + "Name": "CodeBuild", + "OutputArtifacts": [], + "RunOrder": 1 + } + ], + "Name": "Build" + } + ] + }, + "DependsOn": [ + "PipelineRoleD68726F7", + "PipelineRoleDefaultPolicyC7A05455" + ] + }, + "SourceBucketDDD2130A": { + "Type": "AWS::S3::Bucket", + "Properties": { + "VersioningConfiguration": { + "Status": "Enabled" + } + } + }, + "MyBuildProjectRole6B7E2258": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codebuild.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "MyBuildProjectRoleDefaultPolicy5604AA87": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn", + ":", + { + "Ref": "AWS::Partition" + }, + ":", + "logs", + ":", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + "log-group", + ":", + { + "Fn::Join": [ + "", + [ + "/aws/codebuild/", + { + "Ref": "MyBuildProject30DB9D6E" + } + ] + ] + } + ] + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::Join": [ + "", + [ + "arn", + ":", + { + "Ref": "AWS::Partition" + }, + ":", + "logs", + ":", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + "log-group", + ":", + { + "Fn::Join": [ + "", + [ + "/aws/codebuild/", + { + "Ref": "MyBuildProject30DB9D6E" + } + ] + ] + } + ] + ] + }, + ":*" + ] + ] + } + ] + }, + { + "Action": [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + "s3:PutObject*", + "s3:DeleteObject*", + "s3:Abort*" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::GetAtt": [ + "PipelineArtifactsBucket22248F97", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "PipelineArtifactsBucket22248F97", + "Arn" + ] + }, + "/", + "*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "MyBuildProjectRoleDefaultPolicy5604AA87", + "Roles": [ + { + "Ref": "MyBuildProjectRole6B7E2258" + } + ] + } + }, + "MyBuildProject30DB9D6E": { + "Type": "AWS::CodeBuild::Project", + "Properties": { + "Artifacts": { + "Type": "CODEPIPELINE" + }, + "Environment": { + "ComputeType": "BUILD_GENERAL1_SMALL", + "Image": "aws/codebuild/ubuntu-base:14.04", + "PrivilegedMode": false, + "Type": "LINUX_CONTAINER" + }, + "ServiceRole": { + "Fn::GetAtt": [ + "MyBuildProjectRole6B7E2258", + "Arn" + ] + }, + "Source": { + "Type": "CODEPIPELINE" + } + } + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-s3-codepipeline/test/integ.pipeline-s3-code-build.ts b/packages/@aws-cdk/aws-s3-codepipeline/test/integ.pipeline-s3-code-build.ts new file mode 100644 index 0000000000000..6468b9d621bf9 --- /dev/null +++ b/packages/@aws-cdk/aws-s3-codepipeline/test/integ.pipeline-s3-code-build.ts @@ -0,0 +1,32 @@ +import codebuildPipeline = require('@aws-cdk/aws-codebuild-codepipeline'); +import codepipeline = require('@aws-cdk/aws-codepipeline'); +import s3 = require('@aws-cdk/aws-s3'); +import cdk = require('@aws-cdk/cdk'); +import s3Pipeline = require('../lib'); + +const app = new cdk.App(process.argv); + +const stack = new cdk.Stack(app, 'aws-cdk-codepipeline-s3-codebuild'); + +const pipeline = new codepipeline.Pipeline(stack, 'Pipeline'); + +const bucket = new s3.Bucket(stack, 'SourceBucket', { + versioned: true, +}); + +const sourceStage = new codepipeline.Stage(pipeline, 'Source'); +const source = new s3Pipeline.SourceAction(sourceStage, 'S3Source', { + artifactName: 'SourceArtifact', + bucket, + bucketKey: 'path/to/zip', +}); + +const buildStage = new codepipeline.Stage(pipeline, 'Build'); +const project = new codebuildPipeline.PipelineProject(stack, 'MyBuildProject'); + +new codebuildPipeline.PipelineBuildAction(buildStage, 'CodeBuild', { + project, + inputArtifact: source.artifact +}); + +process.stdout.write(app.run());