From 4c4611c0210278e7f182a06c92786b307158806b Mon Sep 17 00:00:00 2001 From: Andrew Kahr <22359829+AndrewKahr@users.noreply.github.com> Date: Sat, 28 Oct 2023 12:21:10 -0700 Subject: [PATCH] Feature/windows upgrades (#588) - Allow updating container memory and cpu limits for Windows. Previously, they defaulted to 1cpu and 1gb ram which was far too low and it seems docker wouldn't allocate all available resources. Now it will use all available cores and 80% of system memory. - Allow setting docker isolation mode for windows. Defaults to default to ensure behavior doesn't change from prior versions but now you can do stuff like force process mode on non-server versions which grants a performance uplift during runs - Added logic to allow building Android on Windows. Android doesn't support burst when built on Linux, only on Windows and macOS. Thus we need to allow building Android on WIndows due to the major performance benefits of Burst. - Support Windows 2022 and VS2022 by mounting the x64 Visual Studio path in addition to the x86 path to maintain compatibility with VS2019 and older - Attempted fixes for windows builds hanging by killing the regsvr32 process after registering VS dll and using a different method to launch Unity. Unsure if this is a definite fix so I am leaving in several debug calls to print out running processes so we have more data to work with on chasing down this bug. I suspect there's a process that's hanging around that isn't cleaning itself up or is getting into some kind of deadlock situation and needs to be killed. But the changes I've made have seen no hangs on building during docker test workflows when previously there would be at least 3-5 hanging builds. --- .vscode/launch.json | 7 ++ action.yml | 18 ++++ dist/index.js | Bin 22170784 -> 22172464 bytes dist/index.js.map | Bin 14627568 -> 14641999 bytes dist/platforms/windows/build.ps1 | 117 +++++++++++++++++--------- dist/platforms/windows/entrypoint.ps1 | 10 ++- src/index.ts | 7 +- src/model/build-parameters.ts | 12 ++- src/model/docker.ts | 19 ++++- src/model/input.ts | 30 +++++++ 10 files changed, 174 insertions(+), 46 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 9c7be0a5..ade9bd7b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,5 +1,12 @@ { "configurations": [ + { + "name": "PowerShell Launch Current File", + "type": "PowerShell", + "request": "launch", + "script": "${file}", + "cwd": "${cwd}" + }, { "type": "node", "request": "launch", diff --git a/action.yml b/action.yml index ef48e8c2..2ada25e6 100644 --- a/action.yml +++ b/action.yml @@ -106,6 +106,24 @@ inputs: default: '' description: 'User and optionally group (user or user:group or uid:gid) to give ownership of the resulting build artifacts' + dockerCpuLimit: + required: false + default: '' + description: 'Number of CPU cores to assign the docker container. Defaults to all available cores on all platforms.' + dockerMemoryLimit: + required: false + default: '' + description: + 'Amount of memory to assign the docker container. Defaults to 95% of total system memory rounded down to the + nearest megabyte on Linux and 80% on Windows. On unrecognized platforms, defaults to 75% of total system memory. + To manually specify a value, use the format , where unit is either m or g. ie: 512m = 512 megabytes' + dockerIsolationMode: + required: false + default: 'default' + description: + 'Isolation mode to use for the docker container. Can be one of process, hyperv, or default. Default will pick the + default mode as described by Microsoft where server versions use process and desktop versions use hyperv. Only + applicable on Windows' allowDirtyBuild: required: false default: '' diff --git a/dist/index.js b/dist/index.js index 9c38ab9a4a1f029e5c7d868a1ef046fee08cbb15..b6f1c1bddce593d5fd09fdd2d6b3f44f48c29437 100644 GIT binary patch delta 2616 zcmb`{d05kR9Ki8s><7xc@E8N}*c4^sm~0-1cp-|S;*phE7EGBs9SmWVreN1`LcT@(EtUqPnNtI8`@8&$<|z1Glfw@)bXc=Oa&hb5{kcZH@Z)+~=z z5t|JyRmFgiuDekp5!X=`t8BT6Ak8C zKh?*w-TA(vng4lttyAjUA*Jf^S;aoDOJG*O z5R#gB@o_clSo43a(`#M|nnq%PF?9%0V`H=gwJ=7@Qj21=s6b(ic1Ab%e;8x^`FLuU z`qGqw22|^Uz__-WWnNeTTax2bx^!K9Xi9Pqhf}#$>C@CmS6G9L`CwRUpX=JoclEWKkZ zResK-rDPRkyC=IQ%=Ej>eawzzXE$?v)vvTm`{#B0&DFb?%^TTM==HdZ($xB}eMVi5 zI((t6No9;_)LivHx-V2EG|{3=bx-ET$@bLl$}wzjf@+i=7G?a$GnB=$ptDN0t}{iO z>pigQ9w}A#u&8CH_ZU`gFg2W;B_A^TWVgTS59`H6s`X~6UZ>pHS=lcC6#FEv&sSu% z)?YTi&+qawD67rf#Vl)4e0f=HEJ)q)+UDfv+R_YVgLW7rs@L}N=C9nM#aZgU$lg~E zCGO()L0RRoRw{P7-mG#H^;&6WK!hR;4bTwbFrX0{qY0X#86waeEzlCJU_>NLh(a`4 zBL;2I7VXd;W?0Yx9TAI8=!`g6VM9C;kccGM(FMtHz=^KthVJNr6!b(YdLa$H(Fc9e z5B-sj0m#5W3_>ObV+gV^6vHqa*%*P57=_We0%LF`uENzAi)%0r*Wx;i$Mv`YImm?z z6EG2ZaAOiCV+uT&ifQm79|iEC5YthFV)#*l8*vk6U?y(HEX>9n+=98d6}Mp?=HqrO zz#S;XLM+0aSd6=HH+8wTzR_+ef z`AS_UcjH;?!CvgcepKK&JdYRfB3{DFcm=QG0A9oEcmoIVCf>p!9LC!?f_LyP-osHG z!}~an5AY#A!U=qgPf&@I_!OVvb9{j>aSC7IYkY%maT;fE7U%FCzQ+$Zk00?9e#S5O z6~EyEe#am96MrpsozyLbBt)W@Xp&G#n52QEp(I>lkTjAsmNbzxl{Aw?NSaGpNLor- zNsN+6iAfSAiI%jM#7Npm+Dh6<+Dpt5i=>03qa;?+Nzz#oC$UOwl6XmiBvFziu}iv0 zk|hp_Q_@w^P10S`Ly{utDM^*|lB7v`OZrIqO8QCqOVT9+BpH%{l0lM8$zaJ4NtR@& ZWSC^QBwI21x8HSgw65ROzX6+PQd|H4 delta 1555 zcmWm6cU+VO0Eh9<9WQVk2%@6r!3p93#f2v)4%~a5BU>&|oLGX=bfp!pax`AGEFwj% z6wL9uaH2-8a+aE9<)9R`o%{Ly@qPY$iVMq}`OC|k#g{|OQEs~@A|rQv)@XlvPWq(G zshK%b%DOO=M3b6)ju@0Z%b9{mI*nlDwV-xQlzZj|X^&M++R~wnb3vN`PW0fl81PtT>bq#i@iUVM-+>T!~OBE0IbSrK(a* ziBhU7H58XpQ*kTNN{r%BYALZwoKjnfSL!Hrm3m5jB|%A48Ym5wB&CtkSZSg(RhlWu zN^`}lv`|tMpVCrERaz;nl{QLSB~59kv{yPP9hFW>XQhkMRq3X5S9&Ntm0n73rH|5A S>8JEp{I)%g@&UHQ36B9DwZOpu diff --git a/dist/index.js.map b/dist/index.js.map index ca610bdb162f2b702291484db2d531f58f910ae6..6379d2f22a59c0503b253c2e8efb473fe0f39e51 100644 GIT binary patch delta 59637 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 delta 54691 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 z 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 diff --git a/dist/platforms/windows/build.ps1 b/dist/platforms/windows/build.ps1 index 50ae2795..bbae3d21 100644 --- a/dist/platforms/windows/build.ps1 +++ b/dist/platforms/windows/build.ps1 @@ -66,6 +66,26 @@ else Get-ChildItem -Path $Env:UNITY_PROJECT_PATH\Assets\Editor -Recurse } +if ( "$Env:BUILD_TARGET" -eq "Android" -and -not ([string]::IsNullOrEmpty("$Env:ANDROID_KEYSTORE_BASE64")) ) +{ + Write-Output "Creating Android keystore." + + # Write to consistent location as Windows Unity seems to have issues with pwd and can't find the keystore + $keystorePath = "C:/android.keystore" + [System.IO.File]::WriteAllBytes($keystorePath, [System.Convert]::FromBase64String($Env:ANDROID_KEYSTORE_BASE64)) + + # Ensure the project settings are pointed at the correct path + $unitySettingsPath = "$Env:UNITY_PROJECT_PATH\ProjectSettings\ProjectSettings.asset" + $fileContent = Get-Content -Path "$unitySettingsPath" + $fileContent = $fileContent -replace "AndroidKeystoreName:\s+.*", "AndroidKeystoreName: $keystorePath" + $fileContent | Set-Content -Path "$unitySettingsPath" + + Write-Output "Created Android keystore." +} +else { + Write-Output "Not creating Android keystore." +} + # # Pre-build debug information # @@ -112,48 +132,63 @@ Write-Output "" # If $Env:CUSTOM_PARAMETERS contains spaces and is passed directly on the command line to Unity, powershell will wrap it # in double quotes. To avoid this, parse $Env:CUSTOM_PARAMETERS into an array, while respecting any quotations within the string. $_, $customParametersArray = Invoke-Expression('Write-Output -- "" ' + $Env:CUSTOM_PARAMETERS) +$unityArgs = @( + "-quit", + "-batchmode", + "-nographics", + "-silent-crashes", + "-projectPath", $Env:UNITY_PROJECT_PATH, + "-executeMethod", $Env:BUILD_METHOD, + "-buildTarget", $Env:BUILD_TARGET, + "-customBuildTarget", $Env:BUILD_TARGET, + "-customBuildPath", $Env:CUSTOM_BUILD_PATH, + "-buildVersion", $Env:VERSION, + "-androidVersionCode", $Env:ANDROID_VERSION_CODE, + "-androidKeystorePass", $Env:ANDROID_KEYSTORE_PASS, + "-androidKeyaliasName", $Env:ANDROID_KEYALIAS_NAME, + "-androidKeyaliasPass", $Env:ANDROID_KEYALIAS_PASS, + "-androidTargetSdkVersion", $Env:ANDROID_TARGET_SDK_VERSION, + "-androidExportType", $Env:ANDROID_EXPORT_TYPE, + "-androidSymbolType", $Env:ANDROID_SYMBOL_TYPE, + "-logfile", "-" +) + $customParametersArray -& "C:\Program Files\Unity\Hub\Editor\$Env:UNITY_VERSION\Editor\Unity.exe" -quit -batchmode -nographics ` - -projectPath $Env:UNITY_PROJECT_PATH ` - -executeMethod $Env:BUILD_METHOD ` - -buildTarget $Env:BUILD_TARGET ` - -customBuildTarget $Env:BUILD_TARGET ` - -customBuildPath $Env:CUSTOM_BUILD_PATH ` - -buildVersion $Env:VERSION ` - -androidVersionCode $Env:ANDROID_VERSION_CODE ` - -androidKeystoreName $Env:ANDROID_KEYSTORE_NAME ` - -androidKeystorePass $Env:ANDROID_KEYSTORE_PASS ` - -androidKeyaliasName $Env:ANDROID_KEYALIAS_NAME ` - -androidKeyaliasPass $Env:ANDROID_KEYALIAS_PASS ` - -androidTargetSdkVersion $Env:ANDROID_TARGET_SDK_VERSION ` - -androidExportType $Env:ANDROID_EXPORT_TYPE ` - -androidSymbolType $Env:ANDROID_SYMBOL_TYPE ` - $customParametersArray ` - -logfile | Out-Host +# Remove null items as that will fail the Start-Process call +$unityArgs = $unityArgs | Where-Object { $_ -ne $null } -# Catch exit code -$Env:BUILD_EXIT_CODE=$LastExitCode +$process = Start-Process -FilePath "C:\Program Files\Unity\Hub\Editor\$Env:UNITY_VERSION\Editor\Unity.exe" ` + -ArgumentList $unityArgs ` + -PassThru ` + -NoNewWindow -# Display results -if ($Env:BUILD_EXIT_CODE -eq 0) -{ - Write-Output "Build Succeeded!" -} else -{ - Write-Output "$('Build failed, with exit code ')$($Env:BUILD_EXIT_CODE)$('"')" +while (!$process.HasExited) { + if ($process.HasExited) { + Get-Process + + Start-Sleep -Seconds 10 + + Get-Process + + # Display results + if ($process.ExitCode -eq 0) + { + Write-Output "Build Succeeded!!" + } else + { + Write-Output "$('Build failed, with exit code ')$($process.ExitCode)$('"')" + } + + Write-Output "" + Write-Output "###########################" + Write-Output "# Build output #" + Write-Output "###########################" + Write-Output "" + + Get-ChildItem $Env:BUILD_PATH_FULL + Write-Output "" + + exit $process.ExitCode + } + + Start-Sleep -Seconds 5 } - -# TODO: Determine if we need to set permissions on any files - -# -# Results -# - -Write-Output "" -Write-Output "###########################" -Write-Output "# Build output #" -Write-Output "###########################" -Write-Output "" - -Get-ChildItem $Env:BUILD_PATH_FULL -Write-Output "" diff --git a/dist/platforms/windows/entrypoint.ps1 b/dist/platforms/windows/entrypoint.ps1 index f0a6b555..fb3ccc10 100644 --- a/dist/platforms/windows/entrypoint.ps1 +++ b/dist/platforms/windows/entrypoint.ps1 @@ -1,10 +1,15 @@ +Get-Process + # Import any necessary registry keys, ie: location of windows 10 sdk # No guarantee that there will be any necessary registry keys, ie: tvOS -Get-ChildItem -Path c:\regkeys -File | Foreach {reg import $_.fullname} +Get-ChildItem -Path c:\regkeys -File | ForEach-Object {reg import $_.fullname} # Register the Visual Studio installation so Unity can find it regsvr32 C:\ProgramData\Microsoft\VisualStudio\Setup\x64\Microsoft.VisualStudio.Setup.Configuration.Native.dll +# Kill the regsvr process +Get-Process -Name regsvr32 | ForEach-Object { Stop-Process -Id $_.Id -Force } + # Setup Git Credentials & "c:\steps\set_gitcredential.ps1" @@ -16,3 +21,6 @@ regsvr32 C:\ProgramData\Microsoft\VisualStudio\Setup\x64\Microsoft.VisualStudio. # Free the seat for the activated license & "c:\steps\return_license.ps1" + +Start-Sleep 3 +Get-Process diff --git a/src/index.ts b/src/index.ts index 3f621d8e..2457eb1d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -25,7 +25,11 @@ async function runMain() { if (process.platform === 'darwin') { MacBuilder.run(actionFolder); } else { - await Docker.run(baseImage.toString(), { workspace, actionFolder, ...buildParameters }); + await Docker.run(baseImage.toString(), { + workspace, + actionFolder, + ...buildParameters, + }); } } else { await CloudRunner.run(buildParameters, baseImage.toString()); @@ -38,4 +42,5 @@ async function runMain() { core.setFailed((error as Error).message); } } + runMain(); diff --git a/src/model/build-parameters.ts b/src/model/build-parameters.ts index bd5f9103..8c322124 100644 --- a/src/model/build-parameters.ts +++ b/src/model/build-parameters.ts @@ -40,6 +40,9 @@ class BuildParameters { public androidSdkManagerParameters!: string; public androidExportType!: string; public androidSymbolType!: string; + public dockerCpuLimit!: string; + public dockerMemoryLimit!: string; + public dockerIsolationMode!: string; public customParameters!: string; public sshAgent!: string; @@ -116,10 +119,12 @@ class BuildParameters { if (!Input.unitySerial && GitHub.githubInputEnabled) { // No serial was present, so it is a personal license that we need to convert if (!Input.unityLicense) { - throw new Error(`Missing Unity License File and no Serial was found. If this + throw new Error( + `Missing Unity License File and no Serial was found. If this is a personal license, make sure to follow the activation steps and set the UNITY_LICENSE GitHub secret or enter a Unity - serial number inside the UNITY_SERIAL GitHub secret.`); + serial number inside the UNITY_SERIAL GitHub secret.`, + ); } unitySerial = this.getSerialFromLicenseFile(Input.unityLicense); } else { @@ -156,6 +161,9 @@ class BuildParameters { sshPublicKeysDirectoryPath: Input.sshPublicKeysDirectoryPath, gitPrivateToken: Input.gitPrivateToken || (await GithubCliReader.GetGitHubAuthToken()), chownFilesTo: Input.chownFilesTo, + dockerCpuLimit: Input.dockerCpuLimit, + dockerMemoryLimit: Input.dockerMemoryLimit, + dockerIsolationMode: Input.dockerIsolationMode, providerStrategy: CloudRunnerOptions.providerStrategy, buildPlatform: CloudRunnerOptions.buildPlatform, kubeConfig: CloudRunnerOptions.kubeConfig, diff --git a/src/model/docker.ts b/src/model/docker.ts index 24b93ab5..aec955bc 100644 --- a/src/model/docker.ts +++ b/src/model/docker.ts @@ -48,6 +48,8 @@ class Docker { sshPublicKeysDirectoryPath, gitPrivateToken, dockerWorkspacePath, + dockerCpuLimit, + dockerMemoryLimit, } = parameters; const githubHome = path.join(runnerTempPath, '_github_home'); @@ -72,6 +74,8 @@ class Docker { --volume "${actionFolder}/platforms/ubuntu/steps:/steps:z" \ --volume "${actionFolder}/platforms/ubuntu/entrypoint.sh:/entrypoint.sh:z" \ --volume "${actionFolder}/unity-config:/usr/share/unity3d/config/:z" \ + --cpus=${dockerCpuLimit} \ + --memory=${dockerMemoryLimit} \ ${sshAgent ? `--volume ${sshAgent}:/ssh-agent` : ''} \ ${ sshAgent && !sshPublicKeysDirectoryPath @@ -86,7 +90,16 @@ class Docker { } static getWindowsCommand(image: string, parameters: DockerParameters): string { - const { workspace, actionFolder, unitySerial, gitPrivateToken, dockerWorkspacePath } = parameters; + const { + workspace, + actionFolder, + unitySerial, + gitPrivateToken, + dockerWorkspacePath, + dockerCpuLimit, + dockerMemoryLimit, + dockerIsolationMode, + } = parameters; return `docker run \ --workdir c:${dockerWorkspacePath} \ @@ -97,12 +110,16 @@ class Docker { ${gitPrivateToken ? `--env GIT_PRIVATE_TOKEN="${gitPrivateToken}"` : ''} \ --volume "${workspace}":"c:${dockerWorkspacePath}" \ --volume "c:/regkeys":"c:/regkeys" \ + --volume "C:/Program Files/Microsoft Visual Studio":"C:/Program Files/Microsoft Visual Studio" \ --volume "C:/Program Files (x86)/Microsoft Visual Studio":"C:/Program Files (x86)/Microsoft Visual Studio" \ --volume "C:/Program Files (x86)/Windows Kits":"C:/Program Files (x86)/Windows Kits" \ --volume "C:/ProgramData/Microsoft/VisualStudio":"C:/ProgramData/Microsoft/VisualStudio" \ --volume "${actionFolder}/default-build-script":"c:/UnityBuilderAction" \ --volume "${actionFolder}/platforms/windows":"c:/steps" \ --volume "${actionFolder}/BlankProject":"c:/BlankProject" \ + --cpus=${dockerCpuLimit} \ + --memory=${dockerMemoryLimit} \ + --isolation=${dockerIsolationMode} \ ${image} \ powershell c:/steps/entrypoint.ps1`; } diff --git a/src/model/input.ts b/src/model/input.ts index f50b0633..94a0f2b4 100644 --- a/src/model/input.ts +++ b/src/model/input.ts @@ -4,6 +4,7 @@ import { Cli } from './cli/cli'; import CloudRunnerQueryOverride from './cloud-runner/options/cloud-runner-query-override'; import Platform from './platform'; import GitHub from './github'; +import os from 'node:os'; import * as core from '@actions/core'; @@ -226,6 +227,35 @@ class Input { return Input.getInput('dockerWorkspacePath') || '/github/workspace'; } + static get dockerCpuLimit(): string { + return Input.getInput('dockerCpuLimit') || os.cpus().length.toString(); + } + + static get dockerMemoryLimit(): string { + const bytesInMegabyte = 1024 * 1024; + + let memoryMultiplier; + switch (os.platform()) { + case 'linux': + memoryMultiplier = 0.95; + break; + case 'win32': + memoryMultiplier = 0.8; + break; + default: + memoryMultiplier = 0.75; + break; + } + + return ( + Input.getInput('dockerMemoryLimit') || `${Math.floor((os.totalmem() / bytesInMegabyte) * memoryMultiplier)}m` + ); + } + + static get dockerIsolationMode(): string { + return Input.getInput('dockerIsolationMode') || 'default'; + } + public static ToEnvVarFormat(input: string) { if (input.toUpperCase() === input) { return input;