unity-builder/src/model/cloud-runner/aws/aws-build-platform.ts

101 lines
3.6 KiB
TypeScript
Raw Normal View History

import * as SDK from 'aws-sdk';
import CloudRunnerSecret from '../services/cloud-runner-secret';
import CloudRunnerEnvironmentVariable from '../services/cloud-runner-environment-variable';
import CloudRunnerTaskDef from '../services/cloud-runner-task-def';
import AWSBuildRunner from './aws-build-runner';
import { CloudRunnerProviderInterface } from '../services/cloud-runner-provider-interface';
2021-09-22 20:05:21 +00:00
import BuildParameters from '../../build-parameters';
import CloudRunnerLogger from '../services/cloud-runner-logger';
import { AWSJobStack } from './aws-job-stack';
2021-08-17 20:09:42 +00:00
class AWSBuildEnvironment implements CloudRunnerProviderInterface {
2021-08-13 19:59:01 +00:00
private baseStackName: string;
constructor(buildParameters: BuildParameters) {
2021-08-13 19:59:01 +00:00
this.baseStackName = buildParameters.awsBaseStackName;
}
2021-11-28 17:08:37 +00:00
async cleanupSharedBuildResources(
// eslint-disable-next-line no-unused-vars
buildGuid: string,
// eslint-disable-next-line no-unused-vars
buildParameters: BuildParameters,
// eslint-disable-next-line no-unused-vars
branchName: string,
// eslint-disable-next-line no-unused-vars
defaultSecretsArray: { ParameterKey: string; EnvironmentVariable: string; ParameterValue: string }[],
) {}
2021-11-28 17:08:37 +00:00
async setupSharedBuildResources(
// eslint-disable-next-line no-unused-vars
buildGuid: string,
// eslint-disable-next-line no-unused-vars
buildParameters: BuildParameters,
// eslint-disable-next-line no-unused-vars
branchName: string,
// eslint-disable-next-line no-unused-vars
defaultSecretsArray: { ParameterKey: string; EnvironmentVariable: string; ParameterValue: string }[],
) {}
2021-06-19 04:49:32 +00:00
async runBuildTask(
buildId: string,
image: string,
commands: string[],
mountdir: string,
workingdir: string,
2021-08-17 22:13:46 +00:00
environment: CloudRunnerEnvironmentVariable[],
secrets: CloudRunnerSecret[],
): Promise<void> {
const ECS = new SDK.ECS();
const CF = new SDK.CloudFormation();
const entrypoint = ['/bin/sh'];
const t0 = Date.now();
const taskDef = await new AWSJobStack(this.baseStackName).setupCloudFormations(
CF,
buildId,
image,
entrypoint,
commands,
mountdir,
workingdir,
secrets,
);
let t2;
try {
const t1 = Date.now();
2021-09-21 18:27:04 +00:00
CloudRunnerLogger.log(`Setup job time: ${Math.floor((t1 - t0) / 1000)}s`);
await AWSBuildRunner.runTask(taskDef, ECS, CF, environment, buildId, commands);
t2 = Date.now();
2021-09-21 18:27:04 +00:00
CloudRunnerLogger.log(`Run job time: ${Math.floor((t2 - t1) / 1000)}s`);
} finally {
await this.cleanupResources(CF, taskDef);
const t3 = Date.now();
2021-09-21 18:27:04 +00:00
if (t2 !== undefined) CloudRunnerLogger.log(`Cleanup job time: ${Math.floor((t3 - t2) / 1000)}s`);
}
}
2021-08-17 20:09:42 +00:00
async cleanupResources(CF: SDK.CloudFormation, taskDef: CloudRunnerTaskDef) {
2021-09-21 18:27:04 +00:00
CloudRunnerLogger.log('Cleanup starting');
await CF.deleteStack({
StackName: taskDef.taskDefStackName,
}).promise();
await CF.deleteStack({
StackName: taskDef.taskDefStackNameTTL,
}).promise();
await CF.waitFor('stackDeleteComplete', {
StackName: taskDef.taskDefStackName,
}).promise();
await CF.waitFor('stackDeleteComplete', {
StackName: taskDef.taskDefStackNameTTL,
}).promise();
2021-09-15 03:20:04 +00:00
const stacks = (await CF.listStacks().promise()).StackSummaries?.filter((x) => x.StackStatus !== 'DELETE_COMPLETE');
2021-09-21 18:27:04 +00:00
CloudRunnerLogger.log(`Deleted Stacks: ${taskDef.taskDefStackName}, ${taskDef.taskDefStackNameTTL}`);
CloudRunnerLogger.log(`Stacks: ${JSON.stringify(stacks, undefined, 4)}`);
2021-09-15 03:20:04 +00:00
2021-09-21 18:27:04 +00:00
CloudRunnerLogger.log('Cleanup complete');
}
}
export default AWSBuildEnvironment;