Refactor state and steps out of cloud-runner main class

pull/310/head
Frostebite 2021-10-04 23:44:05 +01:00
parent 11fd1dccbf
commit c664a315c1
4 changed files with 133 additions and 120 deletions

25
dist/index.js vendored
View File

@ -440,7 +440,6 @@ class AWSBuildEnvironment {
let taskDefCloudFormation = this.readTaskCloudFormationTemplate(); let taskDefCloudFormation = this.readTaskCloudFormationTemplate();
const cleanupTaskDefStackName = `${taskDefStackName}-cleanup`; const cleanupTaskDefStackName = `${taskDefStackName}-cleanup`;
const cleanupCloudFormation = fs.readFileSync(`${__dirname}/cloud-formations/cloudformation-stack-ttl.yml`, 'utf8'); const cleanupCloudFormation = fs.readFileSync(`${__dirname}/cloud-formations/cloudformation-stack-ttl.yml`, 'utf8');
try {
for (const secret of secrets) { for (const secret of secrets) {
if (typeof secret.ParameterValue == 'number') { if (typeof secret.ParameterValue == 'number') {
secret.ParameterValue = `${secret.ParameterValue}`; secret.ParameterValue = `${secret.ParameterValue}`;
@ -456,11 +455,7 @@ class AWSBuildEnvironment {
const secretsMappedToCloudFormationParameters = secrets.map((x) => { const secretsMappedToCloudFormationParameters = secrets.map((x) => {
return { ParameterKey: x.ParameterKey.replace(/[^\dA-Za-z]/g, ''), ParameterValue: x.ParameterValue }; return { ParameterKey: x.ParameterKey.replace(/[^\dA-Za-z]/g, ''), ParameterValue: x.ParameterValue };
}); });
yield CF.createStack({ const parameters = [
StackName: taskDefStackName,
TemplateBody: taskDefCloudFormation,
Capabilities: ['CAPABILITY_IAM'],
Parameters: [
{ {
ParameterKey: 'EnvironmentName', ParameterKey: 'EnvironmentName',
ParameterValue: this.baseStackName, ParameterValue: this.baseStackName,
@ -494,7 +489,13 @@ class AWSBuildEnvironment {
ParameterValue: buildGuid, ParameterValue: buildGuid,
}, },
...secretsMappedToCloudFormationParameters, ...secretsMappedToCloudFormationParameters,
], ];
try {
yield CF.createStack({
StackName: taskDefStackName,
TemplateBody: taskDefCloudFormation,
Capabilities: ['CAPABILITY_IAM'],
Parameters: parameters,
}).promise(); }).promise();
cloud_runner_logger_1.default.log('Creating cloud runner job'); cloud_runner_logger_1.default.log('Creating cloud runner job');
yield CF.createStack({ yield CF.createStack({
@ -524,11 +525,10 @@ class AWSBuildEnvironment {
}, },
], ],
}).promise(); }).promise();
// Side effect: CloudRunnerLogger.log('Creating cleanup double checker cron job...');
yield CF.waitFor('stackCreateComplete', { StackName: taskDefStackName }).promise(); yield CF.waitFor('stackCreateComplete', { StackName: taskDefStackName }).promise();
} }
catch (error) { catch (error) {
yield this.handleStackCreationFailure(error, CF, taskDefStackName, taskDefCloudFormation, secrets); yield this.handleStackCreationFailure(error, CF, taskDefStackName, taskDefCloudFormation, parameters, secrets);
throw error; throw error;
} }
const taskDefResources = (yield CF.describeStackResources({ const taskDefResources = (yield CF.describeStackResources({
@ -625,10 +625,15 @@ class AWSBuildEnvironment {
} }
}); });
} }
handleStackCreationFailure(error, CF, taskDefStackName, taskDefCloudFormation, secrets) { handleStackCreationFailure(error, CF, taskDefStackName, taskDefCloudFormation, parameters, secrets) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
cloud_runner_logger_1.default.log('aws stack parameters: ');
cloud_runner_logger_1.default.log(JSON.stringify(parameters, undefined, 4));
cloud_runner_logger_1.default.log('aws stack secrets: ');
cloud_runner_logger_1.default.log(JSON.stringify(secrets, undefined, 4)); cloud_runner_logger_1.default.log(JSON.stringify(secrets, undefined, 4));
cloud_runner_logger_1.default.log('aws stack: ');
cloud_runner_logger_1.default.log(taskDefCloudFormation); cloud_runner_logger_1.default.log(taskDefCloudFormation);
cloud_runner_logger_1.default.log('aws error: ');
core.error(error); core.error(error);
cloud_runner_logger_1.default.log('Getting events and resources for task stack'); cloud_runner_logger_1.default.log('Getting events and resources for task stack');
const events = (yield CF.describeStackEvents({ StackName: taskDefStackName }).promise()).StackEvents; const events = (yield CF.describeStackEvents({ StackName: taskDefStackName }).promise()).StackEvents;

2
dist/index.js.map vendored

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
export class AWSBaseStack {}

View File

@ -128,7 +128,6 @@ class AWSBuildEnvironment implements CloudRunnerProviderInterface {
const cleanupTaskDefStackName = `${taskDefStackName}-cleanup`; const cleanupTaskDefStackName = `${taskDefStackName}-cleanup`;
const cleanupCloudFormation = fs.readFileSync(`${__dirname}/cloud-formations/cloudformation-stack-ttl.yml`, 'utf8'); const cleanupCloudFormation = fs.readFileSync(`${__dirname}/cloud-formations/cloudformation-stack-ttl.yml`, 'utf8');
try {
for (const secret of secrets) { for (const secret of secrets) {
if (typeof secret.ParameterValue == 'number') { if (typeof secret.ParameterValue == 'number') {
secret.ParameterValue = `${secret.ParameterValue}`; secret.ParameterValue = `${secret.ParameterValue}`;
@ -156,12 +155,7 @@ class AWSBuildEnvironment implements CloudRunnerProviderInterface {
const secretsMappedToCloudFormationParameters = secrets.map((x) => { const secretsMappedToCloudFormationParameters = secrets.map((x) => {
return { ParameterKey: x.ParameterKey.replace(/[^\dA-Za-z]/g, ''), ParameterValue: x.ParameterValue }; return { ParameterKey: x.ParameterKey.replace(/[^\dA-Za-z]/g, ''), ParameterValue: x.ParameterValue };
}); });
const parameters = [
await CF.createStack({
StackName: taskDefStackName,
TemplateBody: taskDefCloudFormation,
Capabilities: ['CAPABILITY_IAM'],
Parameters: [
{ {
ParameterKey: 'EnvironmentName', ParameterKey: 'EnvironmentName',
ParameterValue: this.baseStackName, ParameterValue: this.baseStackName,
@ -195,7 +189,14 @@ class AWSBuildEnvironment implements CloudRunnerProviderInterface {
ParameterValue: buildGuid, ParameterValue: buildGuid,
}, },
...secretsMappedToCloudFormationParameters, ...secretsMappedToCloudFormationParameters,
], ];
try {
await CF.createStack({
StackName: taskDefStackName,
TemplateBody: taskDefCloudFormation,
Capabilities: ['CAPABILITY_IAM'],
Parameters: parameters,
}).promise(); }).promise();
CloudRunnerLogger.log('Creating cloud runner job'); CloudRunnerLogger.log('Creating cloud runner job');
await CF.createStack({ await CF.createStack({
@ -225,12 +226,9 @@ class AWSBuildEnvironment implements CloudRunnerProviderInterface {
}, },
], ],
}).promise(); }).promise();
// Side effect: CloudRunnerLogger.log('Creating cleanup double checker cron job...');
await CF.waitFor('stackCreateComplete', { StackName: taskDefStackName }).promise(); await CF.waitFor('stackCreateComplete', { StackName: taskDefStackName }).promise();
} catch (error) { } catch (error) {
await this.handleStackCreationFailure(error, CF, taskDefStackName, taskDefCloudFormation, secrets); await this.handleStackCreationFailure(error, CF, taskDefStackName, taskDefCloudFormation, parameters, secrets);
throw error; throw error;
} }
@ -342,10 +340,19 @@ class AWSBuildEnvironment implements CloudRunnerProviderInterface {
CF: SDK.CloudFormation, CF: SDK.CloudFormation,
taskDefStackName: string, taskDefStackName: string,
taskDefCloudFormation: string, taskDefCloudFormation: string,
parameters: any[],
secrets: CloudRunnerSecret[], secrets: CloudRunnerSecret[],
) { ) {
CloudRunnerLogger.log('aws stack parameters: ');
CloudRunnerLogger.log(JSON.stringify(parameters, undefined, 4));
CloudRunnerLogger.log('aws stack secrets: ');
CloudRunnerLogger.log(JSON.stringify(secrets, undefined, 4)); CloudRunnerLogger.log(JSON.stringify(secrets, undefined, 4));
CloudRunnerLogger.log('aws stack: ');
CloudRunnerLogger.log(taskDefCloudFormation); CloudRunnerLogger.log(taskDefCloudFormation);
CloudRunnerLogger.log('aws error: ');
core.error(error); core.error(error);
CloudRunnerLogger.log('Getting events and resources for task stack'); CloudRunnerLogger.log('Getting events and resources for task stack');
const events = (await CF.describeStackEvents({ StackName: taskDefStackName }).promise()).StackEvents; const events = (await CF.describeStackEvents({ StackName: taskDefStackName }).promise()).StackEvents;