Skip to content

Commit 5dde0fe

Browse files
committed
feat(aws-codedeploy): Add a CodeDeploy CodePipeline deployment Action.
1 parent 39a3362 commit 5dde0fe

File tree

7 files changed

+465
-0
lines changed

7 files changed

+465
-0
lines changed

Diff for: packages/@aws-cdk/aws-codedeploy/lib/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1+
export * from './pipeline-action';
2+
13
// AWS::CodeDeploy CloudFormation Resources:
24
export * from './codedeploy.generated';
+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import actions = require('@aws-cdk/aws-codepipeline-api');
2+
import cdk = require('@aws-cdk/cdk');
3+
4+
/**
5+
* Construction properties of the {@link PipelineDeployAction CodeDeploy deploy CodePipeline Action}.
6+
*/
7+
export interface PipelineDeployActionProps extends actions.CommonActionProps {
8+
/**
9+
* The name of the CodeDeploy application to deploy to.
10+
*/
11+
application: string;
12+
13+
/**
14+
* The name of the CodeDeploy deployment group to deploy to.
15+
*/
16+
deploymentGroup: string;
17+
18+
/**
19+
* The source to use as input for deployment.
20+
*/
21+
inputArtifact: actions.Artifact;
22+
}
23+
24+
export class PipelineDeployAction extends actions.DeployAction {
25+
constructor(parent: cdk.Construct, id: string, props: PipelineDeployActionProps) {
26+
super(parent, id, {
27+
stage: props.stage,
28+
artifactBounds: { minInputs: 1, maxInputs: 1, minOutputs: 0, maxOutputs: 0 },
29+
provider: 'CodeDeploy',
30+
inputArtifact: props.inputArtifact,
31+
configuration: {
32+
ApplicationName: props.application,
33+
DeploymentGroupName: props.deploymentGroup,
34+
},
35+
});
36+
37+
// permissions, based on:
38+
// https://docs.aws.amazon.com/codedeploy/latest/userguide/auth-and-access-control-permissions-reference.html
39+
40+
const actionsOnApplicaiton = [
41+
'codedeploy:GetApplicationRevision',
42+
'codedeploy:RegisterApplicationRevision',
43+
];
44+
const applicationArn = cdk.Arn.fromComponents({
45+
service: 'codedeploy',
46+
resource: 'application',
47+
resourceName: props.application,
48+
sep: ':',
49+
});
50+
props.stage.pipelineRole.addToPolicy(new cdk.PolicyStatement()
51+
.addResource(applicationArn)
52+
.addActions(...actionsOnApplicaiton));
53+
54+
const actionsOnDeploymentGroup = [
55+
'codedeploy:CreateDeployment',
56+
'codedeploy:GetDeployment',
57+
];
58+
const deploymentGroupArn = cdk.Arn.fromComponents({
59+
service: 'codedeploy',
60+
resource: 'deploymentgroup',
61+
resourceName: `${props.application}/${props.deploymentGroup}`,
62+
sep: ':',
63+
});
64+
props.stage.pipelineRole.addToPolicy(new cdk.PolicyStatement()
65+
.addResource(deploymentGroupArn)
66+
.addActions(...actionsOnDeploymentGroup));
67+
68+
const actionsOnDeployConfig = [
69+
'codedeploy:GetDeploymentConfig',
70+
];
71+
const deployConfigArn = cdk.Arn.fromComponents({
72+
service: 'codedeploy',
73+
resource: 'deploymentconfig',
74+
resourceName: '*',
75+
sep: ':',
76+
});
77+
props.stage.pipelineRole.addToPolicy(new cdk.PolicyStatement()
78+
.addResource(deployConfigArn)
79+
.addActions(...actionsOnDeployConfig));
80+
}
81+
}

Diff for: packages/@aws-cdk/aws-codedeploy/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
"pkglint": "^0.8.2"
5353
},
5454
"dependencies": {
55+
"@aws-cdk/aws-codepipeline-api": "^0.8.2",
5556
"@aws-cdk/cdk": "^0.8.2"
5657
},
5758
"homepage": "https://github.com/awslabs/aws-cdk"

Diff for: packages/@aws-cdk/aws-codepipeline-api/lib/deploy-action.ts

+7
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import cdk = require('@aws-cdk/cdk');
22
import { Action, ActionArtifactBounds, ActionCategory, CommonActionProps } from "./action";
3+
import { Artifact } from './artifact';
34

45
export interface DeployActionProps extends CommonActionProps {
56
provider: string;
67

78
artifactBounds: ActionArtifactBounds;
89

10+
inputArtifact?: Artifact;
11+
912
configuration?: any;
1013
}
1114

@@ -18,5 +21,9 @@ export abstract class DeployAction extends Action {
1821
artifactBounds: props.artifactBounds,
1922
configuration: props.configuration,
2023
});
24+
25+
if (props.inputArtifact) {
26+
this.addInputArtifact(props.inputArtifact);
27+
}
2128
}
2229
}

Diff for: packages/@aws-cdk/aws-codepipeline/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
"@aws-cdk/aws-cloudformation": "^0.8.2",
5757
"@aws-cdk/aws-codebuild": "^0.8.2",
5858
"@aws-cdk/aws-codecommit": "^0.8.2",
59+
"@aws-cdk/aws-codedeploy": "^0.8.2",
5960
"@aws-cdk/aws-lambda": "^0.8.2",
6061
"@aws-cdk/aws-sns": "^0.8.2",
6162
"cdk-build-tools": "^0.8.2",

0 commit comments

Comments
 (0)