import jetbrains.buildServer.configs.kotlin.* version = "2026.1" project { description = "Unity CI pipeline with multi-target build fan-out" // ========================= // CORE BUILD (shared logic) // ========================= buildType(UnityBuildCore) // ========================= // TRIGGERED BUILDS (fan-out) // ========================= buildType(WindowsBuild) buildType(AndroidBuild) // Future-ready (disabled until you enable them) buildType(MacBuild) buildType(IOSBuild) } /** * ========================= * CORE UNITY BUILD PIPELINE * ========================= * This is the ONLY build that actually runs Unity. * Everything else just sets parameters and depends on this. */ object UnityBuildCore : BuildType({ name = "Unity Build (Core)" description = "Runs Unity with a selected target" params { // Default fallback (should never be used in real triggers) param("unity.target", "") // Optional CI metadata param("build.configuration", "Release") } vcs { root(DslContext.settingsRoot) } steps { powerShell { name = "Run Unity Build" scriptMode = file { path = "ci/Build-Unity.ps1" } scriptArgs = "-Target %unity.target%" } } features { // Ensures build log is captured cleanly feature { type = "xml-report-plugin" } } artifactRules = """ Builds/** => builds.zip """.trimIndent() }) /** * ========================= * WINDOWS BUILD ENTRYPOINT * ========================= * Triggered automatically on VCS changes */ object WindowsBuild : BuildType({ name = "Unity - Windows" description = "Build Windows standalone" params { param("unity.target", "Windows") } vcs { root(DslContext.settingsRoot) } steps { // Snapshot dependency ensures correct ordering } dependencies { snapshot(UnityBuildCore) { onDependencyFailure = FailureAction.FAIL_TO_START } } artifactRules = """ Builds/Windows/** => WindowsBuild.zip """.trimIndent() }) /** * ========================= * ANDROID BUILD ENTRYPOINT * ========================= */ object AndroidBuild : BuildType({ name = "Unity - Android" description = "Build Android AAB/APK" params { param("unity.target", "Android") } vcs { root(DslContext.settingsRoot) } dependencies { snapshot(UnityBuildCore) { onDependencyFailure = FailureAction.FAIL_TO_START } } artifactRules = """ Builds/Android/** => AndroidBuild.zip """.trimIndent() }) /** * ========================= * MAC BUILD (future ready) * ========================= * Requires macOS agent + Xcode */ object MacBuild : BuildType({ name = "Unity - Mac (Disabled)" description = "Future macOS build target" params { param("unity.target", "Mac") } vcs { root(DslContext.settingsRoot) } dependencies { snapshot(UnityBuildCore) {} } enabled = false }) /** * ========================= * iOS BUILD (future ready) * ========================= * Requires macOS agent + Xcode + provisioning profiles */ object IOSBuild : BuildType({ name = "Unity - iOS (Disabled)" description = "Future iOS build target" params { param("unity.target", "iOS") } vcs { root(DslContext.settingsRoot) } dependencies { snapshot(UnityBuildCore) {} } enabled = false })