| 
									
										
										
										
											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-08-17 22:13:46 +00:00
										 |  |  | import CloudRunnerNamespace from './cloud-runner-namespace'; | 
					
						
							|  |  |  | import CloudRunnerSecret from './cloud-runner-secret'; | 
					
						
							| 
									
										
										
										
											2021-08-17 20:09:42 +00:00
										 |  |  | import { CloudRunnerProviderInterface } from './cloud-runner-provider-interface'; | 
					
						
							| 
									
										
										
										
											2021-09-22 20:05:21 +00:00
										 |  |  | import Kubernetes from './k8s/kubernetes-build-platform'; | 
					
						
							| 
									
										
										
										
											2021-08-17 22:13:46 +00:00
										 |  |  | import CloudRunnerEnvironmentVariable from './cloud-runner-environment-variable'; | 
					
						
							| 
									
										
										
										
											2021-08-15 18:06:54 +00:00
										 |  |  | import ImageEnvironmentFactory from '../image-environment-factory'; | 
					
						
							| 
									
										
										
										
											2021-08-15 21:03:29 +00:00
										 |  |  | import YAML from 'yaml'; | 
					
						
							| 
									
										
										
										
											2021-09-21 18:27:04 +00:00
										 |  |  | import CloudRunnerLogger from './cloud-runner-logger'; | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  | const repositoryFolder = 'repo'; | 
					
						
							|  |  |  | const buildVolumeFolder = 'data'; | 
					
						
							|  |  |  | const cacheFolder = 'cache'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-17 20:09:42 +00:00
										 |  |  | class CloudRunner { | 
					
						
							| 
									
										
										
										
											2021-08-17 22:13:46 +00:00
										 |  |  |   static CloudRunnerProviderPlatform: CloudRunnerProviderInterface; | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |   private static buildParams: BuildParameters; | 
					
						
							| 
									
										
										
										
											2021-08-17 22:13:46 +00:00
										 |  |  |   private static defaultSecrets: CloudRunnerSecret[]; | 
					
						
							| 
									
										
										
										
											2021-08-15 21:59:58 +00:00
										 |  |  |   private static buildGuid: string; | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |   private static branchName: string; | 
					
						
							|  |  |  |   private static buildPathFull: string; | 
					
						
							|  |  |  |   private static builderPathFull: string; | 
					
						
							|  |  |  |   private static steamPathFull: string; | 
					
						
							|  |  |  |   private static repoPathFull: string; | 
					
						
							|  |  |  |   private static projectPathFull: string; | 
					
						
							|  |  |  |   private static libraryFolderFull: string; | 
					
						
							| 
									
										
										
										
											2021-08-15 21:32:43 +00:00
										 |  |  |   private static cacheFolderFull: string; | 
					
						
							| 
									
										
										
										
											2021-08-21 19:01:53 +00:00
										 |  |  |   private static lfsDirectory: string; | 
					
						
							|  |  |  |   private static purgeRemoteCaching: boolean; | 
					
						
							|  |  |  |   private static CloudRunnerBranch: string; | 
					
						
							|  |  |  |   private static unityBuilderRepoUrl: string; | 
					
						
							|  |  |  |   private static targetBuildRepoUrl: string; | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |   private static readonly defaultGitShaEnvironmentVariable = [ | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       name: 'GITHUB_SHA', | 
					
						
							|  |  |  |       value: process.env.GITHUB_SHA || '', | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |   private static setup(buildParameters: BuildParameters) { | 
					
						
							| 
									
										
										
										
											2021-09-21 18:27:04 +00:00
										 |  |  |     CloudRunnerLogger.setup(); | 
					
						
							| 
									
										
										
										
											2021-08-17 22:13:46 +00:00
										 |  |  |     CloudRunner.buildGuid = CloudRunnerNamespace.generateBuildName( | 
					
						
							| 
									
										
										
										
											2021-08-17 20:09:42 +00:00
										 |  |  |       CloudRunner.readRunNumber(), | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |       buildParameters.platform, | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2021-08-17 20:09:42 +00:00
										 |  |  |     CloudRunner.buildParams = buildParameters; | 
					
						
							|  |  |  |     CloudRunner.setupBranchName(); | 
					
						
							|  |  |  |     CloudRunner.setupFolderVariables(); | 
					
						
							|  |  |  |     CloudRunner.setupDefaultSecrets(); | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |     CloudRunner.setupBuildPlatform(); | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-15 14:23:18 +00:00
										 |  |  |   private static setupFolderVariables() { | 
					
						
							| 
									
										
										
										
											2021-08-15 21:59:58 +00:00
										 |  |  |     this.buildPathFull = `/${buildVolumeFolder}/${this.buildGuid}`; | 
					
						
							| 
									
										
										
										
											2021-08-15 14:23:18 +00:00
										 |  |  |     this.builderPathFull = `${this.buildPathFull}/builder`; | 
					
						
							|  |  |  |     this.steamPathFull = `${this.buildPathFull}/steam`; | 
					
						
							|  |  |  |     this.repoPathFull = `${this.buildPathFull}/${repositoryFolder}`; | 
					
						
							|  |  |  |     this.projectPathFull = `${this.repoPathFull}/${this.buildParams.projectPath}`; | 
					
						
							|  |  |  |     this.libraryFolderFull = `${this.projectPathFull}/Library`; | 
					
						
							| 
									
										
										
										
											2021-08-15 21:32:43 +00:00
										 |  |  |     this.cacheFolderFull = `/${buildVolumeFolder}/${cacheFolder}/${this.branchName}`; | 
					
						
							| 
									
										
										
										
											2021-08-21 19:01:53 +00:00
										 |  |  |     this.lfsDirectory = `${this.repoPathFull}/.git/lfs`; | 
					
						
							|  |  |  |     this.purgeRemoteCaching = process.env.PURGE_REMOTE_BUILDER_CACHE !== undefined; | 
					
						
							|  |  |  |     this.CloudRunnerBranch = process.env.CloudRunnerBranch ? `--branch "${process.env.CloudRunnerBranch}"` : ''; | 
					
						
							|  |  |  |     this.unityBuilderRepoUrl = `https://${this.buildParams.githubToken}@github.com/game-ci/unity-builder.git`; | 
					
						
							|  |  |  |     this.targetBuildRepoUrl = `https://${this.buildParams.githubToken}@github.com/${process.env.GITHUB_REPOSITORY}.git`; | 
					
						
							| 
									
										
										
										
											2021-08-15 14:23:18 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-21 19:01:53 +00:00
										 |  |  |   private static getHandleCachingCommand() { | 
					
						
							|  |  |  |     return `${this.builderPathFull}/dist/cloud-runner/handleCaching.sh "${this.cacheFolderFull}" "${this.libraryFolderFull}" "${this.lfsDirectory}" "${this.purgeRemoteCaching}"`; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-21 19:01:53 +00:00
										 |  |  |   private static getCloneNoLFSCommand() { | 
					
						
							| 
									
										
										
										
											2021-08-21 19:49:52 +00:00
										 |  |  |     return `${this.builderPathFull}/dist/cloud-runner/cloneNoLFS.sh "${this.repoPathFull}" "${this.targetBuildRepoUrl}"`; | 
					
						
							| 
									
										
										
										
											2021-08-21 19:01:53 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-21 19:01:53 +00:00
										 |  |  |   private static getCloneBuilder() { | 
					
						
							|  |  |  |     return `git clone -q ${this.CloudRunnerBranch} ${this.unityBuilderRepoUrl} ${this.builderPathFull}`; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |   static async run(buildParameters: BuildParameters, baseImage) { | 
					
						
							|  |  |  |     CloudRunner.setup(buildParameters); | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       await CloudRunner.setupSharedBuildResources(); | 
					
						
							|  |  |  |       await CloudRunner.setupStep(); | 
					
						
							|  |  |  |       await CloudRunner.runMainJob(baseImage); | 
					
						
							|  |  |  |       await CloudRunner.cleanupSharedBuildResources(); | 
					
						
							|  |  |  |     } catch (error) { | 
					
						
							|  |  |  |       await CloudRunner.handleException(error); | 
					
						
							|  |  |  |       throw error; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |   private static async setupSharedBuildResources() { | 
					
						
							|  |  |  |     await this.CloudRunnerProviderPlatform.setupSharedBuildResources( | 
					
						
							| 
									
										
										
										
											2021-08-15 21:59:58 +00:00
										 |  |  |       this.buildGuid, | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |       this.buildParams, | 
					
						
							|  |  |  |       this.branchName, | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |       this.defaultSecrets, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private static setupBuildPlatform() { | 
					
						
							| 
									
										
										
										
											2021-08-17 22:13:46 +00:00
										 |  |  |     switch (this.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'); | 
					
						
							| 
									
										
										
										
											2021-08-17 22:13:46 +00:00
										 |  |  |         this.CloudRunnerProviderPlatform = new AWSBuildPlatform(this.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'); | 
					
						
							| 
									
										
										
										
											2021-08-17 22:13:46 +00:00
										 |  |  |         this.CloudRunnerProviderPlatform = new Kubernetes(this.buildParams); | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private static readRunNumber() { | 
					
						
							|  |  |  |     const runNumber = process.env.GITHUB_RUN_NUMBER; | 
					
						
							|  |  |  |     if (!runNumber || runNumber === '') { | 
					
						
							|  |  |  |       throw new Error('no run number found, exiting'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return runNumber; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-15 14:23:18 +00:00
										 |  |  |   private static setupBranchName() { | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |     const defaultBranchName = | 
					
						
							|  |  |  |       process.env.GITHUB_REF?.split('/') | 
					
						
							|  |  |  |         .filter((x) => { | 
					
						
							|  |  |  |           x = x[0].toUpperCase() + x.slice(1); | 
					
						
							|  |  |  |           return x; | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         .join('') || ''; | 
					
						
							|  |  |  |     this.branchName = | 
					
						
							|  |  |  |       process.env.REMOTE_BUILDER_CACHE !== undefined ? process.env.REMOTE_BUILDER_CACHE : defaultBranchName; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-15 14:23:18 +00:00
										 |  |  |   private static setupDefaultSecrets() { | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |     this.defaultSecrets = [ | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         ParameterKey: 'GithubToken', | 
					
						
							|  |  |  |         EnvironmentVariable: 'GITHUB_TOKEN', | 
					
						
							|  |  |  |         ParameterValue: this.buildParams.githubToken, | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2021-08-15 13:46:18 +00:00
										 |  |  |       { | 
					
						
							|  |  |  |         ParameterKey: 'branch', | 
					
						
							|  |  |  |         EnvironmentVariable: 'branch', | 
					
						
							|  |  |  |         ParameterValue: this.branchName, | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2021-08-15 13:58:44 +00:00
										 |  |  |       { | 
					
						
							|  |  |  |         ParameterKey: 'buildPathFull', | 
					
						
							|  |  |  |         EnvironmentVariable: 'buildPathFull', | 
					
						
							|  |  |  |         ParameterValue: this.buildPathFull, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         ParameterKey: 'projectPathFull', | 
					
						
							|  |  |  |         EnvironmentVariable: 'projectPathFull', | 
					
						
							|  |  |  |         ParameterValue: this.projectPathFull, | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2021-08-15 15:01:15 +00:00
										 |  |  |       { | 
					
						
							|  |  |  |         ParameterKey: 'libraryFolderFull', | 
					
						
							|  |  |  |         EnvironmentVariable: 'libraryFolderFull', | 
					
						
							|  |  |  |         ParameterValue: this.libraryFolderFull, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         ParameterKey: 'builderPathFull', | 
					
						
							|  |  |  |         EnvironmentVariable: 'builderPathFull', | 
					
						
							|  |  |  |         ParameterValue: this.builderPathFull, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         ParameterKey: 'repoPathFull', | 
					
						
							|  |  |  |         EnvironmentVariable: 'repoPathFull', | 
					
						
							|  |  |  |         ParameterValue: this.repoPathFull, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         ParameterKey: 'steamPathFull', | 
					
						
							|  |  |  |         EnvironmentVariable: 'steamPathFull', | 
					
						
							|  |  |  |         ParameterValue: this.steamPathFull, | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |     ]; | 
					
						
							| 
									
										
										
										
											2021-08-15 18:06:54 +00:00
										 |  |  |     this.defaultSecrets.push( | 
					
						
							|  |  |  |       ...ImageEnvironmentFactory.getEnvironmentVariables(this.buildParams).map((x) => { | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |           ParameterKey: x.name, | 
					
						
							|  |  |  |           EnvironmentVariable: x.name, | 
					
						
							|  |  |  |           ParameterValue: x.value, | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }), | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-17 22:13:46 +00:00
										 |  |  |   private static readBuildEnvironmentVariables(): CloudRunnerEnvironmentVariable[] { | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |     return [ | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: 'ContainerMemory', | 
					
						
							| 
									
										
										
										
											2021-08-17 22:13:46 +00:00
										 |  |  |         value: this.buildParams.cloudRunnerMemory, | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: 'ContainerCpu', | 
					
						
							| 
									
										
										
										
											2021-08-17 22:13:46 +00:00
										 |  |  |         value: this.buildParams.cloudRunnerCpu, | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: 'GITHUB_WORKSPACE', | 
					
						
							| 
									
										
										
										
											2021-08-15 21:59:58 +00:00
										 |  |  |         value: `/${buildVolumeFolder}/${this.buildGuid}/${repositoryFolder}/`, | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: 'PROJECT_PATH', | 
					
						
							|  |  |  |         value: this.buildParams.projectPath, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: 'BUILD_PATH', | 
					
						
							|  |  |  |         value: this.buildParams.buildPath, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: 'BUILD_FILE', | 
					
						
							|  |  |  |         value: this.buildParams.buildFile, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: 'BUILD_NAME', | 
					
						
							|  |  |  |         value: this.buildParams.buildName, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: 'BUILD_METHOD', | 
					
						
							|  |  |  |         value: this.buildParams.buildMethod, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: 'CUSTOM_PARAMETERS', | 
					
						
							|  |  |  |         value: this.buildParams.customParameters, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: 'BUILD_TARGET', | 
					
						
							|  |  |  |         value: this.buildParams.platform, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: 'ANDROID_VERSION_CODE', | 
					
						
							|  |  |  |         value: this.buildParams.androidVersionCode.toString(), | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: 'ANDROID_KEYSTORE_NAME', | 
					
						
							|  |  |  |         value: this.buildParams.androidKeystoreName, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: 'ANDROID_KEYALIAS_NAME', | 
					
						
							|  |  |  |         value: this.buildParams.androidKeyaliasName, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ]; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |   private static async runMainJob(baseImage: any) { | 
					
						
							| 
									
										
										
										
											2021-09-22 19:15:41 +00:00
										 |  |  |     if (this.buildParams.customBuildSteps === '') { | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |       await CloudRunner.standardBuildAutomation(baseImage); | 
					
						
							| 
									
										
										
										
											2021-09-22 19:42:45 +00:00
										 |  |  |     } else if (this.buildParams.customBuildSteps === 'ephemeral') { | 
					
						
							|  |  |  |       await CloudRunner.runJobAsEphemeralGitHubRunner(baseImage); | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |     } else { | 
					
						
							|  |  |  |       await CloudRunner.runCustomJob(this.buildParams.customBuildSteps); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private static async standardBuildAutomation(baseImage: any) { | 
					
						
							| 
									
										
										
										
											2021-09-22 19:42:45 +00:00
										 |  |  |     CloudRunnerLogger.log(`Cloud Runner is running in standard build automation mode`); | 
					
						
							| 
									
										
										
										
											2021-09-21 18:27:04 +00:00
										 |  |  |     CloudRunnerLogger.logWithTime('Pre build steps time'); | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |     await this.runCustomJob(this.buildParams.preBuildSteps); | 
					
						
							| 
									
										
										
										
											2021-09-21 18:27:04 +00:00
										 |  |  |     CloudRunnerLogger.logWithTime('Setup time'); | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |     await CloudRunner.BuildStep(baseImage); | 
					
						
							| 
									
										
										
										
											2021-09-21 18:27:04 +00:00
										 |  |  |     CloudRunnerLogger.logWithTime('Build time'); | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |     await CloudRunner.CompressionStep(); | 
					
						
							| 
									
										
										
										
											2021-09-21 18:27:04 +00:00
										 |  |  |     CloudRunnerLogger.logWithTime('Compression time'); | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |     await this.runCustomJob(this.buildParams.postBuildSteps); | 
					
						
							| 
									
										
										
										
											2021-09-21 18:27:04 +00:00
										 |  |  |     CloudRunnerLogger.logWithTime('Post build steps time'); | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-09-22 19:42:45 +00:00
										 |  |  |   private static async runJobAsEphemeralGitHubRunner(baseImage: any) { | 
					
						
							|  |  |  |     CloudRunnerLogger.log(`Cloud Runner is running in ephemeral GitHub runner mode`); | 
					
						
							|  |  |  |     const installAndStartRunner = | 
					
						
							|  |  |  |       'mkdir actions-runner && cd actions-runner && curl -O -L https://github.com/actions/runner/releases/download/v2.283.1/actions-runner-linux-x64-2.283.1.tar.gz && tar xzf ./actions-runner-linux-x64-2.283.1.tar.gz'; | 
					
						
							|  |  |  |     await this.CloudRunnerProviderPlatform.runBuildTask( | 
					
						
							|  |  |  |       this.buildGuid, | 
					
						
							|  |  |  |       baseImage, | 
					
						
							|  |  |  |       [installAndStartRunner], | 
					
						
							|  |  |  |       `/${buildVolumeFolder}`, | 
					
						
							|  |  |  |       `/${buildVolumeFolder}`, | 
					
						
							|  |  |  |       this.defaultGitShaEnvironmentVariable, | 
					
						
							|  |  |  |       [...this.defaultSecrets], | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |   private static async runCustomJob(buildSteps) { | 
					
						
							| 
									
										
										
										
											2021-09-22 19:42:45 +00:00
										 |  |  |     CloudRunnerLogger.log(`Cloud Runner is running in custom job mode`); | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |     buildSteps = YAML.parse(buildSteps); | 
					
						
							|  |  |  |     for (const step of buildSteps) { | 
					
						
							|  |  |  |       const stepSecrets: CloudRunnerSecret[] = step.secrets.map((x) => { | 
					
						
							|  |  |  |         const secret: CloudRunnerSecret = { | 
					
						
							|  |  |  |           ParameterKey: x.name, | 
					
						
							|  |  |  |           EnvironmentVariable: x.name, | 
					
						
							|  |  |  |           ParameterValue: x.value, | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         return secret; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       await this.CloudRunnerProviderPlatform.runBuildTask( | 
					
						
							|  |  |  |         this.buildGuid, | 
					
						
							|  |  |  |         step['image'], | 
					
						
							|  |  |  |         step['commands'], | 
					
						
							|  |  |  |         `/${buildVolumeFolder}`, | 
					
						
							|  |  |  |         `/${buildVolumeFolder}`, | 
					
						
							| 
									
										
										
										
											2021-08-21 23:29:27 +00:00
										 |  |  |         this.defaultGitShaEnvironmentVariable, | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |         [...this.defaultSecrets, ...stepSecrets], | 
					
						
							| 
									
										
										
										
											2021-09-22 19:15:41 +00:00
										 |  |  |       ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private static async runEphemeralRegistrationJob(buildSteps) { | 
					
						
							|  |  |  |     buildSteps = YAML.parse(buildSteps); | 
					
						
							|  |  |  |     for (const step of buildSteps) { | 
					
						
							|  |  |  |       const stepSecrets: CloudRunnerSecret[] = step.secrets.map((x) => { | 
					
						
							|  |  |  |         const secret: CloudRunnerSecret = { | 
					
						
							|  |  |  |           ParameterKey: x.name, | 
					
						
							|  |  |  |           EnvironmentVariable: x.name, | 
					
						
							|  |  |  |           ParameterValue: x.value, | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         return secret; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       await this.CloudRunnerProviderPlatform.runBuildTask( | 
					
						
							|  |  |  |         this.buildGuid, | 
					
						
							|  |  |  |         step['image'], | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |           'mkdir actions-runner && cd actions-runner && curl -O -L https://github.com/actions/runner/releases/download/v2.283.1/actions-runner-linux-x64-2.283.1.tar.gz && tar xzf ./actions-runner-linux-x64-2.283.1.tar.gz && ls', | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         `/${buildVolumeFolder}`, | 
					
						
							|  |  |  |         `/${buildVolumeFolder}`, | 
					
						
							|  |  |  |         this.defaultGitShaEnvironmentVariable, | 
					
						
							|  |  |  |         [...this.defaultSecrets, ...stepSecrets], | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |       ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private static async setupStep() { | 
					
						
							| 
									
										
										
										
											2021-09-21 18:27:04 +00:00
										 |  |  |     CloudRunnerLogger.log('Starting step 1/4 clone and restore cache)'); | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |     await this.CloudRunnerProviderPlatform.runBuildTask( | 
					
						
							|  |  |  |       this.buildGuid, | 
					
						
							|  |  |  |       'alpine/git', | 
					
						
							|  |  |  |       [ | 
					
						
							|  |  |  |         ` printenv
 | 
					
						
							|  |  |  |           apk update -q | 
					
						
							|  |  |  |           apk add unzip zip git-lfs jq tree -q | 
					
						
							|  |  |  |           mkdir -p ${this.buildPathFull} | 
					
						
							|  |  |  |           mkdir -p ${this.builderPathFull} | 
					
						
							|  |  |  |           mkdir -p ${this.repoPathFull} | 
					
						
							|  |  |  |           ${this.getCloneBuilder()} | 
					
						
							|  |  |  |           echo ' ' | 
					
						
							|  |  |  |           echo 'Initializing source repository for cloning with caching of LFS files' | 
					
						
							|  |  |  |           ${this.getCloneNoLFSCommand()} | 
					
						
							|  |  |  |           echo 'Source repository initialized' | 
					
						
							|  |  |  |           echo ' ' | 
					
						
							|  |  |  |           echo 'Starting checks of cache for the Unity project Library and git LFS files' | 
					
						
							|  |  |  |           ${this.getHandleCachingCommand()} | 
					
						
							|  |  |  |       `,
 | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       `/${buildVolumeFolder}`, | 
					
						
							|  |  |  |       `/${buildVolumeFolder}/`, | 
					
						
							|  |  |  |       CloudRunner.defaultGitShaEnvironmentVariable, | 
					
						
							|  |  |  |       this.defaultSecrets, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private static async BuildStep(baseImage: any) { | 
					
						
							| 
									
										
										
										
											2021-09-21 18:27:04 +00:00
										 |  |  |     CloudRunnerLogger.log('Starting part 2/4 (build unity project)'); | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |     await this.CloudRunnerProviderPlatform.runBuildTask( | 
					
						
							|  |  |  |       this.buildGuid, | 
					
						
							|  |  |  |       baseImage.toString(), | 
					
						
							|  |  |  |       [ | 
					
						
							|  |  |  |         `
 | 
					
						
							|  |  |  |             printenv | 
					
						
							|  |  |  |             export GITHUB_WORKSPACE="${this.repoPathFull}" | 
					
						
							|  |  |  |             cp -r "${this.builderPathFull}/dist/default-build-script/" "/UnityBuilderAction" | 
					
						
							|  |  |  |             cp -r "${this.builderPathFull}/dist/entrypoint.sh" "/entrypoint.sh" | 
					
						
							|  |  |  |             cp -r "${this.builderPathFull}/dist/steps/" "/steps" | 
					
						
							|  |  |  |             chmod -R +x "/entrypoint.sh" | 
					
						
							|  |  |  |             chmod -R +x "/steps" | 
					
						
							|  |  |  |             /entrypoint.sh | 
					
						
							|  |  |  |             ${process.env.DEBUG ? '' : '#'}tree -L 4 "${this.buildPathFull}" | 
					
						
							|  |  |  |             ${process.env.DEBUG ? '' : '#'}ls -lh "/${buildVolumeFolder}" | 
					
						
							|  |  |  |           `,
 | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       `/${buildVolumeFolder}`, | 
					
						
							|  |  |  |       `/${this.projectPathFull}`, | 
					
						
							|  |  |  |       CloudRunner.readBuildEnvironmentVariables(), | 
					
						
							|  |  |  |       this.defaultSecrets, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private static async CompressionStep() { | 
					
						
							| 
									
										
										
										
											2021-09-21 18:27:04 +00:00
										 |  |  |     CloudRunnerLogger.log('Starting step 3/4 build compression'); | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |     // Cleanup
 | 
					
						
							|  |  |  |     await this.CloudRunnerProviderPlatform.runBuildTask( | 
					
						
							|  |  |  |       this.buildGuid, | 
					
						
							|  |  |  |       'alpine', | 
					
						
							|  |  |  |       [ | 
					
						
							|  |  |  |         `
 | 
					
						
							|  |  |  |             printenv | 
					
						
							|  |  |  |             apk update -q | 
					
						
							|  |  |  |             apk add zip tree -q | 
					
						
							|  |  |  |             ${process.env.DEBUG ? '' : '#'}tree -L 4 "$repoPathFull" | 
					
						
							|  |  |  |             ${process.env.DEBUG ? '' : '#'}ls -lh "$repoPathFull" | 
					
						
							|  |  |  |             cd "$libraryFolderFull/.." | 
					
						
							|  |  |  |             zip -r "lib-$BUILDID.zip" "./Library" | 
					
						
							|  |  |  |             mv "lib-$BUILDID.zip" "/$cacheFolderFull/lib" | 
					
						
							|  |  |  |             cd "$repoPathFull" | 
					
						
							|  |  |  |             ls -lh "$repoPathFull" | 
					
						
							|  |  |  |             zip -r "build-$BUILDID.zip" "./${CloudRunner.buildParams.buildPath}" | 
					
						
							|  |  |  |             mv "build-$BUILDID.zip" "/$cacheFolderFull/build-$BUILDID.zip" | 
					
						
							|  |  |  |             ${process.env.DEBUG ? '' : '#'}tree -L 4 "/$cacheFolderFull" | 
					
						
							|  |  |  |             ${process.env.DEBUG ? '' : '#'}tree -L 4 "/$cacheFolderFull/.." | 
					
						
							|  |  |  |             ${process.env.DEBUG ? '' : '#'}tree -L 4 "$repoPathFull" | 
					
						
							|  |  |  |             ${process.env.DEBUG ? '' : '#'}ls -lh "$repoPathFull" | 
					
						
							|  |  |  |           `,
 | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       `/${buildVolumeFolder}`, | 
					
						
							|  |  |  |       `/${buildVolumeFolder}`, | 
					
						
							|  |  |  |       [ | 
					
						
							| 
									
										
										
										
											2021-08-21 23:29:27 +00:00
										 |  |  |         ...CloudRunner.defaultGitShaEnvironmentVariable, | 
					
						
							|  |  |  |         ...[ | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'cacheFolderFull', | 
					
						
							|  |  |  |             value: this.cacheFolderFull, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         ], | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |       ], | 
					
						
							|  |  |  |       this.defaultSecrets, | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2021-09-21 18:27:04 +00:00
										 |  |  |     CloudRunnerLogger.log('compression step complete'); | 
					
						
							| 
									
										
										
										
											2021-08-21 23:26:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private static async cleanupSharedBuildResources() { | 
					
						
							|  |  |  |     await this.CloudRunnerProviderPlatform.cleanupSharedBuildResources( | 
					
						
							|  |  |  |       this.buildGuid, | 
					
						
							|  |  |  |       this.buildParams, | 
					
						
							|  |  |  |       this.branchName, | 
					
						
							|  |  |  |       this.defaultSecrets, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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'); | 
					
						
							| 
									
										
										
										
											2021-08-17 22:13:46 +00:00
										 |  |  |     await this.CloudRunnerProviderPlatform.cleanupSharedBuildResources( | 
					
						
							| 
									
										
										
										
											2021-08-15 21:59:58 +00:00
										 |  |  |       this.buildGuid, | 
					
						
							| 
									
										
										
										
											2021-08-01 23:43:20 +00:00
										 |  |  |       this.buildParams, | 
					
						
							|  |  |  |       this.branchName, | 
					
						
							|  |  |  |       this.defaultSecrets, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-08-17 20:09:42 +00:00
										 |  |  | export default CloudRunner; |