170 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
| import { V1EnvVar, V1EnvVarSource, V1SecretKeySelector } from '@kubernetes/client-node';
 | |
| import BuildParameters from '../../../build-parameters';
 | |
| import { CloudRunnerCustomHooks } from '../../services/cloud-runner-custom-hooks';
 | |
| import CloudRunnerEnvironmentVariable from '../../services/cloud-runner-environment-variable';
 | |
| import CloudRunnerSecret from '../../services/cloud-runner-secret';
 | |
| import CloudRunner from '../../cloud-runner';
 | |
| 
 | |
| class KubernetesJobSpecFactory {
 | |
|   public static readonly MainContainerName = 'main';
 | |
|   static getJobSpec(
 | |
|     command: string,
 | |
|     image: string,
 | |
|     mountdir: string,
 | |
|     workingDirectory: string,
 | |
|     environment: CloudRunnerEnvironmentVariable[],
 | |
|     secrets: CloudRunnerSecret[],
 | |
|     buildGuid: string,
 | |
|     buildParameters: BuildParameters,
 | |
|     secretName: string,
 | |
|     pvcName: string,
 | |
|     jobName: string,
 | |
|     k8s: any,
 | |
|   ) {
 | |
|     environment.push(
 | |
|       ...[
 | |
|         {
 | |
|           name: 'GITHUB_SHA',
 | |
|           value: buildGuid,
 | |
|         },
 | |
|         {
 | |
|           name: 'GITHUB_WORKSPACE',
 | |
|           value: '/data/repo',
 | |
|         },
 | |
|         {
 | |
|           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: 'CHOWN_FILES_TO',
 | |
|           value: buildParameters.chownFilesTo,
 | |
|         },
 | |
|         {
 | |
|           name: 'BUILD_TARGET',
 | |
|           value: buildParameters.targetPlatform,
 | |
|         },
 | |
|         {
 | |
|           name: 'ANDROID_VERSION_CODE',
 | |
|           value: buildParameters.androidVersionCode.toString(),
 | |
|         },
 | |
|         {
 | |
|           name: 'ANDROID_KEYSTORE_NAME',
 | |
|           value: buildParameters.androidKeystoreName,
 | |
|         },
 | |
|         {
 | |
|           name: 'ANDROID_KEYALIAS_NAME',
 | |
|           value: buildParameters.androidKeyaliasName,
 | |
|         },
 | |
|       ],
 | |
|     );
 | |
|     const job = new k8s.V1Job();
 | |
|     job.apiVersion = 'batch/v1';
 | |
|     job.kind = 'Job';
 | |
|     job.metadata = {
 | |
|       name: jobName,
 | |
|       labels: {
 | |
|         app: 'unity-builder',
 | |
|         buildGuid,
 | |
|       },
 | |
|     };
 | |
|     job.spec = {
 | |
|       ttlSecondsAfterFinished: 9999,
 | |
|       backoffLimit: 0,
 | |
|       template: {
 | |
|         spec: {
 | |
|           volumes: [
 | |
|             {
 | |
|               name: 'build-mount',
 | |
|               persistentVolumeClaim: {
 | |
|                 claimName: pvcName,
 | |
|               },
 | |
|             },
 | |
|           ],
 | |
|           containers: [
 | |
|             {
 | |
|               ttlSecondsAfterFinished: 9999,
 | |
|               name: KubernetesJobSpecFactory.MainContainerName,
 | |
|               image,
 | |
|               command: ['/bin/sh'],
 | |
|               args: ['-c', `${CloudRunnerCustomHooks.ApplyHooksToCommands(command, CloudRunner.buildParameters)}`],
 | |
| 
 | |
|               workingDir: `${workingDirectory}`,
 | |
|               resources: {
 | |
|                 requests: {
 | |
|                   memory: `${Number.parseInt(buildParameters.containerMemory) / 1024}G` || '750M',
 | |
|                   cpu: Number.parseInt(buildParameters.containerCpu) / 1024 || '1',
 | |
|                 },
 | |
|               },
 | |
|               env: [
 | |
|                 ...environment.map((x) => {
 | |
|                   const environmentVariable = new V1EnvVar();
 | |
|                   environmentVariable.name = x.name;
 | |
|                   environmentVariable.value = x.value;
 | |
| 
 | |
|                   return environmentVariable;
 | |
|                 }),
 | |
|                 ...secrets.map((x) => {
 | |
|                   const secret = new V1EnvVarSource();
 | |
|                   secret.secretKeyRef = new V1SecretKeySelector();
 | |
|                   secret.secretKeyRef.key = x.ParameterKey;
 | |
|                   secret.secretKeyRef.name = secretName;
 | |
|                   const environmentVariable = new V1EnvVar();
 | |
|                   environmentVariable.name = x.EnvironmentVariable;
 | |
|                   environmentVariable.valueFrom = secret;
 | |
| 
 | |
|                   return environmentVariable;
 | |
|                 }),
 | |
|               ],
 | |
|               volumeMounts: [
 | |
|                 {
 | |
|                   name: 'build-mount',
 | |
|                   mountPath: `/${mountdir}`,
 | |
|                 },
 | |
|               ],
 | |
|               lifecycle: {
 | |
|                 preStop: {
 | |
|                   exec: {
 | |
|                     command: [
 | |
|                       'bin/bash',
 | |
|                       '-c',
 | |
|                       `cd /data/builder/action/steps;
 | |
|                       chmod +x /return_license.sh;
 | |
|                       /return_license.sh;`,
 | |
|                     ],
 | |
|                   },
 | |
|                 },
 | |
|               },
 | |
|             },
 | |
|           ],
 | |
|           restartPolicy: 'Never',
 | |
|         },
 | |
|       },
 | |
|     };
 | |
| 
 | |
|     job.spec.template.spec.containers[0].resources.requests[`ephemeral-storage`] = '10Gi';
 | |
| 
 | |
|     return job;
 | |
|   }
 | |
| }
 | |
| export default KubernetesJobSpecFactory;
 |