-
Notifications
You must be signed in to change notification settings - Fork 120
/
deploy.ts
100 lines (84 loc) · 2.32 KB
/
deploy.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import * as core from '@actions/core';
import * as aws from 'aws-sdk';
import { CreateChangeSetInput, CreateStackInput } from './main';
export type Stack = aws.CloudFormation.Stack;
export async function updateStack(
cfn: aws.CloudFormation,
stack: Stack,
params: CreateChangeSetInput,
noEmptyChangeSet: boolean
): Promise<string | undefined> {
core.debug('Creating CloudFormation Change Set');
await cfn.createChangeSet(params).promise();
const changeSetStatus = await cfn
.describeChangeSet({
ChangeSetName: params.ChangeSetName,
StackName: params.StackName
})
.promise();
if (changeSetStatus.Status === 'FAILED') {
core.debug('Deleting failed Change Set');
await cfn
.deleteChangeSet({
ChangeSetName: params.ChangeSetName,
StackName: params.StackName
})
.promise();
if (
noEmptyChangeSet &&
changeSetStatus.StatusReason?.includes(
"The submitted information didn't contain changes"
)
) {
return stack.StackId;
}
throw new Error(
`Failed to create Change Set: ${changeSetStatus.StatusReason}`
);
}
core.debug('Executing CloudFormation Change Set');
await cfn
.waitFor('changeSetCreateComplete', {
ChangeSetName: params.ChangeSetName,
StackName: params.StackName
})
.promise();
await cfn
.executeChangeSet({
ChangeSetName: params.ChangeSetName,
StackName: params.StackName
})
.promise();
core.debug('Updating CloudFormation Stack');
await cfn
.waitFor('stackUpdateComplete', { StackName: stack.StackId })
.promise();
return stack.StackId;
}
export async function deployStack(
cfn: aws.CloudFormation,
params: CreateStackInput,
noEmptyChangeSet: boolean
): Promise<string | undefined> {
const stacks = await cfn.describeStacks().promise();
const stack = stacks['Stacks']?.find(
stack => stack.StackName === params.StackName
);
if (!stack) {
core.debug(`Creating CloudFormation Stack`);
const stack = await cfn.createStack(params).promise();
await cfn
.waitFor('stackCreateComplete', { StackName: params.StackName })
.promise();
return stack.StackId;
}
return await updateStack(
cfn,
stack,
{
...params,
ChangeSetName: `${params.StackName}-CS`
},
noEmptyChangeSet
);
}