mirror of
https://github.com/game-ci/unity-builder.git
synced 2026-06-01 14:26:17 -07:00
Add two new cloud provider implementations for the orchestrator, both marked as experimental: - **GCP Cloud Run Jobs** (`providerStrategy: gcp-cloud-run`): Executes Unity builds as Cloud Run Jobs with GCS FUSE for large artifact storage. Supports configurable machine types, service accounts, and VPC connectors. 7 new inputs (gcpProject, gcpRegion, gcpBucket, gcpMachineType, gcpDiskSizeGb, gcpServiceAccount, gcpVpcConnector). - **Azure Container Instances** (`providerStrategy: azure-aci`): Executes Unity builds as ACI containers with Azure File Shares (Premium FileStorage) for large artifact storage up to 100 TiB. Supports configurable CPU/memory, VNet integration, and subscription targeting. 9 new inputs (azureResourceGroup, azureLocation, azureStorageAccount, azureFileShareName, azureSubscriptionId, azureCpu, azureMemoryGb, azureDiskSizeGb, azureSubnetId). Both providers use their respective CLIs (gcloud, az) for infrastructure management and support garbage collection of old build resources. No tests included as these require real cloud infrastructure to validate. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
390 lines
14 KiB
YAML
390 lines
14 KiB
YAML
name: 'Unity - Builder'
|
|
author: Webber Takken <webber@takken.io>
|
|
description: 'Build Unity projects for different platforms.'
|
|
inputs:
|
|
targetPlatform:
|
|
required: true
|
|
default: ''
|
|
description: 'Platform that the build should target.'
|
|
unityVersion:
|
|
required: false
|
|
default: 'auto'
|
|
description:
|
|
'Version of unity to use for building the project. Use "auto" to get from your ProjectSettings/ProjectVersion.txt'
|
|
customImage:
|
|
required: false
|
|
default: ''
|
|
description: 'Specific docker image that should be used for building the project'
|
|
projectPath:
|
|
required: false
|
|
default: ''
|
|
description: 'Path to the project to be built, relative to the repository root.'
|
|
buildProfile:
|
|
required: false
|
|
default: ''
|
|
description: 'Path to the build profile to activate, relative to the project root.'
|
|
buildName:
|
|
required: false
|
|
default: ''
|
|
description: 'Name of the build. Should not include a file extension.'
|
|
buildsPath:
|
|
required: false
|
|
default: ''
|
|
description: 'Path where the builds should be stored.'
|
|
buildMethod:
|
|
required: false
|
|
default: ''
|
|
description: 'Path to a Namespace.Class.StaticMethod to run to perform the build.'
|
|
manualExit:
|
|
required: false
|
|
default: ''
|
|
description: 'Suppresses `-quit`. Exit your build method using `EditorApplication.Exit(0)` instead.'
|
|
enableGpu:
|
|
required: false
|
|
default: ''
|
|
description: 'Launches unity without specifying `-nographics`.'
|
|
customParameters:
|
|
required: false
|
|
default: ''
|
|
description: 'Custom parameters to configure the build.'
|
|
versioning:
|
|
required: false
|
|
default: 'Semantic'
|
|
description: 'The versioning scheme to use when building the project'
|
|
version:
|
|
required: false
|
|
default: ''
|
|
description: 'The version, when used with the "Custom" versioning scheme'
|
|
androidVersionCode:
|
|
required: false
|
|
default: ''
|
|
description: 'The android versionCode'
|
|
androidExportType:
|
|
required: false
|
|
default: 'androidPackage'
|
|
description:
|
|
'The android export type. Should be androidPackage for apk, androidAppBundle for aab, or androidStudioProject for
|
|
an android studio project.'
|
|
androidKeystoreName:
|
|
required: false
|
|
default: ''
|
|
description: 'The android keystoreName'
|
|
androidKeystoreBase64:
|
|
required: false
|
|
default: ''
|
|
description: 'The base64 contents of the android keystore file'
|
|
androidKeystorePass:
|
|
required: false
|
|
default: ''
|
|
description: 'The android keystorePass'
|
|
androidKeyaliasName:
|
|
required: false
|
|
default: ''
|
|
description: 'The android keyaliasName'
|
|
androidKeyaliasPass:
|
|
required: false
|
|
default: ''
|
|
description: 'The android keyaliasPass'
|
|
androidTargetSdkVersion:
|
|
required: false
|
|
default: ''
|
|
description: 'The android target API level.'
|
|
androidSymbolType:
|
|
required: false
|
|
default: 'none'
|
|
description: 'The android symbol type to export. Should be "none", "public" or "debugging".'
|
|
sshAgent:
|
|
required: false
|
|
default: ''
|
|
description: 'SSH Agent path to forward to the container'
|
|
sshPublicKeysDirectoryPath:
|
|
required: false
|
|
default: ''
|
|
description: 'Path to a directory containing SSH public keys to forward to the container.'
|
|
gitPrivateToken:
|
|
required: false
|
|
default: ''
|
|
description: '[Orchestrator] Github private token to pull from github'
|
|
githubOwner:
|
|
required: false
|
|
default: ''
|
|
description: '[Orchestrator] GitHub owner name or organization/team name'
|
|
runAsHostUser:
|
|
required: false
|
|
default: 'false'
|
|
description:
|
|
'Whether to run as a user that matches the host system or the default root container user. Only applicable to
|
|
Linux hosts and containers. This is useful for fixing permission errors on Self-Hosted runners.'
|
|
chownFilesTo:
|
|
required: false
|
|
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 <number><unit>, 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'
|
|
containerRegistryRepository:
|
|
required: false
|
|
default: 'unityci/editor'
|
|
description: 'Container registry and repository to pull image from. Only applicable if customImage is not set.'
|
|
containerRegistryImageVersion:
|
|
required: false
|
|
default: '3'
|
|
description: 'Container registry image version. Only applicable if customImage is not set.'
|
|
allowDirtyBuild:
|
|
required: false
|
|
default: ''
|
|
description: '[Orchestrator] Allows the branch of the build to be dirty, and still generate the build.'
|
|
postBuildSteps:
|
|
required: false
|
|
default: ''
|
|
description:
|
|
'[Orchestrator] run a post build job in yaml format with the keys image, secrets (name, value object array),
|
|
command string'
|
|
preBuildSteps:
|
|
required: false
|
|
default: ''
|
|
description:
|
|
'[Orchestrator] Run a pre build job after the repository setup but before the build job (in yaml format with the
|
|
keys image, secrets (name, value object array), command line string)'
|
|
containerHookFiles:
|
|
required: false
|
|
default: ''
|
|
description:
|
|
'[Orchestrator] Specify the names (by file name) of custom steps to run before or after orchestrator jobs, must
|
|
match a yaml step file inside your repo in the folder .game-ci/steps/'
|
|
customHookFiles:
|
|
required: false
|
|
default: ''
|
|
description:
|
|
'[Orchestrator] Specify the names (by file name) of custom hooks to run before or after orchestrator jobs, must
|
|
match a yaml step file inside your repo in the folder .game-ci/hooks/'
|
|
customCommandHooks:
|
|
required: false
|
|
default: ''
|
|
description: '[Orchestrator] Specify custom commands and trigger hooks (injects commands into jobs)'
|
|
customJob:
|
|
required: false
|
|
default: ''
|
|
description:
|
|
'[Orchestrator] Run a custom job instead of the standard build automation for orchestrator (in yaml format with the
|
|
keys image, secrets (name, value object array), command line string)'
|
|
awsStackName:
|
|
default: 'game-ci'
|
|
required: false
|
|
description: '[Orchestrator] The Cloud Formation stack name that must be setup before using this option.'
|
|
providerStrategy:
|
|
default: 'local'
|
|
required: false
|
|
description:
|
|
'[Orchestrator] Either local, k8s or aws can be used to run builds on a remote cluster. Additional parameters must
|
|
be configured.'
|
|
resourceTracking:
|
|
default: 'false'
|
|
required: false
|
|
description: '[Orchestrator] Enable resource tracking logs for disk usage and allocation summaries.'
|
|
containerCpu:
|
|
default: ''
|
|
required: false
|
|
description: '[Orchestrator] Amount of CPU time to assign the remote build container'
|
|
containerMemory:
|
|
default: ''
|
|
required: false
|
|
description: '[Orchestrator] Amount of memory to assign the remote build container'
|
|
readInputFromOverrideList:
|
|
default: ''
|
|
required: false
|
|
description: '[Orchestrator] Comma separated list of input value names to read from "input override command"'
|
|
readInputOverrideCommand:
|
|
default: ''
|
|
required: false
|
|
description:
|
|
'[Orchestrator] Extend game ci by specifying a command to execute to pull input from external source e.g cloud
|
|
provider secret managers'
|
|
kubeConfig:
|
|
default: ''
|
|
required: false
|
|
description:
|
|
'[Orchestrator] Supply a base64 encoded kubernetes config to run builds on kubernetes and stream logs until
|
|
completion.'
|
|
kubeVolume:
|
|
default: ''
|
|
required: false
|
|
description: '[Orchestrator] Supply a Persistent Volume Claim name to use for the Unity build.'
|
|
kubeStorageClass:
|
|
default: ''
|
|
required: false
|
|
description:
|
|
'[Orchestrator] Kubernetes storage class to use for orchestrator jobs, leave empty to install rook cluster.'
|
|
kubeVolumeSize:
|
|
default: '5Gi'
|
|
required: false
|
|
description: '[Orchestrator] Amount of disc space to assign the Kubernetes Persistent Volume'
|
|
cacheKey:
|
|
default: ''
|
|
required: false
|
|
description: '[Orchestrator] Cache key to indicate bucket for cache'
|
|
watchToEnd:
|
|
default: 'true'
|
|
required: false
|
|
description:
|
|
'[Orchestrator] Whether or not to watch the build to the end. Can be used for especially long running jobs e.g
|
|
imports or self-hosted ephemeral runners.'
|
|
cacheUnityInstallationOnMac:
|
|
default: 'false'
|
|
required: false
|
|
description: 'Whether to cache the Unity hub and editor installation on MacOS'
|
|
unityHubVersionOnMac:
|
|
default: ''
|
|
required: false
|
|
description:
|
|
'The version of Unity Hub to install on MacOS (e.g. 3.4.0). Defaults to latest available on brew if empty string
|
|
or nothing is specified.'
|
|
unityLicensingServer:
|
|
default: ''
|
|
required: false
|
|
description: 'The Unity licensing server address to use for activating Unity.'
|
|
dockerWorkspacePath:
|
|
default: '/github/workspace'
|
|
required: false
|
|
description:
|
|
'The path to mount the workspace inside the docker container. For windows, leave out the drive letter. For example
|
|
c:/github/workspace should be defined as /github/workspace'
|
|
skipActivation:
|
|
default: 'false'
|
|
required: false
|
|
description: 'Skip the activation/deactivation of Unity. This assumes Unity is already activated.'
|
|
cloneDepth:
|
|
default: '50'
|
|
required: false
|
|
description: '[Orchestrator] Specifies the depth of the git clone for the repository. Use 0 for full clone.'
|
|
orchestratorRepoName:
|
|
default: 'game-ci/unity-builder'
|
|
required: false
|
|
description:
|
|
'[Orchestrator] Specifies the repo for the unity builder. Useful if you forked the repo for testing, features, or
|
|
fixes.'
|
|
gcpProject:
|
|
required: false
|
|
default: ''
|
|
description:
|
|
'[Orchestrator] [Experimental] Google Cloud project ID for Cloud Run Jobs provider.
|
|
Falls back to GOOGLE_CLOUD_PROJECT env var.'
|
|
gcpRegion:
|
|
required: false
|
|
default: ''
|
|
description:
|
|
'[Orchestrator] [Experimental] Google Cloud region for Cloud Run Jobs (e.g. us-central1).
|
|
Defaults to the region input if empty.'
|
|
gcpBucket:
|
|
required: false
|
|
default: ''
|
|
description:
|
|
'[Orchestrator] [Experimental] GCS bucket name for build artifact storage.
|
|
Mounted via GCS FUSE for large filesystem support.'
|
|
gcpMachineType:
|
|
required: false
|
|
default: 'e2-standard-4'
|
|
description:
|
|
'[Orchestrator] [Experimental] Machine type for Cloud Run Jobs (e.g. e2-standard-4, e2-highmem-8).'
|
|
gcpDiskSizeGb:
|
|
required: false
|
|
default: '100'
|
|
description:
|
|
'[Orchestrator] [Experimental] Disk size in GB for Cloud Run Jobs. Supports up to 32GB
|
|
in-memory or unlimited via GCS FUSE bucket mount.'
|
|
gcpServiceAccount:
|
|
required: false
|
|
default: ''
|
|
description:
|
|
'[Orchestrator] [Experimental] Google Cloud service account email for Cloud Run Jobs execution.'
|
|
gcpVpcConnector:
|
|
required: false
|
|
default: ''
|
|
description:
|
|
'[Orchestrator] [Experimental] VPC connector name for Cloud Run Jobs private networking.'
|
|
azureResourceGroup:
|
|
required: false
|
|
default: ''
|
|
description:
|
|
'[Orchestrator] [Experimental] Azure resource group for Container Instances provider.
|
|
Falls back to AZURE_RESOURCE_GROUP env var.'
|
|
azureLocation:
|
|
required: false
|
|
default: ''
|
|
description:
|
|
'[Orchestrator] [Experimental] Azure region for Container Instances (e.g. eastus, westeurope).
|
|
Defaults to the region input if empty.'
|
|
azureStorageAccount:
|
|
required: false
|
|
default: ''
|
|
description:
|
|
'[Orchestrator] [Experimental] Azure Storage Account name for file share mounting.
|
|
Uses Premium FileStorage for high-throughput large artifact I/O.'
|
|
azureFileShareName:
|
|
required: false
|
|
default: 'unity-builds'
|
|
description:
|
|
'[Orchestrator] [Experimental] Azure File Share name within the storage account.
|
|
Supports up to 100 TiB per share.'
|
|
azureSubscriptionId:
|
|
required: false
|
|
default: ''
|
|
description:
|
|
'[Orchestrator] [Experimental] Azure subscription ID. Falls back to AZURE_SUBSCRIPTION_ID env var.'
|
|
azureCpu:
|
|
required: false
|
|
default: '4'
|
|
description:
|
|
'[Orchestrator] [Experimental] CPU cores for Azure Container Instances (1-16).'
|
|
azureMemoryGb:
|
|
required: false
|
|
default: '16'
|
|
description:
|
|
'[Orchestrator] [Experimental] Memory in GB for Azure Container Instances (1-16).'
|
|
azureDiskSizeGb:
|
|
required: false
|
|
default: '100'
|
|
description:
|
|
'[Orchestrator] [Experimental] File share quota in GB for Azure Container Instances.
|
|
Premium shares support up to 102400 GB (100 TiB).'
|
|
azureSubnetId:
|
|
required: false
|
|
default: ''
|
|
description:
|
|
'[Orchestrator] [Experimental] Azure subnet resource ID for VNet-integrated Container Instances.'
|
|
|
|
outputs:
|
|
volume:
|
|
description: 'The Persistent Volume (PV) where the build artifacts have been stored by Kubernetes'
|
|
buildVersion:
|
|
description: 'The generated version used for the Unity build'
|
|
androidVersionCode:
|
|
description: 'The generated versionCode used for the Android Unity build'
|
|
engineExitCode:
|
|
description:
|
|
'Returns the exit code from the build scripts. This code is 0 if the build was successful. If there was an error
|
|
during activation, the code is from the activation step. If activation is successful, the code is from the project
|
|
build step.'
|
|
branding:
|
|
icon: 'box'
|
|
color: 'gray-dark'
|
|
runs:
|
|
using: 'node20'
|
|
main: 'dist/index.js'
|