mirror of
https://github.com/game-ci/unity-builder.git
synced 2025-07-04 12:25:19 -04:00

* 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
142 lines
4.6 KiB
TypeScript
142 lines
4.6 KiB
TypeScript
import * as SDK from 'aws-sdk';
|
|
import CloudRunnerAWSTaskDef from './cloud-runner-aws-task-def';
|
|
import CloudRunnerSecret from '../../services/cloud-runner-secret';
|
|
import { AWSCloudFormationTemplates } from './aws-cloud-formation-templates';
|
|
import CloudRunnerLogger from '../../services/cloud-runner-logger';
|
|
import { AWSError } from './aws-error';
|
|
|
|
export class AWSJobStack {
|
|
private baseStackName: string;
|
|
constructor(baseStackName: string) {
|
|
this.baseStackName = baseStackName;
|
|
}
|
|
|
|
public async setupCloudFormations(
|
|
CF: SDK.CloudFormation,
|
|
buildGuid: string,
|
|
image: string,
|
|
entrypoint: string[],
|
|
commands: string,
|
|
mountdir: string,
|
|
workingdir: string,
|
|
secrets: CloudRunnerSecret[],
|
|
): Promise<CloudRunnerAWSTaskDef> {
|
|
const taskDefStackName = `${this.baseStackName}-${buildGuid}`;
|
|
let taskDefCloudFormation = AWSCloudFormationTemplates.readTaskCloudFormationTemplate();
|
|
for (const secret of secrets) {
|
|
secret.ParameterKey = `${buildGuid.replace(/[^\dA-Za-z]/g, '')}${secret.ParameterKey.replace(
|
|
/[^\dA-Za-z]/g,
|
|
'',
|
|
)}`;
|
|
if (typeof secret.ParameterValue == 'number') {
|
|
secret.ParameterValue = `${secret.ParameterValue}`;
|
|
}
|
|
if (!secret.ParameterValue || secret.ParameterValue === '') {
|
|
secrets = secrets.filter((x) => x !== secret);
|
|
continue;
|
|
}
|
|
taskDefCloudFormation = AWSCloudFormationTemplates.insertAtTemplate(
|
|
taskDefCloudFormation,
|
|
'p1 - input',
|
|
AWSCloudFormationTemplates.getParameterTemplate(secret.ParameterKey),
|
|
);
|
|
taskDefCloudFormation = AWSCloudFormationTemplates.insertAtTemplate(
|
|
taskDefCloudFormation,
|
|
'p2 - secret',
|
|
AWSCloudFormationTemplates.getSecretTemplate(`${secret.ParameterKey}`),
|
|
);
|
|
taskDefCloudFormation = AWSCloudFormationTemplates.insertAtTemplate(
|
|
taskDefCloudFormation,
|
|
'p3 - container def',
|
|
AWSCloudFormationTemplates.getSecretDefinitionTemplate(secret.EnvironmentVariable, secret.ParameterKey),
|
|
);
|
|
}
|
|
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,
|
|
},
|
|
...secretsMappedToCloudFormationParameters,
|
|
];
|
|
|
|
let previousStackExists = true;
|
|
while (previousStackExists) {
|
|
previousStackExists = false;
|
|
const stacks = await CF.listStacks().promise();
|
|
if (!stacks.StackSummaries) {
|
|
throw new Error('Faild to get stacks');
|
|
}
|
|
for (let index = 0; index < stacks.StackSummaries.length; index++) {
|
|
const element = stacks.StackSummaries[index];
|
|
if (element.StackName === taskDefStackName && element.StackStatus !== 'DELETE_COMPLETE') {
|
|
previousStackExists = true;
|
|
CloudRunnerLogger.log(`Previous stack still exists: ${JSON.stringify(element)}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
try {
|
|
await CF.createStack({
|
|
StackName: taskDefStackName,
|
|
TemplateBody: taskDefCloudFormation,
|
|
Capabilities: ['CAPABILITY_IAM'],
|
|
Parameters: parameters,
|
|
}).promise();
|
|
CloudRunnerLogger.log('Creating cloud runner job');
|
|
await CF.waitFor('stackCreateComplete', { StackName: taskDefStackName }).promise();
|
|
} catch (error) {
|
|
await AWSError.handleStackCreationFailure(
|
|
error,
|
|
CF,
|
|
taskDefStackName,
|
|
//taskDefCloudFormation,
|
|
//parameters,
|
|
//secrets,
|
|
);
|
|
throw error;
|
|
}
|
|
|
|
const taskDefResources = (
|
|
await CF.describeStackResources({
|
|
StackName: taskDefStackName,
|
|
}).promise()
|
|
).StackResources;
|
|
|
|
const baseResources = (await CF.describeStackResources({ StackName: this.baseStackName }).promise()).StackResources;
|
|
|
|
return {
|
|
taskDefStackName,
|
|
taskDefCloudFormation,
|
|
taskDefResources,
|
|
baseResources,
|
|
};
|
|
}
|
|
}
|