unity-builder/src/model/aws.ts

598 lines
19 KiB
TypeScript
Raw Normal View History

2021-03-27 22:34:09 +00:00
import * as SDK from 'aws-sdk';
2021-04-07 19:45:21 +00:00
import { customAlphabet, nanoid } from 'nanoid';
2021-03-27 22:45:16 +00:00
import * as fs from 'fs';
import * as core from '@actions/core';
import * as zlib from 'zlib';
2021-04-03 20:48:04 +00:00
const alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
2021-04-04 01:02:52 +00:00
const repositoryDirectoryName = 'repo';
const efsDirectoryName = 'data';
const cacheDirectoryName = 'cache';
2021-03-27 22:34:09 +00:00
class AWS {
static async runBuildJob(buildParameters, baseImage) {
2021-03-28 23:17:18 +00:00
try {
2021-04-03 20:48:04 +00:00
const nanoid = customAlphabet(alphabet, 9);
2021-04-05 13:23:27 +00:00
const buildUid = `${process.env.GITHUB_RUN_NUMBER}-${buildParameters.platform
2021-04-03 21:05:52 +00:00
.replace('Standalone', '')
2021-04-05 13:23:27 +00:00
.replace('standalone', '')}-${nanoid()}`;
2021-04-03 01:14:24 +00:00
const branchName = process.env.GITHUB_REF?.split('/').reverse()[0];
2021-04-03 15:45:34 +00:00
2021-04-03 14:32:54 +00:00
core.info('Starting part 1/4 (clone from github and restore cache)');
2021-03-28 23:17:18 +00:00
await this.run(
buildUid,
buildParameters.awsStackName,
'alpine/git',
['/bin/sh'],
[
'-c',
`apk update;
2021-04-04 01:02:52 +00:00
apk add unzip;
apk add git-lfs;
apk add jq;
2021-04-03 12:37:40 +00:00
2021-04-04 01:02:52 +00:00
# Get source repo for project to be built and game-ci repo for utilties
git clone https://${process.env.GITHUB_TOKEN}@github.com/${process.env.GITHUB_REPOSITORY}.git ${buildUid}/${repositoryDirectoryName} -q
git clone https://${process.env.GITHUB_TOKEN}@github.com/game-ci/unity-builder.git ${buildUid}/builder -q
cd /${efsDirectoryName}/${buildUid}/${repositoryDirectoryName}/
git checkout $GITHUB_SHA
cd /${efsDirectoryName}/
# Look for usable cache
2021-04-05 13:08:06 +00:00
if [ ! -d ${cacheDirectoryName} ]; then
mkdir ${cacheDirectoryName}
2021-04-04 01:02:52 +00:00
fi
2021-04-05 13:08:06 +00:00
cd ${cacheDirectoryName}
2021-04-04 01:02:52 +00:00
if [ ! -d "${branchName}" ]; then
mkdir "${branchName}"
fi
cd "${branchName}"
echo ' '
echo 'Cached Libraries for ${branchName} from previous builds:'
ls
echo ' '
2021-04-03 12:50:49 +00:00
2021-04-04 16:26:20 +00:00
# if library directory doesn't exist create it,
2021-04-04 16:21:31 +00:00
if [ ! -d "/${efsDirectoryName}/${buildUid}/${repositoryDirectoryName}/${buildParameters.projectPath}/Library" ]; then
2021-04-07 19:36:25 +00:00
echo 'Creating Library folder'
2021-04-04 16:31:40 +00:00
mkdir "/${efsDirectoryName}/${buildUid}/${repositoryDirectoryName}/${buildParameters.projectPath}/Library"
2021-04-04 16:21:31 +00:00
else
2021-04-04 16:26:20 +00:00
echo 'Library folder already present, make sure you setup .gitignore correctly (cleaning out Library folder for this build)!'
2021-04-04 16:31:40 +00:00
rm -r "/${efsDirectoryName}/${buildUid}/${repositoryDirectoryName}/${buildParameters.projectPath}/Library/*"
2021-04-04 16:21:31 +00:00
fi
2021-04-03 12:50:49 +00:00
2021-04-04 01:02:52 +00:00
# Restore cache
latest=$(ls -t | head -1)
2021-04-07 19:36:25 +00:00
if [ ! -z "$latest" ]; then
2021-04-04 01:02:52 +00:00
echo "Library cache exists from build $latest from ${branchName}"
unzip -q "$latest" -d /${efsDirectoryName}/${buildUid}/${repositoryDirectoryName}/${buildParameters.projectPath}/Library/.
else
echo "Cache does not exist"
fi
2021-04-03 00:16:56 +00:00
2021-04-04 01:02:52 +00:00
# Print out important directories
2021-04-03 19:59:01 +00:00
echo ' '
echo 'Repo:'
2021-04-04 01:02:52 +00:00
ls /${efsDirectoryName}/${buildUid}/${repositoryDirectoryName}/
2021-04-03 19:59:01 +00:00
echo ' '
echo 'Project:'
2021-04-04 01:02:52 +00:00
ls /${efsDirectoryName}/${buildUid}/${repositoryDirectoryName}/${buildParameters.projectPath}
2021-04-03 19:59:01 +00:00
echo ' '
echo 'Library:'
2021-04-04 01:02:52 +00:00
ls /${efsDirectoryName}/${buildUid}/${repositoryDirectoryName}/${buildParameters.projectPath}/Library/
2021-04-03 19:59:01 +00:00
echo ' '
2021-03-28 23:17:18 +00:00
`,
],
2021-04-04 01:02:52 +00:00
`/${efsDirectoryName}`,
`/${efsDirectoryName}/`,
2021-03-28 23:17:18 +00:00
[
{
name: 'GITHUB_SHA',
value: process.env.GITHUB_SHA,
},
],
[
{
ParameterKey: 'GithubToken',
ParameterValue: buildParameters.githubToken,
},
],
);
2021-04-03 00:32:25 +00:00
2021-04-03 14:32:54 +00:00
core.info('Starting part 2/4 (build unity project)');
2021-03-28 23:17:18 +00:00
await this.run(
buildUid,
buildParameters.awsStackName,
baseImage.toString(),
['/bin/sh'],
[
'-c',
`
2021-04-04 01:02:52 +00:00
cp -r /${efsDirectoryName}/${buildUid}/builder/dist/default-build-script/ /UnityBuilderAction;
cp -r /${efsDirectoryName}/${buildUid}/builder/dist/entrypoint.sh /entrypoint.sh;
cp -r /${efsDirectoryName}/${buildUid}/builder/dist/steps/ /steps;
chmod -R +x /entrypoint.sh;
chmod -R +x /steps;
/entrypoint.sh;
2021-04-03 01:34:47 +00:00
`,
2021-03-28 23:17:18 +00:00
],
2021-04-04 01:02:52 +00:00
`/${efsDirectoryName}`,
`/${efsDirectoryName}/${buildUid}/${repositoryDirectoryName}/`,
2021-03-28 23:17:18 +00:00
[
{
name: 'GITHUB_WORKSPACE',
2021-04-04 01:02:52 +00:00
value: `/${efsDirectoryName}/${buildUid}/${repositoryDirectoryName}/`,
2021-03-28 23:17:18 +00:00
},
{
name: 'PROJECT_PATH',
value: buildParameters.projectPath,
},
{
name: 'BUILD_PATH',
value: buildParameters.buildPath,
},
{
name: 'BUILD_FILE',
value: buildParameters.buildFile,
},
{
name: 'BUILD_NAME',
value: buildParameters.buildName,
},
{
name: 'BUILD_METHOD',
value: buildParameters.buildMethod,
},
{
name: 'CUSTOM_PARAMETERS',
value: buildParameters.customParameters,
},
{
name: 'BUILD_TARGET',
value: buildParameters.platform,
},
{
name: 'ANDROID_VERSION_CODE',
value: buildParameters.androidVersionCode.toString(),
},
{
name: 'ANDROID_KEYSTORE_NAME',
value: buildParameters.androidKeystoreName,
},
{
name: 'ANDROID_KEYALIAS_NAME',
value: buildParameters.androidKeyaliasName,
},
],
[
{
ParameterKey: 'GithubToken',
ParameterValue: buildParameters.githubToken,
},
{
ParameterKey: 'UnityLicense',
ParameterValue: process.env.UNITY_LICENSE ? process.env.UNITY_LICENSE : '0',
},
{
ParameterKey: 'UnityEmail',
ParameterValue: process.env.UNITY_EMAIL ? process.env.UNITY_EMAIL : '0',
},
{
ParameterKey: 'UnityPassword',
ParameterValue: process.env.UNITY_PASSWORD ? process.env.UNITY_PASSWORD : '0',
},
{
ParameterKey: 'UnitySerial',
ParameterValue: process.env.UNITY_SERIAL ? process.env.UNITY_SERIAL : '0',
},
{
ParameterKey: 'AndroidKeystoreBase64',
ParameterValue: buildParameters.androidKeystoreBase64 ? buildParameters.androidKeystoreBase64 : '0',
},
{
ParameterKey: 'AndroidKeystorePass',
ParameterValue: buildParameters.androidKeystorePass ? buildParameters.androidKeystorePass : '0',
},
{
ParameterKey: 'AndroidKeyAliasPass',
ParameterValue: buildParameters.androidKeyaliasPass ? buildParameters.androidKeyaliasPass : '0',
},
],
);
2021-04-03 14:32:54 +00:00
core.info('Starting part 3/4 (zip unity build and Library for caching)');
2021-03-28 23:17:18 +00:00
// Cleanup
await this.run(
buildUid,
buildParameters.awsStackName,
'alpine',
['/bin/sh'],
[
'-c',
`
2021-04-03 19:16:22 +00:00
apk update
apk add zip
2021-04-03 21:35:00 +00:00
cd Library
zip -q -r lib-${buildUid}.zip .*
2021-04-04 01:02:52 +00:00
mv lib-${buildUid}.zip /${efsDirectoryName}/${cacheDirectoryName}/${branchName}/lib-${buildUid}.zip
2021-04-03 21:35:00 +00:00
cd ../../
2021-04-03 19:37:34 +00:00
zip -q -r build-${buildUid}.zip ${buildParameters.buildPath}/*
2021-04-04 01:02:52 +00:00
mv build-${buildUid}.zip /${efsDirectoryName}/${buildUid}/build-${buildUid}.zip
2021-04-03 14:12:07 +00:00
`,
2021-03-28 23:17:18 +00:00
],
2021-04-04 01:02:52 +00:00
`/${efsDirectoryName}`,
`/${efsDirectoryName}/${buildUid}/${repositoryDirectoryName}/${buildParameters.projectPath}`,
2021-03-28 23:17:18 +00:00
[
{
name: 'GITHUB_SHA',
value: process.env.GITHUB_SHA,
},
],
[
{
ParameterKey: 'GithubToken',
ParameterValue: buildParameters.githubToken,
},
],
);
2021-04-03 00:19:00 +00:00
2021-04-03 14:32:54 +00:00
core.info('Starting part 4/4 (upload build to s3)');
2021-03-28 23:17:18 +00:00
await this.run(
buildUid,
buildParameters.awsStackName,
'amazon/aws-cli',
['/bin/sh'],
[
'-c',
`
2021-04-03 20:22:44 +00:00
aws s3 cp ${buildUid}/build-${buildUid}.zip s3://game-ci-storage/
2021-04-03 22:03:34 +00:00
# no need to upload Library cache for now
2021-04-04 01:02:52 +00:00
# aws s3 cp /${efsDirectoryName}/${cacheDirectoryName}/${branchName}/lib-${buildUid}.zip s3://game-ci-storage/
2021-04-03 20:22:44 +00:00
rm -r ${buildUid}
`,
2021-03-28 23:17:18 +00:00
],
2021-04-04 01:02:52 +00:00
`/${efsDirectoryName}`,
`/${efsDirectoryName}/`,
2021-03-28 23:17:18 +00:00
[
{
name: 'GITHUB_SHA',
value: process.env.GITHUB_SHA,
},
{
name: 'AWS_DEFAULT_REGION',
value: process.env.AWS_DEFAULT_REGION,
},
],
[
{
ParameterKey: 'GithubToken',
ParameterValue: buildParameters.githubToken,
},
{
ParameterKey: 'AWSAccessKeyID',
ParameterValue: process.env.AWS_ACCESS_KEY_ID,
},
{
ParameterKey: 'AWSSecretAccessKey',
ParameterValue: process.env.AWS_SECRET_ACCESS_KEY,
},
],
);
} catch (error) {
2021-03-27 22:34:09 +00:00
core.setFailed(error);
core.error(error);
}
}
2021-03-28 23:17:18 +00:00
static async run(
buildUid: string,
stackName: string,
image: string,
entrypoint: string[],
commands,
mountdir,
workingdir,
environment,
secrets,
) {
2021-03-27 22:34:09 +00:00
const ECS = new SDK.ECS();
const CF = new SDK.CloudFormation();
2021-04-03 00:15:24 +00:00
const taskDef = await this.setupCloudFormations(
CF,
buildUid,
stackName,
image,
entrypoint,
commands,
mountdir,
workingdir,
secrets,
);
2021-03-27 22:34:09 +00:00
2021-04-03 00:15:24 +00:00
await this.runTask(taskDef, ECS, CF, environment, buildUid);
await this.cleanupResources(CF, taskDef);
}
static async setupCloudFormations(
CF,
buildUid: string,
stackName: string,
image: string,
entrypoint: string[],
commands,
mountdir,
workingdir,
secrets,
) {
2021-04-07 19:50:33 +00:00
const logid = customAlphabet(alphabet, 9)();
2021-04-07 19:45:21 +00:00
commands[1] += `
echo "${logid}"
`;
const taskDefStackName = `${stackName}-${buildUid}`;
2021-04-03 00:15:24 +00:00
const taskDefCloudFormation = fs.readFileSync(`${__dirname}/task-def-formation.yml`, 'utf8');
await CF.createStack({
StackName: taskDefStackName,
TemplateBody: taskDefCloudFormation,
Parameters: [
{
ParameterKey: 'ImageUrl',
ParameterValue: image,
},
{
ParameterKey: 'ServiceName',
ParameterValue: taskDefStackName,
},
{
ParameterKey: 'Command',
ParameterValue: commands.join(','),
},
{
ParameterKey: 'EntryPoint',
ParameterValue: entrypoint.join(','),
},
{
ParameterKey: 'WorkingDirectory',
ParameterValue: workingdir,
},
{
ParameterKey: 'EFSMountDirectory',
ParameterValue: mountdir,
},
{
ParameterKey: 'BUILDID',
ParameterValue: buildUid,
},
...secrets,
],
}).promise();
2021-04-03 16:38:23 +00:00
core.info('Creating worker cluster...');
2021-03-27 22:34:09 +00:00
2021-04-03 13:03:30 +00:00
const cleanupTaskDefStackName = `${taskDefStackName}-cleanup`;
const cleanupCloudFormation = fs.readFileSync(`${__dirname}/cloudformation-stack-ttl.yml`, 'utf8');
2021-04-03 00:15:24 +00:00
await CF.createStack({
2021-04-03 13:03:30 +00:00
StackName: cleanupTaskDefStackName,
TemplateBody: cleanupCloudFormation,
2021-04-03 00:15:24 +00:00
Capabilities: ['CAPABILITY_IAM'],
Parameters: [
{
ParameterKey: 'StackName',
ParameterValue: taskDefStackName,
},
{
ParameterKey: 'DeleteStackName',
2021-04-03 13:03:30 +00:00
ParameterValue: cleanupTaskDefStackName,
2021-04-03 00:15:24 +00:00
},
{
ParameterKey: 'TTL',
ParameterValue: '100',
},
{
ParameterKey: 'BUILDID',
ParameterValue: buildUid,
},
],
}).promise();
core.info('Creating cleanup cluster...');
try {
await CF.waitFor('stackCreateComplete', { StackName: taskDefStackName }).promise();
} catch (error) {
core.error(error);
}
2021-03-27 22:34:09 +00:00
const taskDefResources = await CF.describeStackResources({
2021-04-03 00:15:24 +00:00
StackName: taskDefStackName,
2021-03-27 22:34:09 +00:00
}).promise();
2021-03-28 20:32:52 +00:00
const baseResources = await CF.describeStackResources({ StackName: stackName }).promise();
2021-03-27 22:34:09 +00:00
2021-04-03 14:17:49 +00:00
// in the future we should offer a parameter to choose if you want the guarnteed shutdown.
2021-04-03 16:38:23 +00:00
core.info('Worker cluster created successfully (skipping wait for cleanup cluster to be ready)');
2021-04-03 00:15:24 +00:00
return {
taskDefStackName,
taskDefCloudFormation,
2021-04-03 13:03:30 +00:00
taskDefStackNameTTL: cleanupTaskDefStackName,
ttlCloudFormation: cleanupCloudFormation,
2021-04-03 00:15:24 +00:00
taskDefResources,
baseResources,
2021-04-07 19:54:24 +00:00
logid,
2021-04-03 00:15:24 +00:00
};
}
static async runTask(taskDef, ECS, CF, environment, buildUid) {
2021-04-03 00:43:03 +00:00
const cluster =
2021-04-03 01:17:36 +00:00
taskDef.baseResources.StackResources?.find((x) => x.LogicalResourceId === 'ECSCluster')?.PhysicalResourceId || '';
2021-04-03 00:32:25 +00:00
const taskDefinition =
taskDef.taskDefResources.StackResources?.find((x) => x.LogicalResourceId === 'TaskDefinition')
?.PhysicalResourceId || '';
const SubnetOne =
taskDef.baseResources.StackResources?.find((x) => x.LogicalResourceId === 'PublicSubnetOne')
?.PhysicalResourceId || '';
const SubnetTwo =
taskDef.baseResources.StackResources?.find((x) => x.LogicalResourceId === 'PublicSubnetTwo')
?.PhysicalResourceId || '';
const ContainerSecurityGroup =
taskDef.baseResources.StackResources?.find((x) => x.LogicalResourceId === 'ContainerSecurityGroup')
?.PhysicalResourceId || '';
2021-04-03 00:15:24 +00:00
const streamName =
taskDef.taskDefResources.StackResources?.find((x) => x.LogicalResourceId === 'KinesisStream')
?.PhysicalResourceId || '';
2021-04-03 00:32:25 +00:00
2021-03-28 23:57:35 +00:00
const task = await ECS.runTask({
2021-04-03 00:43:03 +00:00
cluster,
2021-04-03 00:32:25 +00:00
taskDefinition,
2021-03-28 23:57:35 +00:00
platformVersion: '1.4.0',
overrides: {
containerOverrides: [
{
2021-04-02 23:46:48 +00:00
name: taskDef.taskDefStackName,
2021-03-28 23:57:35 +00:00
environment: [...environment, { name: 'BUILDID', value: buildUid }],
2021-03-28 23:17:18 +00:00
},
2021-03-28 23:57:35 +00:00
],
},
launchType: 'FARGATE',
networkConfiguration: {
awsvpcConfiguration: {
2021-04-03 00:32:25 +00:00
subnets: [SubnetOne, SubnetTwo],
2021-03-28 23:57:35 +00:00
assignPublicIp: 'ENABLED',
2021-04-03 00:32:25 +00:00
securityGroups: [ContainerSecurityGroup],
2021-03-28 23:17:18 +00:00
},
2021-03-27 22:34:09 +00:00
},
2021-03-28 23:57:35 +00:00
}).promise();
2021-03-27 22:34:09 +00:00
2021-04-03 19:41:05 +00:00
core.info('Task is starting on worker cluster');
2021-04-03 00:15:24 +00:00
const taskArn = task.tasks?.[0].taskArn || '';
2021-03-27 22:34:09 +00:00
try {
2021-04-03 00:43:03 +00:00
await ECS.waitFor('tasksRunning', { tasks: [taskArn], cluster }).promise();
2021-03-27 22:34:09 +00:00
} catch (error) {
await new Promise((resolve) => setTimeout(resolve, 3000));
2021-03-28 23:57:35 +00:00
const describeTasks = await ECS.describeTasks({
2021-04-03 00:15:24 +00:00
tasks: [taskArn],
2021-04-03 00:43:03 +00:00
cluster,
2021-03-27 22:34:09 +00:00
}).promise();
2021-04-03 16:38:23 +00:00
core.info(`Task has ended ${describeTasks.tasks?.[0].containers?.[0].lastStatus}`);
2021-03-27 22:34:09 +00:00
core.setFailed(error);
core.error(error);
}
2021-04-03 19:41:05 +00:00
core.info(`Task is running on worker cluster`);
2021-04-07 19:54:24 +00:00
await this.streamLogsUntilTaskStops(ECS, CF, taskDef, cluster, taskArn, streamName);
2021-04-03 00:43:03 +00:00
await ECS.waitFor('tasksStopped', { cluster, tasks: [taskArn] }).promise();
2021-04-03 00:15:24 +00:00
const exitCode = (
await ECS.describeTasks({
tasks: [taskArn],
2021-04-03 00:43:03 +00:00
cluster,
2021-04-03 00:15:24 +00:00
}).promise()
).tasks?.[0].containers?.[0].exitCode;
if (exitCode !== 0) {
2021-04-03 19:44:20 +00:00
try {
await this.cleanupResources(CF, taskDef);
2021-04-03 19:59:01 +00:00
} catch (error) {
2021-04-03 19:44:20 +00:00
core.warning(`failed to cleanup ${error}`);
}
2021-04-03 00:28:18 +00:00
core.error(`job failed with exit code ${exitCode}`);
2021-04-03 13:20:52 +00:00
throw new Error(`job failed with exit code ${exitCode}`);
2021-04-03 00:15:24 +00:00
} else {
2021-04-03 16:38:23 +00:00
core.info(`Task has finished successfully`);
2021-04-03 00:15:24 +00:00
}
}
2021-03-27 22:34:09 +00:00
2021-04-07 19:54:24 +00:00
static async streamLogsUntilTaskStops(ECS, CF, taskDef, clusterName, taskArn, kinesisStreamName) {
2021-03-27 22:34:09 +00:00
// watching logs
const kinesis = new SDK.Kinesis();
const getTaskStatus = async () => {
const tasks = await ECS.describeTasks({
cluster: clusterName,
2021-04-03 00:15:24 +00:00
tasks: [taskArn],
2021-03-27 22:34:09 +00:00
}).promise();
return tasks.tasks?.[0].lastStatus;
};
2021-03-28 23:17:18 +00:00
const stream = await kinesis
2021-03-28 23:57:35 +00:00
.describeStream({
2021-04-03 00:15:24 +00:00
StreamName: kinesisStreamName,
2021-03-28 23:57:35 +00:00
})
2021-03-28 23:17:18 +00:00
.promise();
2021-03-27 22:34:09 +00:00
2021-03-28 23:17:18 +00:00
let iterator =
(
await kinesis
.getShardIterator({
ShardIteratorType: 'TRIM_HORIZON',
StreamName: stream.StreamDescription.StreamName,
ShardId: stream.StreamDescription.Shards[0].ShardId,
})
.promise()
).ShardIterator || '';
2021-03-27 22:34:09 +00:00
2021-04-02 23:46:48 +00:00
await CF.waitFor('stackCreateComplete', { StackName: taskDef.taskDefStackNameTTL }).promise();
2021-03-28 23:17:18 +00:00
2021-03-27 22:34:09 +00:00
core.info(`Task status is ${await getTaskStatus()}`);
2021-04-03 00:49:59 +00:00
const logBaseUrl = `https://${SDK.config.region}.console.aws.amazon.com/cloudwatch/home?region=${SDK.config.region}#logsV2:log-groups/log-group/${taskDef.taskDefStackName}`;
2021-04-03 00:43:03 +00:00
core.info(`You can also see the logs at AWS Cloud Watch: ${logBaseUrl}`);
2021-03-27 22:34:09 +00:00
let readingLogs = true;
while (readingLogs) {
await new Promise((resolve) => setTimeout(resolve, 1500));
if ((await getTaskStatus()) !== 'RUNNING') {
readingLogs = false;
2021-04-07 19:45:21 +00:00
core.info('Task status is not RUNNING waiting 45 seconds for end of logs.');
await new Promise((resolve) => setTimeout(resolve, 45000));
2021-03-27 22:34:09 +00:00
}
const records = await kinesis
.getRecords({
ShardIterator: iterator,
})
.promise();
2021-03-28 23:17:18 +00:00
iterator = records.NextShardIterator || '';
2021-04-05 13:23:27 +00:00
if (records.Records.length > 0 && iterator) {
2021-03-27 22:34:09 +00:00
for (let index = 0; index < records.Records.length; index++) {
const json = JSON.parse(
2021-03-28 23:17:18 +00:00
zlib.gunzipSync(Buffer.from(records.Records[index].Data as string, 'base64')).toString('utf8'),
2021-03-27 22:34:09 +00:00
);
if (json.messageType === 'DATA_MESSAGE') {
for (let logEventsIndex = 0; logEventsIndex < json.logEvents.length; logEventsIndex++) {
core.info(json.logEvents[logEventsIndex].message);
2021-04-07 19:54:24 +00:00
if (json.logEvents[logEventsIndex].message.includes(taskDef.logid)) {
core.info('End of task logs');
2021-04-07 19:45:21 +00:00
readingLogs = false;
}
2021-03-27 22:34:09 +00:00
}
}
}
}
}
2021-04-03 00:15:24 +00:00
}
2021-03-27 22:34:09 +00:00
2021-04-03 00:15:24 +00:00
static async cleanupResources(CF, taskDef) {
2021-03-27 22:34:09 +00:00
await CF.deleteStack({
2021-04-02 23:46:48 +00:00
StackName: taskDef.taskDefStackName,
2021-03-27 22:34:09 +00:00
}).promise();
await CF.deleteStack({
2021-04-02 23:46:48 +00:00
StackName: taskDef.taskDefStackNameTTL,
2021-03-27 22:34:09 +00:00
}).promise();
await CF.waitFor('stackDeleteComplete', {
2021-04-02 23:46:48 +00:00
StackName: taskDef.taskDefStackName,
2021-03-27 22:34:09 +00:00
}).promise();
2021-04-02 23:06:47 +00:00
// Currently too slow and causes too much waiting
2021-04-02 23:11:34 +00:00
await CF.waitFor('stackDeleteComplete', {
2021-04-02 23:46:48 +00:00
StackName: taskDef.taskDefStackNameTTL,
2021-04-02 23:11:34 +00:00
}).promise();
2021-03-27 22:34:09 +00:00
core.info('Cleanup complete');
}
static onlog(batch) {
2021-03-28 23:57:35 +00:00
for (const log of batch) {
2021-03-27 22:34:09 +00:00
core.info(`log: ${log}`);
2021-03-28 23:57:35 +00:00
}
2021-03-27 22:34:09 +00:00
}
}
2021-03-28 23:17:18 +00:00
export default AWS;