Refactor state and steps out of cloud-runner main class
parent
11fd1dccbf
commit
c664a315c1
|
|
@ -440,61 +440,62 @@ 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}`;
|
|
||||||
}
|
|
||||||
if (!secret.ParameterValue || secret.ParameterValue === '') {
|
|
||||||
secrets = secrets.filter((x) => x !== secret);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
taskDefCloudFormation = this.insertAtTemplate(taskDefCloudFormation, 'p1 - input', this.getParameterTemplate(secret.ParameterKey.replace(/[^\dA-Za-z]/g, '')));
|
|
||||||
taskDefCloudFormation = this.insertAtTemplate(taskDefCloudFormation, 'p2 - secret', this.getSecretTemplate(secret.ParameterKey.replace(/[^\dA-Za-z]/g, '')));
|
|
||||||
taskDefCloudFormation = this.insertAtTemplate(taskDefCloudFormation, 'p3 - container def', this.getSecretDefinitionTemplate(secret.EnvironmentVariable, secret.ParameterKey.replace(/[^\dA-Za-z]/g, '')));
|
|
||||||
}
|
}
|
||||||
const secretsMappedToCloudFormationParameters = secrets.map((x) => {
|
if (!secret.ParameterValue || secret.ParameterValue === '') {
|
||||||
return { ParameterKey: x.ParameterKey.replace(/[^\dA-Za-z]/g, ''), ParameterValue: x.ParameterValue };
|
secrets = secrets.filter((x) => x !== secret);
|
||||||
});
|
continue;
|
||||||
|
}
|
||||||
|
taskDefCloudFormation = this.insertAtTemplate(taskDefCloudFormation, 'p1 - input', this.getParameterTemplate(secret.ParameterKey.replace(/[^\dA-Za-z]/g, '')));
|
||||||
|
taskDefCloudFormation = this.insertAtTemplate(taskDefCloudFormation, 'p2 - secret', this.getSecretTemplate(secret.ParameterKey.replace(/[^\dA-Za-z]/g, '')));
|
||||||
|
taskDefCloudFormation = this.insertAtTemplate(taskDefCloudFormation, 'p3 - container def', this.getSecretDefinitionTemplate(secret.EnvironmentVariable, secret.ParameterKey.replace(/[^\dA-Za-z]/g, '')));
|
||||||
|
}
|
||||||
|
const secretsMappedToCloudFormationParameters = secrets.map((x) => {
|
||||||
|
return { ParameterKey: x.ParameterKey.replace(/[^\dA-Za-z]/g, ''), ParameterValue: x.ParameterValue };
|
||||||
|
});
|
||||||
|
const parameters = [
|
||||||
|
{
|
||||||
|
ParameterKey: 'EnvironmentName',
|
||||||
|
ParameterValue: this.baseStackName,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ParameterKey: 'ImageUrl',
|
||||||
|
ParameterValue: image,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ParameterKey: 'ServiceName',
|
||||||
|
ParameterValue: taskDefStackName,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ParameterKey: 'Command',
|
||||||
|
ParameterValue: 'echo "this template should be overwritten when running a task"',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ParameterKey: 'EntryPoint',
|
||||||
|
ParameterValue: entrypoint.join(','),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ParameterKey: 'WorkingDirectory',
|
||||||
|
ParameterValue: workingdir,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ParameterKey: 'EFSMountDirectory',
|
||||||
|
ParameterValue: mountdir,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ParameterKey: 'BUILDID',
|
||||||
|
ParameterValue: buildGuid,
|
||||||
|
},
|
||||||
|
...secretsMappedToCloudFormationParameters,
|
||||||
|
];
|
||||||
|
try {
|
||||||
yield CF.createStack({
|
yield CF.createStack({
|
||||||
StackName: taskDefStackName,
|
StackName: taskDefStackName,
|
||||||
TemplateBody: taskDefCloudFormation,
|
TemplateBody: taskDefCloudFormation,
|
||||||
Capabilities: ['CAPABILITY_IAM'],
|
Capabilities: ['CAPABILITY_IAM'],
|
||||||
Parameters: [
|
Parameters: parameters,
|
||||||
{
|
|
||||||
ParameterKey: 'EnvironmentName',
|
|
||||||
ParameterValue: this.baseStackName,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ParameterKey: 'ImageUrl',
|
|
||||||
ParameterValue: image,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ParameterKey: 'ServiceName',
|
|
||||||
ParameterValue: taskDefStackName,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ParameterKey: 'Command',
|
|
||||||
ParameterValue: 'echo "this template should be overwritten when running a task"',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ParameterKey: 'EntryPoint',
|
|
||||||
ParameterValue: entrypoint.join(','),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ParameterKey: 'WorkingDirectory',
|
|
||||||
ParameterValue: workingdir,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ParameterKey: 'EFSMountDirectory',
|
|
||||||
ParameterValue: mountdir,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ParameterKey: 'BUILDID',
|
|
||||||
ParameterValue: buildGuid,
|
|
||||||
},
|
|
||||||
...secretsMappedToCloudFormationParameters,
|
|
||||||
],
|
|
||||||
}).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;
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1 @@
|
||||||
|
export class AWSBaseStack {}
|
||||||
|
|
@ -128,74 +128,75 @@ 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}`;
|
|
||||||
}
|
|
||||||
if (!secret.ParameterValue || secret.ParameterValue === '') {
|
|
||||||
secrets = secrets.filter((x) => x !== secret);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
taskDefCloudFormation = this.insertAtTemplate(
|
|
||||||
taskDefCloudFormation,
|
|
||||||
'p1 - input',
|
|
||||||
this.getParameterTemplate(secret.ParameterKey.replace(/[^\dA-Za-z]/g, '')),
|
|
||||||
);
|
|
||||||
taskDefCloudFormation = this.insertAtTemplate(
|
|
||||||
taskDefCloudFormation,
|
|
||||||
'p2 - secret',
|
|
||||||
this.getSecretTemplate(secret.ParameterKey.replace(/[^\dA-Za-z]/g, '')),
|
|
||||||
);
|
|
||||||
taskDefCloudFormation = this.insertAtTemplate(
|
|
||||||
taskDefCloudFormation,
|
|
||||||
'p3 - container def',
|
|
||||||
this.getSecretDefinitionTemplate(secret.EnvironmentVariable, secret.ParameterKey.replace(/[^\dA-Za-z]/g, '')),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
const secretsMappedToCloudFormationParameters = secrets.map((x) => {
|
if (!secret.ParameterValue || secret.ParameterValue === '') {
|
||||||
return { ParameterKey: x.ParameterKey.replace(/[^\dA-Za-z]/g, ''), ParameterValue: x.ParameterValue };
|
secrets = secrets.filter((x) => x !== secret);
|
||||||
});
|
continue;
|
||||||
|
}
|
||||||
|
taskDefCloudFormation = this.insertAtTemplate(
|
||||||
|
taskDefCloudFormation,
|
||||||
|
'p1 - input',
|
||||||
|
this.getParameterTemplate(secret.ParameterKey.replace(/[^\dA-Za-z]/g, '')),
|
||||||
|
);
|
||||||
|
taskDefCloudFormation = this.insertAtTemplate(
|
||||||
|
taskDefCloudFormation,
|
||||||
|
'p2 - secret',
|
||||||
|
this.getSecretTemplate(secret.ParameterKey.replace(/[^\dA-Za-z]/g, '')),
|
||||||
|
);
|
||||||
|
taskDefCloudFormation = this.insertAtTemplate(
|
||||||
|
taskDefCloudFormation,
|
||||||
|
'p3 - container def',
|
||||||
|
this.getSecretDefinitionTemplate(secret.EnvironmentVariable, secret.ParameterKey.replace(/[^\dA-Za-z]/g, '')),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const secretsMappedToCloudFormationParameters = secrets.map((x) => {
|
||||||
|
return { ParameterKey: x.ParameterKey.replace(/[^\dA-Za-z]/g, ''), ParameterValue: x.ParameterValue };
|
||||||
|
});
|
||||||
|
const parameters = [
|
||||||
|
{
|
||||||
|
ParameterKey: 'EnvironmentName',
|
||||||
|
ParameterValue: this.baseStackName,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ParameterKey: 'ImageUrl',
|
||||||
|
ParameterValue: image,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ParameterKey: 'ServiceName',
|
||||||
|
ParameterValue: taskDefStackName,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ParameterKey: 'Command',
|
||||||
|
ParameterValue: 'echo "this template should be overwritten when running a task"',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ParameterKey: 'EntryPoint',
|
||||||
|
ParameterValue: entrypoint.join(','),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ParameterKey: 'WorkingDirectory',
|
||||||
|
ParameterValue: workingdir,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ParameterKey: 'EFSMountDirectory',
|
||||||
|
ParameterValue: mountdir,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ParameterKey: 'BUILDID',
|
||||||
|
ParameterValue: buildGuid,
|
||||||
|
},
|
||||||
|
...secretsMappedToCloudFormationParameters,
|
||||||
|
];
|
||||||
|
|
||||||
|
try {
|
||||||
await CF.createStack({
|
await CF.createStack({
|
||||||
StackName: taskDefStackName,
|
StackName: taskDefStackName,
|
||||||
TemplateBody: taskDefCloudFormation,
|
TemplateBody: taskDefCloudFormation,
|
||||||
Capabilities: ['CAPABILITY_IAM'],
|
Capabilities: ['CAPABILITY_IAM'],
|
||||||
Parameters: [
|
Parameters: parameters,
|
||||||
{
|
|
||||||
ParameterKey: 'EnvironmentName',
|
|
||||||
ParameterValue: this.baseStackName,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ParameterKey: 'ImageUrl',
|
|
||||||
ParameterValue: image,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ParameterKey: 'ServiceName',
|
|
||||||
ParameterValue: taskDefStackName,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ParameterKey: 'Command',
|
|
||||||
ParameterValue: 'echo "this template should be overwritten when running a task"',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ParameterKey: 'EntryPoint',
|
|
||||||
ParameterValue: entrypoint.join(','),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ParameterKey: 'WorkingDirectory',
|
|
||||||
ParameterValue: workingdir,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ParameterKey: 'EFSMountDirectory',
|
|
||||||
ParameterValue: mountdir,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ParameterKey: 'BUILDID',
|
|
||||||
ParameterValue: buildGuid,
|
|
||||||
},
|
|
||||||
...secretsMappedToCloudFormationParameters,
|
|
||||||
],
|
|
||||||
}).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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue