game-ci/Unity - Orchestrator

Build Unity projects with orchestrator features: remote providers (AWS, K8s, GCP, Azure), hot runner, test workflows, local caching, child workspaces, artifact management, and more. Wraps game-ci/unity-builder and adds orchestrator-specific configuration.

View on GitHub

Trust Signals

Scorecard Score
not yet scored
Maintenance Recency
Activelast commit May 22, 2026
License
MIT

Pinned Snippet

workflow.ymlSHA-pinned
uses: game-ci/orchestrator@68bbf9987faf5a6f19cbc9b157004cd320f6a92e # v1.0.0

tags can be moved; commit SHAs can't. why a SHA?

namedescriptionrequireddefault
targetPlatformPlatform that the build should target.yes""
unityVersionUnity version. Use "auto" to detect from ProjectSettings/ProjectVersion.txtnoauto
customImageSpecific docker image for building the projectno""
projectPathPath to the project, relative to repo root.no""
buildProfilePath to the build profile to activate, relative to the project root.no""
buildNameName of the build (no file extension).no""
buildsPathPath where builds should be stored.no""
buildMethodNamespace.Class.StaticMethod to perform the build.no""
manualExitSuppress -quit flag.no""
enableGpuLaunch unity without -nographics.no""
customParametersCustom parameters to configure the build.no""
versioningVersioning scheme.noSemantic
versionVersion for "Custom" versioning scheme.no""
androidVersionCodeno""
androidExportTypenoandroidPackage
androidKeystoreNameno""
androidKeystoreBase64no""
androidKeystorePassno""
androidKeyaliasNameno""
androidKeyaliasPassno""
androidTargetSdkVersionno""
androidSymbolTypenonone
sshAgentno""
sshPublicKeysDirectoryPathno""
gitPrivateTokenGitHub private token for git operationsno""
runAsHostUsernofalse
chownFilesTono""
dockerCpuLimitno""
dockerMemoryLimitno""
dockerIsolationModenodefault
containerRegistryRepositorynounityci/editor
containerRegistryImageVersionno3
allowDirtyBuildno""
cacheUnityInstallationOnMacnofalse
unityHubVersionOnMacno""
unityLicensingServerno""
dockerWorkspacePathno/github/workspace
skipActivationnofalse
providerStrategyBuild provider: local, aws, k8s, gcp-cloud-run, azure-aci, github-actions, gitlab-ci, ansible, remote-powershell, or a custom provider path/URL.nolocal
fallbackProviderStrategyFallback provider when the primary is unavailable.no""
runnerCheckEnabledCheck runner availability before starting a build.nofalse
runnerCheckLabelsComma-separated runner labels to filter when checking availability.no""
runnerCheckMinAvailableMinimum idle runners required for primary provider.no1
retryOnFallbackRetry on fallback provider if primary fails.nofalse
providerInitTimeoutMax seconds to wait for provider initialization. 0 = no timeout.no0
providerExecutablePath to an external CLI executable that implements the provider protocol.no""
containerCpuCPU units for the remote build container.no1024
containerMemoryMemory (MB) for the remote build container.no3072
containerNamespacenodefault
awsStackNameCloudFormation stack name for AWS provider.nogame-ci
kubeConfigBase64-encoded kubeconfig for K8s provider.no""
kubeVolumeno""
kubeVolumeSizeno25Gi
kubeStorageClassno""
gcpProjectGoogle Cloud project ID.no""
gcpRegionno""
gcpStorageTypeStorage type: gcs-fuse, gcs-copy, nfs, in-memory.nogcs-fuse
gcpBucketno""
gcpFilestoreIpno""
gcpFilestoreShareno/share1
gcpMachineTypenoe2-standard-4
gcpDiskSizeGbno100
gcpServiceAccountno""
gcpVpcConnectorno""
azureResourceGroupno""
azureLocationno""
azureStorageTypenoazure-files
azureStorageAccountno""
azureBlobContainernounity-builds
azureFileShareNamenounity-builds
azureSubscriptionIdno""
azureCpuno4
azureMemoryGbno16
azureDiskSizeGbno100
azureSubnetIdno""
remotePowershellHostno""
remotePowershellCredentialno""
remotePowershellTransportnowsman
githubActionsRepono""
githubActionsWorkflowno""
githubActionsTokenno""
githubActionsRefnomain
gitlabProjectIdno""
gitlabTriggerTokenno""
gitlabApiUrlnohttps://gitlab.com
gitlabRefnomain
ansibleInventoryno""
ansiblePlaybookno""
ansibleExtraVarsno""
ansibleVaultPasswordno""
gitAuthModeGit auth mode: header (default) or url.noheader
gitIntegrityCheckRun git fsck, lock cleanup, and submodule validation before build.nofalse
gitAutoRecovernofalse
cleanReservedFilenamesnofalse
unityProcessCleanupOn Windows self-hosted runners, clean stale Unity processes scoped to the project path before launch.nofalse
enableBuildDiagnosticsAnalyze Unity Editor log after build/test and emit categorized failure summary to console and GitHub Step Summary.notrue
enableUnityRetryEnable multi-phase Unity retry with automatic recovery actions based on failure category.nofalse
unityRetryMaxAttemptsMaximum number of Unity retry attempts (including the initial run).no3
licensingStaggerDelayApply hash-based stagger delay before Unity launch to avoid licensing IPC mutex contention on self-hosted runners.notrue
profileFingerprintEnabledDetect submodule profile changes and clear stale ScriptAssemblies/Bee when the profile fingerprint differs from cache.nofalse
workerCountSet -job-worker-count for Unity launch. 0 means use Unity default. Controls import parallelism.no0
ilppCleanupEnabledClean up crashed ILPP processes scoped to the workspace before Unity launch (Windows only).notrue
acceleratorModeUnity Accelerator mode: enabled (full), disabled (off), or download-only (pull but no upload).noenabled
testResultCleanupDelete stale test result XML files before test runner launch to prevent false positives.notrue
disableAssemblyUpdaterAdd -disable-assembly-updater to batchmode launches to prevent ApiUpdater from destabilizing CI sessions.notrue
collectUnityLogsCollect Unity-internal logs (Editor.log, Unity.Licensing.Client.log, Unity.Entitlements.Audit.log, services-config.json, Unity Hub logs, crash dumps, build report, bee_backend.log, IL2CPP output, project version, package manifest, etc.) into <workspace>/Logs/UnityDiagnostics/ after the build so they can be uploaded as artifacts and shared with Unity support. See also: collectUnityLogsOnSuccess, unityLogCategories. nofalse
collectUnityLogsOnSuccessWhen false, only collect Unity logs on non-zero exit codes. Default true so successful builds also publish diagnostic artifacts (useful for licensing audits and Unity support tickets). notrue
unityLogCategoriesComma-separated subset of categories to collect (default = all non-sensitive). Categories: editor-log, editor-prev-log, licensing-client, entitlements-audit, services-config, unity-hub-info, unity-hub-error, editor-crash, build-report, bee-backend, player-log, test-results, il2cpp-output, project-version, package-manifest, macos-crash-report, windows-event-log. no""
unityLogsIncludeSensitiveInclude sensitive categories (e.g. license-file). NEVER enable in public CI artifacts. Off by default. nofalse
unityLogsOutputDirOverride the output directory for collected Unity logs. Default is <workspace>/Logs/UnityDiagnostics/. no""
streamUnityLogsLive-tail Unity log files during the build and forward each new line to the GitHub Actions log. Useful for long builds where you want to see compile/import progress without waiting for the build to finish. nofalse
streamUnityLogPathsComma-separated list of files to live-tail. Defaults to the standard <project>/Builds/Logs/Editor.log path that unity-builder configures. no""
buildArchiveEnablednofalse
buildArchivePathno./build-archives
buildArchiveRetentionno30
submoduleProfilePathPath to YAML submodule profile file.no""
submoduleVariantPathno""
submoduleTokenno""
localCacheEnabledEnable filesystem-based caching for local builds.nofalse
localCacheRootno""
localCacheLibrarynotrue
localCacheLfsnofalse
localCacheFallbackWhen the exact local cache key misses, try compatible cache keys from the same platform/version.nofalse
localCacheFallbackKeysComma-separated explicit local cache fallback keys to try after the exact key.no""
localCacheModeLocal Library cache mode: tar, copy-directory, move-directory, or canonical-overlay. move-directory is intended for same-volume Windows self-hosted runners. canonical-overlay (opt-in, NTFS/ext4/xfs) writes the cache once to a canonical store and per-runner overlays consume it via OS-native hardlinks. Falls back to move-directory on filesystems without hardlink support.notar
canonicalCacheRootPath for the canonical cache store when localCacheMode=canonical-overlay. Falls back to <localCacheRoot>/canonical when unset.no""
canonicalCacheClassifierJSON describing per-subdirectory hardlink/junction/copy/skip strategy. Default targets Unity Library structure (PackageCache=junction, ScriptAssemblies/Artifacts/etc.=hardlink, PackageManager+DAG companions=copy, editor session state=skip). Override for non-Unity engines or non-default Library layouts.no""
canonicalCacheVersionRetentionHow many canonical SHA versions to keep per cache key. Older versions are pruned by mtime.no2
cacheMaterializeMaterialization timing for canonical-overlay: eager (always live materialize before build) or prepared (build a per-runner overlay during PostUnityJob, atomic-rename into place during next PreUnityJob for sub-second hydration).noeager
cacheSentinelCanaryDefense-in-depth corruption check. Writes a canary file with known content into the overlay at materialize; verifies on consume. Catches silent corruption on aging hardware. Off by default.nofalse
upmOfflineEnabledWhen UPM fingerprint matches cached state, set UPM_OFFLINE=1 to skip network package resolution.nofalse
backgroundCacheSaveSave cache directory copies in a detached background process to avoid blocking the pipeline.nofalse
childWorkspacesEnabledEnable child workspace isolation for multi-product builds.nofalse
childWorkspaceNameno""
childWorkspaceCacheRootno""
childWorkspacePreserveGitnotrue
childWorkspaceSeparateLibrarynotrue
lfsTransferAgentCustom Git LFS transfer agent.no""
lfsTransferAgentArgsno""
lfsStoragePathsno""
gitHooksEnablednofalse
gitHooksSkipListno""
gitHooksRunBeforeBuildno""
hotRunnerEnabledUse persistent hot runner for builds.nofalse
hotRunnerTransportnowebsocket
hotRunnerHostnolocalhost
hotRunnerPortno9090
hotRunnerHealthIntervalno30
hotRunnerMaxIdleno3600
hotRunnerFallbackToColdnotrue
artifactOutputTypesComma-separated output types to collect.nobuild,logs,test-results
artifactUploadTargetUpload destination: github-artifacts, storage, local, none.nogithub-artifacts
artifactUploadPathno""
artifactCompressionnogzip
artifactRetentionDaysno30
artifactCustomTypesno""
preflightSuitePath to YAML preflight suite definition file. Preflight runs fast, no-engine validation checks before the build dispatch and fails fast on the first failure. Set to "default" to run the built-in fallback suite when no .game-ci/preflight-suite.yml exists. Empty disables preflight entirely. no""
testSuitePathPath to YAML test suite definition file.no""
testSuiteEventno""
testFilterRefsComma-separated suite filter preset names to inject into every test run.no""
testFilterInjectionInline YAML or JSON filter overlay injected into every test run. Supports refs, filters, and filterSets.no""
testFilterInjectionPathPath to a YAML or JSON test filter overlay file injected into every test run.no""
testTaxonomyPathno""
testResultFormatnojunit
testResultPathno./test-results
syncStrategyWorkspace sync strategy: full, git-delta, direct-input, storage-pull.nofull
syncInputRefno""
syncStorageRemoteno""
syncRevertAfternotrue
syncStatePathno.game-ci/sync-state.json
orchestratorRepoNamenogame-ci/unity-builder
cloneDepthno50
secretSourceSecret source for pulling build secrets.no""
storageProvidernos3
rcloneRemoteno""
cacheKeyno""
skipLfsnofalse
skipCachenofalse
skipInContainerCloneWhen true, skip the in-container git clone and reuse a pre-hydrated workspace bind-mounted by the caller. The caller must ensure the repository (with .git/, submodules, and LFS objects hydrated as needed) is present at the orchestrator workspace path before the container starts. Intended for self-hosted runners that use private LFS backends or other host-side credentials/config that cannot be replicated inside the container.nofalse
repoPathOverrideOverride the in-container repository path used by the orchestrator. When set, OrchestratorFolders.repoPathAbsolute returns this value instead of the default ${uniqueOrchestratorJobFolderAbsolute}/${repositoryFolder} layout. Intended to be paired with skipInContainerClone so the caller can point the orchestrator at a pre-hydrated workspace already bind-mounted at a fixed container path (for example /data, which is the default local-docker bind-mount target). Empty string preserves the default path. Setting this without skipInContainerClone is rejected at bootstrap because it would only affect the repo path and not the surrounding cache/builder paths, producing a divergent layout.no""
maxCacheEntriesMax cache tar entries to retain per folderno2
minCacheEntriesMinimum cache entries to keep during age-based GC (floor)no0
gcTimeoutMinutesForce garbage collection after this many minutes (0 = disabled)no0
configFilesJSON map of filename to content to inject into container workspaceno{}
postBuildStepsno""
preBuildStepsno""
containerHookFilesno""
customHookFilesno""
customCommandHooksno""
customJobno""
commandHooksno""
namedescription
volumeThe Persistent Volume where build artifacts are stored (K8s)
buildVersionThe generated version used for the Unity build
androidVersionCodeThe generated versionCode for Android builds
engineExitCodeExit code from the build (0 = success)
artifactManifestPathPath to the generated artifact manifest JSON