* Update cloud-runner-aws-pipeline.yml * Update cloud-runner-k8s-pipeline.yml * yarn build * yarn build * correct branch ref * correct branch ref passed to target repo * Create k8s-tests.yml * Delete k8s-tests.yml * correct branch ref passed to target repo * correct branch ref passed to target repo * Always describe AWS tasks for now, because unstable error handling * Remove unused tree commands * Use lfs guid sum * Simple override cache push * Simple override cache push and pull override to allow pure cloud storage driven caching * Removal of early branch (breaks lfs caching) * Remove unused tree commands * Update action.yml * Update action.yml * Support cache and input override commands as input + full support custom hooks * Increase k8s timeout * replace filename being appended for unknclear reason * cache key should not contain whitespaces * Always try and deploy rook for k8s * Apply k8s files for rook * Update action.yml * Apply k8s files for rook * Apply k8s files for rook * cache test and action description for kuber storage class * Correct test and implement dependency health check and start * GCP-secret run, cache key * lfs smudge set explicit and undo explicit * Run using external secret provider to speed up input * Update cloud-runner-aws-pipeline.yml * Add nodejs as build step dependency * Add nodejs as build step dependency * Cloud Runner Tests must be specified to capture logs from cloud runner for tests * Cloud Runner Tests must be specified to capture logs from cloud runner for tests * Refactor and cleanup - no async input, combined setup/build, removed github logs for cli runs * Refactor and cleanup - no async input, combined setup/build, removed github logs for cli runs * Refactor and cleanup - no async input, combined setup/build, removed github logs for cli runs * Refactor and cleanup - no async input, combined setup/build, removed github logs for cli runs * Refactor and cleanup - no async input, combined setup/build, removed github logs for cli runs * better defaults for new inputs * better defaults * merge latest * force build update * use npm n to update node in unity builder * use npm n to update node in unity builder * use npm n to update node in unity builder * correct new line * quiet zipping * quiet zipping * default secrets for unity username and password * default secrets for unity username and password * ls active directory before lfs install * Get cloud runner secrets from * Get cloud runner secrets from * Cleanup setup of default secrets * Various fixes * Cleanup setup of default secrets * Various fixes * Various fixes * Various fixes * Various fixes * Various fixes * Various fixes * Various fixes * Various fixes * Various fixes * Various fixes * Various fixes * Various fixes * Various fixes * Various fixes * AWS secrets manager support * less caching logs * default k8s storage class to pd-standard * more readable build commands * Capture aws exit code 1 reliably * Always replace /head from branch * k8s default storage class to standard-rwo * cleanup * further cleanup input * further cleanup input * further cleanup input * further cleanup input * further cleanup input * folder sizes to inspect caching * dir command for local cloud runner test * k8s wait for pending because pvc will not create earlier * prefer k8s standard storage * handle empty string as cloud runner cluster input * local-system is now used for cloud runner test implementation AND correctly unset test CLI input * local-system is now used for cloud runner test implementation AND correctly unset test CLI input * fix unterminated quote * fix unterminated quote * do not share build parameters in tests - in cloud runner this will cause conflicts with resouces of the same name * remove head and heads from branch prefix * fix reversed caching direction of cache-push * fixes * fixes * fixes * cachePull cli * fixes * fixes * fixes * fixes * fixes * order cache test to be first * order cache test to be first * fixes * populate cache key instead of using branch * cleanup cli * garbage-collect-aws cli can iterate over aws resources and cli scans all ts files * import cli methods * import cli files explicitly * import cli files explicitly * import cli files explicitly * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * import cli methods * log parameters in cloud runner parameter test * log parameters in cloud runner parameter test * log parameters in cloud runner parameter test * Cloud runner param test before caching because we have a fast local cache test now * Using custom build path relative to repo root rather than project root * aws-garbage-collect at end of pipeline * aws-garbage-collect do not actually delete anything for now - just list * remove some legacy du commands * Update cloud-runner-aws-pipeline.yml * log contents after cache pull and fix some scenarios with duplicate secrets * log contents after cache pull and fix some scenarios with duplicate secrets * log contents after cache pull and fix some scenarios with duplicate secrets * PR comments * Replace guid with uuid package * use fileExists lambda instead of stat to check file exists in caching * build failed results in core error message * Delete sample.txt
107 lines
4.1 KiB
TypeScript
107 lines
4.1 KiB
TypeScript
import CloudRunnerLogger from '../../services/cloud-runner-logger';
|
|
import * as core from '@actions/core';
|
|
import * as SDK from 'aws-sdk';
|
|
import * as fs from 'fs';
|
|
import path from 'path';
|
|
const crypto = require('crypto');
|
|
|
|
export class AWSBaseStack {
|
|
constructor(baseStackName: string) {
|
|
this.baseStackName = baseStackName;
|
|
}
|
|
private baseStackName: string;
|
|
|
|
async setupBaseStack(CF: SDK.CloudFormation) {
|
|
const baseStackName = this.baseStackName;
|
|
|
|
const baseStack = fs.readFileSync(path.join(__dirname, 'cloud-formations', 'base-setup.yml'), 'utf8');
|
|
|
|
// Cloud Formation Input
|
|
const describeStackInput: SDK.CloudFormation.DescribeStacksInput = {
|
|
StackName: baseStackName,
|
|
};
|
|
const parametersWithoutHash: SDK.CloudFormation.Parameter[] = [
|
|
{ ParameterKey: 'EnvironmentName', ParameterValue: baseStackName },
|
|
];
|
|
const parametersHash = crypto
|
|
.createHash('md5')
|
|
.update(baseStack + JSON.stringify(parametersWithoutHash))
|
|
.digest('hex');
|
|
const parameters: SDK.CloudFormation.Parameter[] = [
|
|
...parametersWithoutHash,
|
|
...[{ ParameterKey: 'Version', ParameterValue: parametersHash }],
|
|
];
|
|
const updateInput: SDK.CloudFormation.UpdateStackInput = {
|
|
StackName: baseStackName,
|
|
TemplateBody: baseStack,
|
|
Parameters: parameters,
|
|
Capabilities: ['CAPABILITY_IAM'],
|
|
};
|
|
const createStackInput: SDK.CloudFormation.CreateStackInput = {
|
|
StackName: baseStackName,
|
|
TemplateBody: baseStack,
|
|
Parameters: parameters,
|
|
Capabilities: ['CAPABILITY_IAM'],
|
|
};
|
|
|
|
const stacks = await CF.listStacks({
|
|
StackStatusFilter: ['UPDATE_COMPLETE', 'CREATE_COMPLETE', 'ROLLBACK_COMPLETE'],
|
|
}).promise();
|
|
const stackNames = stacks.StackSummaries?.map((x) => x.StackName) || [];
|
|
const stackExists: Boolean = stackNames.includes(baseStackName) || false;
|
|
const describeStack = async () => {
|
|
return await CF.describeStacks(describeStackInput).promise();
|
|
};
|
|
try {
|
|
if (!stackExists) {
|
|
CloudRunnerLogger.log(`${baseStackName} stack does not exist (${JSON.stringify(stackNames)})`);
|
|
await CF.createStack(createStackInput).promise();
|
|
CloudRunnerLogger.log(`created stack (version: ${parametersHash})`);
|
|
}
|
|
const CFState = await describeStack();
|
|
let stack = CFState.Stacks?.[0];
|
|
if (!stack) {
|
|
throw new Error(`Base stack doesn't exist, even after creation, stackExists check: ${stackExists}`);
|
|
}
|
|
const stackVersion = stack.Parameters?.find((x) => x.ParameterKey === 'Version')?.ParameterValue;
|
|
|
|
if (stack.StackStatus === 'CREATE_IN_PROGRESS') {
|
|
await CF.waitFor('stackCreateComplete', describeStackInput).promise();
|
|
}
|
|
|
|
if (stackExists) {
|
|
CloudRunnerLogger.log(`Base stack exists (version: ${stackVersion}, local version: ${parametersHash})`);
|
|
if (parametersHash !== stackVersion) {
|
|
CloudRunnerLogger.log(`Attempting update of base stack`);
|
|
try {
|
|
await CF.updateStack(updateInput).promise();
|
|
} catch (error: any) {
|
|
if (error['message'].includes('No updates are to be performed')) {
|
|
CloudRunnerLogger.log(`No updates are to be performed`);
|
|
} else {
|
|
CloudRunnerLogger.log(`Update Failed (Stack name: ${baseStackName})`);
|
|
CloudRunnerLogger.log(error['message']);
|
|
}
|
|
CloudRunnerLogger.log(`Continuing...`);
|
|
}
|
|
} else {
|
|
CloudRunnerLogger.log(`No update required`);
|
|
}
|
|
stack = (await describeStack()).Stacks?.[0];
|
|
if (!stack) {
|
|
throw new Error(
|
|
`Base stack doesn't exist, even after updating and creation, stackExists check: ${stackExists}`,
|
|
);
|
|
}
|
|
if (stack.StackStatus === 'UPDATE_IN_PROGRESS') {
|
|
await CF.waitFor('stackUpdateComplete', describeStackInput).promise();
|
|
}
|
|
}
|
|
CloudRunnerLogger.log('base stack is now ready');
|
|
} catch (error) {
|
|
core.error(JSON.stringify(await describeStack(), undefined, 4));
|
|
throw error;
|
|
}
|
|
}
|
|
}
|