more
This commit is contained in:
Vendored
+64
-34
@@ -1,99 +1,129 @@
|
|||||||
import jetbrains.buildServer.configs.kotlin.*
|
import jetbrains.buildServer.configs.kotlin.*
|
||||||
import jetbrains.buildServer.configs.kotlin.buildSteps.powerShell
|
import jetbrains.buildServer.configs.kotlin.buildSteps.powerShell
|
||||||
|
import jetbrains.buildServer.configs.kotlin.buildSteps.script
|
||||||
|
|
||||||
version = "2026.1"
|
version = "2026.1"
|
||||||
|
|
||||||
project {
|
project {
|
||||||
|
|
||||||
description = "Unity CI (Windows + Android + extensible)"
|
description = "Unity CI - isolated platform builds"
|
||||||
|
|
||||||
buildType(UnityBuildCore)
|
|
||||||
buildType(WindowsBuild)
|
buildType(WindowsBuild)
|
||||||
buildType(AndroidBuild)
|
buildType(AndroidBuild)
|
||||||
|
buildType(MacBuild)
|
||||||
|
buildType(IOSBuild)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CORE BUILD (only place Unity runs)
|
* WINDOWS (also builds Android on Windows agent)
|
||||||
*/
|
*/
|
||||||
object UnityBuildCore : BuildType({
|
object WindowsBuild : BuildType({
|
||||||
|
|
||||||
name = "Unity Build (Core)"
|
name = "Unity - Windows (Agent: Windows)"
|
||||||
|
|
||||||
|
vcs {
|
||||||
|
root(DslContext.settingsRoot)
|
||||||
|
}
|
||||||
|
|
||||||
params {
|
params {
|
||||||
param("unity.target", "")
|
param("unity.target", "Windows")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
steps {
|
||||||
|
powerShell {
|
||||||
|
name = "Build Windows"
|
||||||
|
|
||||||
|
scriptMode = file {
|
||||||
|
path = "ci/Build-Windows.ps1"
|
||||||
|
}
|
||||||
|
|
||||||
|
scriptArgs = "-Target Windows"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
artifactRules = """
|
||||||
|
Builds/Windows/** => windows.zip
|
||||||
|
""".trimIndent()
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ANDROID (Windows agent)
|
||||||
|
*/
|
||||||
|
object AndroidBuild : BuildType({
|
||||||
|
|
||||||
|
name = "Unity - Android (Agent: Windows)"
|
||||||
|
|
||||||
vcs {
|
vcs {
|
||||||
root(DslContext.settingsRoot)
|
root(DslContext.settingsRoot)
|
||||||
}
|
}
|
||||||
|
|
||||||
steps {
|
steps {
|
||||||
|
|
||||||
powerShell {
|
powerShell {
|
||||||
name = "Run Unity Build"
|
name = "Build Android"
|
||||||
|
|
||||||
scriptMode = file {
|
scriptMode = file {
|
||||||
path = "ci/Build-Unity.ps1"
|
path = "ci/Build-Windows.ps1"
|
||||||
}
|
}
|
||||||
|
|
||||||
// SAFE: always passed from dependency configs
|
scriptArgs = "-Target Android"
|
||||||
scriptArgs = "-Target %unity.target%"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
artifactRules = """
|
artifactRules = """
|
||||||
Builds/** => builds.zip
|
Builds/Android/** => android.zip
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
})
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* WINDOWS BUILD
|
* MAC (macOS agent)
|
||||||
*/
|
*/
|
||||||
object WindowsBuild : BuildType({
|
object MacBuild : BuildType({
|
||||||
|
|
||||||
name = "Unity - Windows"
|
name = "Unity - Mac (Agent: Mac)"
|
||||||
|
|
||||||
params {
|
|
||||||
param("unity.target", "Windows")
|
|
||||||
}
|
|
||||||
|
|
||||||
vcs {
|
vcs {
|
||||||
root(DslContext.settingsRoot)
|
root(DslContext.settingsRoot)
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
steps {
|
||||||
snapshot(UnityBuildCore) {
|
script {
|
||||||
onDependencyFailure = FailureAction.FAIL_TO_START
|
name = "Build Mac"
|
||||||
|
|
||||||
|
scriptContent = """
|
||||||
|
chmod +x ci/Build-Mac.sh
|
||||||
|
./ci/Build-Mac.sh Mac
|
||||||
|
""".trimIndent()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
artifactRules = """
|
artifactRules = """
|
||||||
Builds/Windows/** => WindowsBuild.zip
|
Builds/Mac/** => mac.zip
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
})
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ANDROID BUILD
|
* iOS (macOS agent)
|
||||||
*/
|
*/
|
||||||
object AndroidBuild : BuildType({
|
object IOSBuild : BuildType({
|
||||||
|
|
||||||
name = "Unity - Android"
|
name = "Unity - iOS (Agent: Mac)"
|
||||||
|
|
||||||
params {
|
|
||||||
param("unity.target", "Android")
|
|
||||||
}
|
|
||||||
|
|
||||||
vcs {
|
vcs {
|
||||||
root(DslContext.settingsRoot)
|
root(DslContext.settingsRoot)
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
steps {
|
||||||
snapshot(UnityBuildCore) {
|
script {
|
||||||
onDependencyFailure = FailureAction.FAIL_TO_START
|
name = "Build iOS"
|
||||||
|
|
||||||
|
scriptContent = """
|
||||||
|
chmod +x ci/Build-Mac.sh
|
||||||
|
./ci/Build-Mac.sh iOS
|
||||||
|
""".trimIndent()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
artifactRules = """
|
artifactRules = """
|
||||||
Builds/Android/** => AndroidBuild.zip
|
Builds/iOS/** => ios.zip
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
})
|
})
|
||||||
@@ -4,17 +4,25 @@ using System.Linq;
|
|||||||
|
|
||||||
public static class BuildScript
|
public static class BuildScript
|
||||||
{
|
{
|
||||||
public static void Windows() =>
|
public static void Windows()
|
||||||
|
{
|
||||||
Build(BuildTarget.StandaloneWindows64, "Builds/Windows");
|
Build(BuildTarget.StandaloneWindows64, "Builds/Windows");
|
||||||
|
}
|
||||||
|
|
||||||
public static void Android() =>
|
public static void Android()
|
||||||
|
{
|
||||||
Build(BuildTarget.Android, "Builds/Android");
|
Build(BuildTarget.Android, "Builds/Android");
|
||||||
|
}
|
||||||
|
|
||||||
public static void Mac() =>
|
public static void Mac()
|
||||||
|
{
|
||||||
Build(BuildTarget.StandaloneOSX, "Builds/Mac");
|
Build(BuildTarget.StandaloneOSX, "Builds/Mac");
|
||||||
|
}
|
||||||
|
|
||||||
public static void iOS() =>
|
public static void iOS()
|
||||||
|
{
|
||||||
Build(BuildTarget.iOS, "Builds/iOS");
|
Build(BuildTarget.iOS, "Builds/iOS");
|
||||||
|
}
|
||||||
|
|
||||||
private static void Build(BuildTarget target, string outputPath)
|
private static void Build(BuildTarget target, string outputPath)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
TARGET=$1
|
||||||
|
|
||||||
|
if [[ -z "$TARGET" ]]; then
|
||||||
|
echo "Missing TARGET (Mac or iOS)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== Mac Build Starting ==="
|
||||||
|
echo "Target: $TARGET"
|
||||||
|
|
||||||
|
UNITY_VERSION="2022.3.62f1"
|
||||||
|
UNITY_ROOT="/Applications/Unity/Hub/Editor"
|
||||||
|
UNITY_EXE="$UNITY_ROOT/$UNITY_VERSION/Unity.app/Contents/MacOS/Unity"
|
||||||
|
|
||||||
|
if [[ ! -f "$UNITY_EXE" ]]; then
|
||||||
|
echo "Unity not installed at $UNITY_EXE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$TARGET" in
|
||||||
|
Mac)
|
||||||
|
METHOD="BuildScript.Mac"
|
||||||
|
;;
|
||||||
|
iOS)
|
||||||
|
METHOD="BuildScript.iOS"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown target: $TARGET"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
"$UNITY_EXE" \
|
||||||
|
-batchmode \
|
||||||
|
-nographics \
|
||||||
|
-quit \
|
||||||
|
-projectPath "$(pwd)" \
|
||||||
|
-executeMethod $METHOD \
|
||||||
|
-logFile -
|
||||||
|
|
||||||
|
echo "=== Build SUCCESS: $TARGET ==="
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
param(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$Target
|
|
||||||
)
|
|
||||||
|
|
||||||
Write-Host "============================="
|
|
||||||
Write-Host "Unity Build Starting"
|
|
||||||
Write-Host "Target: $Target"
|
|
||||||
Write-Host "============================="
|
|
||||||
|
|
||||||
if ([string]::IsNullOrWhiteSpace($Target)) {
|
|
||||||
throw "ERROR: Target was empty. TeamCity did not pass unity.target correctly."
|
|
||||||
}
|
|
||||||
|
|
||||||
$config = Get-Content ".\ci\toolchain.json" | ConvertFrom-Json
|
|
||||||
|
|
||||||
if (-not $config.targets.$Target) {
|
|
||||||
throw "Unknown build target: $Target"
|
|
||||||
}
|
|
||||||
|
|
||||||
$t = $config.targets.$Target
|
|
||||||
|
|
||||||
$UnityExe = Join-Path $config.unityRoot "$($config.unityVersion)\Editor\Unity.exe"
|
|
||||||
|
|
||||||
if (!(Test-Path $UnityExe)) {
|
|
||||||
throw "Unity not installed at expected path: $UnityExe"
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "Using Unity: $UnityExe"
|
|
||||||
Write-Host "Executing method: $($t.method)"
|
|
||||||
Write-Host "Output: $($t.outputPath)"
|
|
||||||
|
|
||||||
& $UnityExe `
|
|
||||||
-batchmode `
|
|
||||||
-nographics `
|
|
||||||
-quit `
|
|
||||||
-projectPath $PWD `
|
|
||||||
-executeMethod $t.method `
|
|
||||||
-logFile -
|
|
||||||
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
throw "Unity build FAILED for target: $Target"
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "Build SUCCESS: $Target"
|
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
param(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[ValidateSet("Windows","Android")]
|
||||||
|
[string]$Target
|
||||||
|
)
|
||||||
|
|
||||||
|
Write-Host "=== Windows Build Starting ==="
|
||||||
|
Write-Host "Target: $Target"
|
||||||
|
|
||||||
|
$config = Get-Content ".\ci\toolchain.json" | ConvertFrom-Json
|
||||||
|
|
||||||
|
$unityVersion = $config.unityVersion
|
||||||
|
$unityRoot = $config.windows.unityRoot
|
||||||
|
|
||||||
|
$unityExe = Join-Path $unityRoot "$unityVersion\Editor\Unity.exe"
|
||||||
|
|
||||||
|
if (!(Test-Path $unityExe)) {
|
||||||
|
throw "Unity not installed: $unityExe"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----------------------------
|
||||||
|
# Toolchain setup (Windows agent)
|
||||||
|
# ----------------------------
|
||||||
|
|
||||||
|
Write-Host "Ensuring toolchain (Unity + Android SDK/JDK/NDK)..."
|
||||||
|
|
||||||
|
# NOTE: In real setups you either:
|
||||||
|
# - rely on Unity Hub installs, OR
|
||||||
|
# - preinstalled cached toolchain
|
||||||
|
# This script assumes preinstalled Hub-managed tools.
|
||||||
|
|
||||||
|
# ----------------------------
|
||||||
|
# Select Unity method
|
||||||
|
# ----------------------------
|
||||||
|
|
||||||
|
$method = switch ($Target) {
|
||||||
|
"Windows" { "BuildScript.Windows" }
|
||||||
|
"Android" { "BuildScript.Android" }
|
||||||
|
}
|
||||||
|
|
||||||
|
& $unityExe `
|
||||||
|
-batchmode `
|
||||||
|
-nographics `
|
||||||
|
-quit `
|
||||||
|
-projectPath $PWD `
|
||||||
|
-executeMethod $method `
|
||||||
|
-logFile -
|
||||||
|
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
throw "Build failed: $Target"
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "=== Build SUCCESS: $Target ==="
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
param(
|
|
||||||
[string]$ConfigPath = ".\ci\toolchain.json"
|
|
||||||
)
|
|
||||||
|
|
||||||
$config = Get-Content $ConfigPath | ConvertFrom-Json
|
|
||||||
|
|
||||||
$UnityVersion = $config.unityVersion
|
|
||||||
$UnityExe = Join-Path $config.unityRoot "$UnityVersion\Editor\Unity.exe"
|
|
||||||
|
|
||||||
Write-Host "Checking Unity $UnityVersion..."
|
|
||||||
|
|
||||||
if (!(Test-Path $UnityExe)) {
|
|
||||||
throw "Unity version not installed: $UnityVersion"
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "Unity found: $UnityExe"
|
|
||||||
|
|
||||||
# expose for later steps
|
|
||||||
$env:UNITY_VERSION = $UnityVersion
|
|
||||||
$env:UNITY_EXE = $UnityExe
|
|
||||||
|
|
||||||
return $UnityExe
|
|
||||||
+16
-12
@@ -1,18 +1,22 @@
|
|||||||
{
|
{
|
||||||
"unityVersion": "2022.3.62f1",
|
"unityVersion": "2022.3.62f1",
|
||||||
"unityRoot": "C:\\Program Files\\Unity\\Hub\\Editor",
|
|
||||||
|
|
||||||
"targets": {
|
"windows": {
|
||||||
"Windows": {
|
"unityRoot": "C:\\Program Files\\Unity\\Hub\\Editor",
|
||||||
"method": "BuildScript.Windows",
|
"modules": [
|
||||||
"outputPath": "Builds/Windows/Game.exe",
|
"android",
|
||||||
"buildTarget": "StandaloneWindows64"
|
"android-sdk-ndk-tools",
|
||||||
},
|
"android-open-jdk",
|
||||||
|
"windows-il2cpp"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
"Android": {
|
"mac": {
|
||||||
"method": "BuildScript.Android",
|
"unityRoot": "/Applications/Unity/Hub/Editor",
|
||||||
"outputPath": "Builds/Android/Game.aab",
|
"modules": [
|
||||||
"buildTarget": "Android"
|
"ios-il2cpp",
|
||||||
}
|
"mac-mono",
|
||||||
|
"android"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user