mirror of
https://github.com/game-ci/unity-builder.git
synced 2025-07-04 12:25:19 -04:00

- 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.
195 lines
5.9 KiB
PowerShell
195 lines
5.9 KiB
PowerShell
#
|
|
# Set project path
|
|
#
|
|
$Env:UNITY_PROJECT_PATH="$Env:GITHUB_WORKSPACE\$Env:PROJECT_PATH"
|
|
Write-Output "$('Using project path "')$($Env:UNITY_PROJECT_PATH)$('".')"
|
|
|
|
#
|
|
# Display the name for the build, doubles as the output name
|
|
#
|
|
|
|
Write-Output "$('Using build name "')$($Env:BUILD_NAME)$('".')"
|
|
|
|
#
|
|
# Display the build's target platform;
|
|
#
|
|
|
|
Write-Output "$('Using build target "')$($Env:BUILD_TARGET)$('".')"
|
|
|
|
#
|
|
# Display build path and file
|
|
#
|
|
|
|
Write-Output "$('Using build path "')$($Env:BUILD_PATH)$('" to save file "')$($Env:BUILD_FILE)$('".')"
|
|
$Env:BUILD_PATH_FULL="$Env:GITHUB_WORKSPACE\$Env:BUILD_PATH"
|
|
$Env:CUSTOM_BUILD_PATH="$Env:BUILD_PATH_FULL\$Env:BUILD_FILE"
|
|
|
|
#
|
|
# Set the build method, must reference one of:
|
|
#
|
|
# - <NamespaceName.ClassName.MethodName>
|
|
# - <ClassName.MethodName>
|
|
#
|
|
# For example: `BuildCommand.PerformBuild`
|
|
#
|
|
# The method must be declared static and placed in project/Assets/Editor
|
|
#
|
|
if ($Env:BUILD_METHOD)
|
|
{
|
|
# User has provided their own build method.
|
|
# Assume they also bring their own script.
|
|
Write-Output "$('Using build method "')$($Env:BUILD_METHOD)$('".')"
|
|
}
|
|
else
|
|
{
|
|
# User has not provided their own build command.
|
|
#
|
|
# Use the script from this action which builds the scenes that are enabled in
|
|
# the project.
|
|
#
|
|
Write-Output "Using built-in build method."
|
|
|
|
# Create Editor directory if it does not exist
|
|
if(-Not (Test-Path -Path $Env:UNITY_PROJECT_PATH\Assets\Editor))
|
|
{
|
|
# We use -Force to suppress output, doesn't overwrite anything
|
|
New-Item -ItemType Directory -Force -Path $Env:UNITY_PROJECT_PATH\Assets\Editor
|
|
}
|
|
|
|
# Copy the build script of Unity Builder action
|
|
Copy-Item -Path "c:\UnityBuilderAction" -Destination $Env:UNITY_PROJECT_PATH\Assets\Editor -Recurse
|
|
|
|
# Set the Build method to that of UnityBuilder Action
|
|
$Env:BUILD_METHOD="UnityBuilderAction.Builder.BuildProject"
|
|
|
|
# Verify recursive paths
|
|
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
|
|
#
|
|
|
|
Write-Output ""
|
|
Write-Output "###########################"
|
|
Write-Output "# Custom parameters #"
|
|
Write-Output "###########################"
|
|
Write-Output ""
|
|
|
|
Write-Output "$('"')$($Env:CUSTOM_PARAMETERS)$('"')"
|
|
|
|
Write-Output ""
|
|
Write-Output "###########################"
|
|
Write-Output "# Current build dir #"
|
|
Write-Output "###########################"
|
|
Write-Output ""
|
|
|
|
Write-Output "$('Creating "')$($Env:BUILD_PATH_FULL)$('" if it does not exist.')"
|
|
if (-Not (Test-Path -Path $Env:BUILD_PATH_FULL))
|
|
{
|
|
mkdir "$Env:BUILD_PATH_FULL"
|
|
}
|
|
Get-ChildItem $Env:BUILD_PATH_FULL
|
|
|
|
Write-Output ""
|
|
Write-Output "###########################"
|
|
Write-Output "# Project directory #"
|
|
Write-Output "###########################"
|
|
Write-Output ""
|
|
|
|
Get-ChildItem $Env:UNITY_PROJECT_PATH
|
|
|
|
#
|
|
# Build
|
|
#
|
|
|
|
Write-Output ""
|
|
Write-Output "###########################"
|
|
Write-Output "# Building project #"
|
|
Write-Output "###########################"
|
|
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
|
|
|
|
# Remove null items as that will fail the Start-Process call
|
|
$unityArgs = $unityArgs | Where-Object { $_ -ne $null }
|
|
|
|
$process = Start-Process -FilePath "C:\Program Files\Unity\Hub\Editor\$Env:UNITY_VERSION\Editor\Unity.exe" `
|
|
-ArgumentList $unityArgs `
|
|
-PassThru `
|
|
-NoNewWindow
|
|
|
|
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
|
|
}
|