unity-builder/src/model/cloud-runner/cloud-runner.ts

141 lines
5.2 KiB
TypeScript
Raw Normal View History

2021-09-22 20:05:21 +00:00
import AWSBuildPlatform from './aws/aws-build-platform';
2021-08-01 23:43:20 +00:00
import * as core from '@actions/core';
import { BuildParameters } from '..';
2021-09-29 22:39:15 +00:00
import CloudRunnerNamespace from './cloud-runner-services/cloud-runner-namespace';
import { CloudRunnerState } from './cloud-runner-state/cloud-runner-state';
2021-09-22 20:05:21 +00:00
import Kubernetes from './k8s/kubernetes-build-platform';
2021-09-29 22:39:15 +00:00
import CloudRunnerLogger from './cloud-runner-services/cloud-runner-logger';
import { BuildStep } from './cloud-runner-steps/build-step';
import { CompressionStep } from './cloud-runner-steps/compression-step';
import { DownloadRepositoryStep } from './cloud-runner-steps/download-repository-step';
import { CustomStep } from './cloud-runner-steps/custom-step';
import { EphemeralGitHubRunnerStep } from './cloud-runner-steps/ephemeral-github-runner-step';
import { CloudRunnerStepState } from './cloud-runner-state/cloud-runner-step-state';
2021-08-01 23:43:20 +00:00
2021-08-17 20:09:42 +00:00
class CloudRunner {
2021-08-21 23:26:03 +00:00
private static setup(buildParameters: BuildParameters) {
2021-09-21 18:27:04 +00:00
CloudRunnerLogger.setup();
CloudRunnerState.buildGuid = CloudRunnerNamespace.generateBuildName(
CloudRunnerState.readRunNumber(),
2021-08-01 23:43:20 +00:00
buildParameters.platform,
);
CloudRunnerState.buildParams = buildParameters;
CloudRunnerState.setupBranchName();
CloudRunnerState.setupFolderVariables();
CloudRunnerState.setupDefaultSecrets();
2021-08-21 23:26:03 +00:00
CloudRunner.setupBuildPlatform();
2021-08-01 23:43:20 +00:00
}
public static setupBuildPlatform() {
switch (CloudRunnerState.buildParams.cloudRunnerCluster) {
2021-08-01 23:43:20 +00:00
case 'aws':
2021-09-21 18:27:04 +00:00
CloudRunnerLogger.log('Building with AWS');
CloudRunnerState.CloudRunnerProviderPlatform = new AWSBuildPlatform(CloudRunnerState.buildParams);
2021-08-01 23:43:20 +00:00
break;
default:
case 'k8s':
2021-09-21 18:27:04 +00:00
CloudRunnerLogger.log('Building with Kubernetes');
CloudRunnerState.CloudRunnerProviderPlatform = new Kubernetes(CloudRunnerState.buildParams);
2021-08-01 23:43:20 +00:00
break;
}
}
static async run(buildParameters: BuildParameters, baseImage) {
CloudRunner.setup(buildParameters);
try {
await CloudRunnerState.CloudRunnerProviderPlatform.setupSharedBuildResources(
CloudRunnerState.buildGuid,
CloudRunnerState.buildParams,
CloudRunnerState.branchName,
CloudRunnerState.defaultSecrets,
);
await CloudRunner.runJob(baseImage.toString());
await CloudRunnerState.CloudRunnerProviderPlatform.cleanupSharedBuildResources(
CloudRunnerState.buildGuid,
CloudRunnerState.buildParams,
CloudRunnerState.branchName,
CloudRunnerState.defaultSecrets,
);
} catch (error) {
await CloudRunner.handleException(error);
throw error;
2021-08-01 23:43:20 +00:00
}
}
private static async runJob(baseImage: any) {
core.info(`Custom build steps: ${CloudRunnerState.buildParams.customBuildSteps}`);
if (CloudRunnerState.buildParams.customBuildSteps === '') {
2021-08-21 23:26:03 +00:00
await CloudRunner.standardBuildAutomation(baseImage);
} else if (CloudRunnerState.buildParams.customBuildSteps === 'ephemeral') {
await new EphemeralGitHubRunnerStep().run(
new CloudRunnerStepState(
baseImage,
CloudRunnerState.readBuildEnvironmentVariables(),
CloudRunnerState.defaultSecrets,
),
);
} else if (CloudRunnerState.buildParams.customBuildSteps === 'download') {
await new DownloadRepositoryStep().run(
new CloudRunnerStepState(
'alpine/git',
CloudRunnerState.readBuildEnvironmentVariables(),
CloudRunnerState.defaultSecrets,
),
);
2021-08-21 23:26:03 +00:00
} else {
await CustomStep.runCustomJob(CloudRunnerState.buildParams.customBuildSteps);
2021-08-21 23:26:03 +00:00
}
}
private static async standardBuildAutomation(baseImage: any) {
CloudRunnerLogger.log(`Cloud Runner is running standard build automation`);
await new DownloadRepositoryStep().run(
new CloudRunnerStepState(
'alpine/git',
CloudRunnerState.readBuildEnvironmentVariables(),
CloudRunnerState.defaultSecrets,
),
);
CloudRunnerLogger.logWithTime('Download repository step time');
await CustomStep.runCustomJob(CloudRunnerState.buildParams.preBuildSteps);
CloudRunnerLogger.logWithTime('Pre build step(s) time');
2021-08-21 23:26:03 +00:00
new BuildStep().run(
new CloudRunnerStepState(
baseImage,
CloudRunnerState.readBuildEnvironmentVariables(),
CloudRunnerState.defaultSecrets,
),
2021-08-21 23:26:03 +00:00
);
CloudRunnerLogger.logWithTime('Build time');
2021-08-21 23:26:03 +00:00
await new CompressionStep().run(
new CloudRunnerStepState(
'alpine',
CloudRunnerState.readBuildEnvironmentVariables(),
CloudRunnerState.defaultSecrets,
),
2021-08-21 23:26:03 +00:00
);
CloudRunnerLogger.logWithTime('Compression time');
2021-08-21 23:26:03 +00:00
await CustomStep.runCustomJob(CloudRunnerState.buildParams.postBuildSteps);
CloudRunnerLogger.logWithTime('Post build step(s) time');
2021-08-21 23:26:03 +00:00
CloudRunnerLogger.log(`Cloud Runner finished running standard build automation`);
2021-08-21 23:26:03 +00:00
}
2021-08-01 23:43:20 +00:00
private static async handleException(error: unknown) {
2021-09-21 18:27:04 +00:00
CloudRunnerLogger.error(JSON.stringify(error, undefined, 4));
2021-08-01 23:43:20 +00:00
core.setFailed('Remote Builder failed');
await CloudRunnerState.CloudRunnerProviderPlatform.cleanupSharedBuildResources(
CloudRunnerState.buildGuid,
CloudRunnerState.buildParams,
CloudRunnerState.branchName,
CloudRunnerState.defaultSecrets,
2021-08-01 23:43:20 +00:00
);
}
}
2021-08-17 20:09:42 +00:00
export default CloudRunner;