From 0379bceff3693cc905442d80639b88b1324d20f6 Mon Sep 17 00:00:00 2001 From: Webber Date: Sat, 20 Aug 2022 21:34:41 +0200 Subject: [PATCH] chore: debug build process for windows --- src/commands/command/unity/build-command.ts | 26 +++++++--------- .../command/unity/build-remote-command.ts | 2 +- src/index.ts | 3 +- .../unity}/platform-setup/index.ts | 0 .../unity}/platform-setup/setup-mac.ts | 4 +-- .../unity}/platform-setup/setup-windows.ts | 4 +-- .../platform-validation/validate-windows.ts | 30 ++++++++++++------- .../cloud-runner/error/cloud-runner-error.ts | 5 +++- .../providers/aws/aws-task-runner.ts | 2 +- .../services/cloud-runner-system.ts | 6 ++-- .../services/follow-log-stream-service.ts | 4 +-- src/model/input.ts | 3 +- src/model/parameters.ts | 2 +- src/model/platform-setup.ts | 4 +-- src/modules/actions/core.ts | 5 ---- 15 files changed, 53 insertions(+), 47 deletions(-) rename src/{model => logic/unity}/platform-setup/index.ts (100%) rename src/{model => logic/unity}/platform-setup/setup-mac.ts (96%) rename src/{model => logic/unity}/platform-setup/setup-windows.ts (89%) rename src/{model => logic/unity}/platform-validation/validate-windows.ts (62%) diff --git a/src/commands/command/unity/build-command.ts b/src/commands/command/unity/build-command.ts index 5e98233e..1e655aba 100644 --- a/src/commands/command/unity/build-command.ts +++ b/src/commands/command/unity/build-command.ts @@ -1,9 +1,8 @@ import { exec, OutputMode } from 'https://deno.land/x/exec@0.0.5/mod.ts'; import { CommandInterface } from '../command-interface.ts'; import { Options } from '../../../config/options.ts'; -import { Action, Cache, CloudRunner, Docker, ImageTag, Input, Output } from '../../../model/index.ts'; +import { Action, Cache, Docker, ImageTag, Input, Output } from '../../../model/index.ts'; import PlatformSetup from '../../../model/platform-setup.ts'; -import { core, process } from '../../../dependencies.ts'; import MacBuilder from '../../../model/mac-builder.ts'; import Parameters from '../../../model/parameters.ts'; @@ -19,31 +18,28 @@ export class BuildCommand implements CommandInterface { public async execute(options: Options): Promise { try { const { workspace, actionFolder } = Action; - const { buildParameters } = options; + const { parameters, env } = options; Action.checkCompatibility(); Cache.verify(); - const baseImage = new ImageTag(buildParameters); + const baseImage = new ImageTag(parameters); log.debug('baseImage', baseImage); - if (buildParameters.cloudRunnerCluster !== 'local') { - await CloudRunner.run(buildParameters, baseImage.toString()); + await PlatformSetup.setup(parameters, actionFolder); + log.info('Platform setup done.'); + log.info('OS:', env.getOS()); + if (env.getOS() === 'darwin') { + MacBuilder.run(actionFolder, workspace, parameters); } else { - log.info('Building locally'); - await PlatformSetup.setup(buildParameters, actionFolder); - if (process.platform === 'darwin') { - MacBuilder.run(actionFolder, workspace, buildParameters); - } else { - await Docker.run(baseImage, { workspace, actionFolder, ...buildParameters }); - } + await Docker.run(baseImage, { workspace, actionFolder, ...parameters }); } // Set output - await Output.setBuildVersion(buildParameters.buildVersion); + await Output.setBuildVersion(parameters.buildVersion); } catch (error) { log.error(error); - core.setFailed((error as Error).message); + Deno.exit(1); } const result = await exec('docker run -it unityci/editor:2020.3.15f2-base-1 /bin/bash -c "echo test"', { diff --git a/src/commands/command/unity/build-remote-command.ts b/src/commands/command/unity/build-remote-command.ts index d7542046..de203192 100644 --- a/src/commands/command/unity/build-remote-command.ts +++ b/src/commands/command/unity/build-remote-command.ts @@ -64,7 +64,7 @@ export class BuildRemoteCommand implements CommandInterface { return status.success; } catch (error) { log.error(error); - core.setFailed((error as Error).message); + Deno.exit(1); } } } diff --git a/src/index.ts b/src/index.ts index c05a2904..a1962b92 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ -import { configureLogger, Verbosity } from './core/logger/index.ts'; +import './dependencies.ts'; +import { configureLogger } from './core/logger/index.ts'; import { Options } from './config/options.ts'; import { CommandFactory } from './commands/command-factory.ts'; import { ArgumentsParser } from './core/cli/arguments-parser.ts'; diff --git a/src/model/platform-setup/index.ts b/src/logic/unity/platform-setup/index.ts similarity index 100% rename from src/model/platform-setup/index.ts rename to src/logic/unity/platform-setup/index.ts diff --git a/src/model/platform-setup/setup-mac.ts b/src/logic/unity/platform-setup/setup-mac.ts similarity index 96% rename from src/model/platform-setup/setup-mac.ts rename to src/logic/unity/platform-setup/setup-mac.ts index e8993086..ece1c076 100644 --- a/src/model/platform-setup/setup-mac.ts +++ b/src/logic/unity/platform-setup/setup-mac.ts @@ -1,5 +1,5 @@ -import { Parameters } from '../index.ts'; -import { fsSync as fs, exec, getUnityChangeSet } from '../../dependencies.ts'; +import { Parameters } from '../../../model/index.ts'; +import { fsSync as fs, exec, getUnityChangeSet } from '../../../dependencies.ts'; class SetupMac { static unityHubPath = `"/Applications/Unity Hub.app/Contents/MacOS/Unity Hub"`; diff --git a/src/model/platform-setup/setup-windows.ts b/src/logic/unity/platform-setup/setup-windows.ts similarity index 89% rename from src/model/platform-setup/setup-windows.ts rename to src/logic/unity/platform-setup/setup-windows.ts index 690ddf3d..78bfa86a 100644 --- a/src/model/platform-setup/setup-windows.ts +++ b/src/logic/unity/platform-setup/setup-windows.ts @@ -1,5 +1,5 @@ -import { fsSync as fs, exec } from '../../dependencies.ts'; -import { Parameters } from '../index.ts'; +import { fsSync as fs, exec } from '../../../dependencies.ts'; +import { Parameters } from '../../../model/index.ts'; class SetupWindows { public static async setup(buildParameters: Parameters) { diff --git a/src/model/platform-validation/validate-windows.ts b/src/logic/unity/platform-validation/validate-windows.ts similarity index 62% rename from src/model/platform-validation/validate-windows.ts rename to src/logic/unity/platform-validation/validate-windows.ts index a36348a9..78b46d70 100644 --- a/src/model/platform-validation/validate-windows.ts +++ b/src/logic/unity/platform-validation/validate-windows.ts @@ -1,13 +1,15 @@ -import { fsSync as fs } from '../../dependencies.ts'; -import { Parameters } from '../index.ts'; +import { fsSync as fs } from '../../../dependencies.ts'; +import { Parameters } from '../../../model/index.ts'; class ValidateWindows { public static validate(buildParameters: Parameters) { ValidateWindows.validateWindowsPlatformRequirements(buildParameters.targetPlatform); if (!(Deno.env.get('UNITY_EMAIL') && Deno.env.get('UNITY_PASSWORD'))) { - throw new Error(`Unity email and password must be set for Windows based builds to - authenticate the license. Make sure to set them inside UNITY_EMAIL - and UNITY_PASSWORD in Github Secrets and pass them into the environment.`); + throw new Error(String.dedent` + Unity email and password must be set for Windows based builds to authenticate the license. + + Make sure to set them inside UNITY_EMAIL and UNITY_PASSWORD in Github Secrets and pass them into the environment. + `); } } @@ -35,9 +37,11 @@ class ValidateWindows { // Check for Windows 10 SDK on runner const windows10SDKPathExists = fs.existsSync('C:/Program Files (x86)/Windows Kits'); if (!windows10SDKPathExists) { - throw new Error(`Windows 10 SDK not found in default location. Make sure - the runner has a Windows 10 SDK installed in the default - location.`); + throw new Error(String.dedent` + Windows 10 SDK not found in default location. Make sure this machine has a Windows 10 SDK installed. + + Download here: https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/ + `); } } @@ -47,9 +51,13 @@ class ValidateWindows { const visualStudioDataPathExists = fs.existsSync('C:/ProgramData/Microsoft/VisualStudio'); if (!visualStudioInstallPathExists || !visualStudioDataPathExists) { - throw new Error(`Visual Studio not found at the default location. - Make sure the runner has Visual Studio installed in the - default location`); + throw new Error(String.dedent` + Visual Studio not found at the default location. + + Make sure the runner has Visual Studio installed in the default location + + Download here: https://visualstudio.microsoft.com/downloads/ + `); } } } diff --git a/src/model/cloud-runner/error/cloud-runner-error.ts b/src/model/cloud-runner/error/cloud-runner-error.ts index c9b2a629..73a98105 100644 --- a/src/model/cloud-runner/error/cloud-runner-error.ts +++ b/src/model/cloud-runner/error/cloud-runner-error.ts @@ -5,12 +5,15 @@ import CloudRunner from '../cloud-runner.ts'; export class CloudRunnerError { public static async handleException(error: unknown) { CloudRunnerLogger.error(JSON.stringify(error, undefined, 4)); - core.setFailed('Cloud Runner failed'); + log.error('Cloud runner failed'); + await CloudRunner.Provider.cleanup( CloudRunner.buildParameters.buildGuid, CloudRunner.buildParameters, CloudRunner.buildParameters.branch, CloudRunner.defaultSecrets, ); + + Deno.exit(1); } } diff --git a/src/model/cloud-runner/providers/aws/aws-task-runner.ts b/src/model/cloud-runner/providers/aws/aws-task-runner.ts index edeacc23..424e89f0 100644 --- a/src/model/cloud-runner/providers/aws/aws-task-runner.ts +++ b/src/model/cloud-runner/providers/aws/aws-task-runner.ts @@ -91,8 +91,8 @@ class AWSTaskRunner { const tasksDescription = await AWSTaskRunner.describeTasks(ECS, cluster, taskArn); CloudRunnerLogger.log(`Cloud runner job has ended ${tasksDescription.containers?.[0].lastStatus}`); - core.setFailed(error); log.error(error); + Deno.exit(1); } } diff --git a/src/model/cloud-runner/services/cloud-runner-system.ts b/src/model/cloud-runner/services/cloud-runner-system.ts index d41b3563..1ced6c9d 100644 --- a/src/model/cloud-runner/services/cloud-runner-system.ts +++ b/src/model/cloud-runner/services/cloud-runner-system.ts @@ -1,5 +1,5 @@ -import { exec } from '../../../dependencies.ts'; import { RemoteClientLogger } from '../remote-client/remote-client-logger.ts'; +import { spawn } from 'https://deno.land/std@0.152.0/node/child_process.ts'; export class CloudRunnerSystem { public static async Run(command: string, suppressError = false, suppressLogs = false) { @@ -11,7 +11,9 @@ export class CloudRunnerSystem { return await new Promise((promise, throwError) => { let output = ''; - const child = exec(command, (error, stdout, stderr) => { + + // Todo - find Deno variant of child_process or rewrite this method to use execSync + const child = spawn(command, (error, stdout, stderr) => { if (!suppressError && error) { RemoteClientLogger.log(error.toString()); throwError(error); diff --git a/src/model/cloud-runner/services/follow-log-stream-service.ts b/src/model/cloud-runner/services/follow-log-stream-service.ts index 513f4f33..357590fa 100644 --- a/src/model/cloud-runner/services/follow-log-stream-service.ts +++ b/src/model/cloud-runner/services/follow-log-stream-service.ts @@ -15,8 +15,8 @@ export class FollowLogStreamService { core.setOutput('build-result', 'success'); } else if (message.includes('Build fail')) { core.setOutput('build-result', 'failed'); - core.setFailed('unity build failed'); - log.error('BUILD FAILED!'); + log.error('build-result: failed'); + Deno.exit(1); } else if (CloudRunner.buildParameters.cloudRunnerIntegrationTests && message.includes(': Listening for Jobs')) { core.setOutput('cloud runner stop watching', 'true'); shouldReadLogs = false; diff --git a/src/model/input.ts b/src/model/input.ts index 907bc1c0..f86adbad 100644 --- a/src/model/input.ts +++ b/src/model/input.ts @@ -248,7 +248,8 @@ class Input { return this.getInput('awsBaseStackName') || 'game-ci'; } - public get cloudRunnerCluster() { + // Todo - move to parameters + public static get cloudRunnerCluster() { if (Cli.isCliMode) { return this.getInput('cloudRunnerCluster') || 'aws'; } diff --git a/src/model/parameters.ts b/src/model/parameters.ts index f67f8ab9..ecca5f90 100644 --- a/src/model/parameters.ts +++ b/src/model/parameters.ts @@ -84,7 +84,7 @@ class Parameters { ); log.debug('buildFile:', buildFile); const editorVersion = UnityVersioning.determineUnityVersion(this.input.projectPath, this.input.unityVersion); - log.debug('editorVersion:', editorVersion); + log.info('Detected editorVersion', editorVersion); const buildVersion = await Versioning.determineBuildVersion( this.input.versioningStrategy, this.input.specifiedVersion, diff --git a/src/model/platform-setup.ts b/src/model/platform-setup.ts index c7e537b5..289d21ea 100644 --- a/src/model/platform-setup.ts +++ b/src/model/platform-setup.ts @@ -1,6 +1,6 @@ import { Parameters } from './index.ts'; -import { SetupMac, SetupWindows } from './platform-setup/index.ts'; -import ValidateWindows from './platform-validation/validate-windows.ts'; +import { SetupMac, SetupWindows } from '../logic/unity/platform-setup/index.ts'; +import ValidateWindows from '../logic/unity/platform-validation/validate-windows.ts'; class PlatformSetup { static async setup(buildParameters: Parameters, actionFolder: string) { diff --git a/src/modules/actions/core.ts b/src/modules/actions/core.ts index a676c161..13c410dc 100644 --- a/src/modules/actions/core.ts +++ b/src/modules/actions/core.ts @@ -9,11 +9,6 @@ export const core = { console.error(error, error.stack); }, - setFailed: (failure) => { - console.error('setFailed:', failure); - Deno.exit(1); - }, - // Adapted from: https://github.com/actions/toolkit/blob/9b7bcb1567c9b7f134eb3c2d6bbf409a5106a956/packages/core/src/core.ts#L128 getInput: (name, options) => { const variable = `INPUT_${name.replace(/ /g, '_').toUpperCase()}`;