Jessica James
4 years ago
commit
5a78d35d52
14 changed files with 1191 additions and 0 deletions
@ -0,0 +1,83 @@ |
|||||
|
{ |
||||
|
"branches": { |
||||
|
"release": { |
||||
|
"type": "RenX" |
||||
|
}, |
||||
|
"beta": { |
||||
|
"type": "RenX" |
||||
|
}, |
||||
|
"alpha": { |
||||
|
"type": "TibSun" |
||||
|
}, |
||||
|
"nightly": { |
||||
|
"type": "RenX" |
||||
|
}, |
||||
|
"nightly_ts": { |
||||
|
"type": "TibSun" |
||||
|
}, |
||||
|
"launcher": { |
||||
|
"type": "RenX" |
||||
|
}, |
||||
|
"sdk": { |
||||
|
"type": "RenX.SDK" |
||||
|
} |
||||
|
}, |
||||
|
"types": { |
||||
|
"RenX": { |
||||
|
"product": "game", |
||||
|
"prefix": "Patch", |
||||
|
"cook": true, |
||||
|
"retargets": [ |
||||
|
{ |
||||
|
"source": "^UDKGame\\\\Content\\\\", |
||||
|
"target": "UDKGame\\CookedPC\\" |
||||
|
} |
||||
|
], |
||||
|
"excluded_code": [ |
||||
|
"RA_Game", |
||||
|
"TibSun_Game" |
||||
|
] |
||||
|
}, |
||||
|
"TibSun": { |
||||
|
"product": "game", |
||||
|
"prefix": "TSPatch", |
||||
|
"cook": true, |
||||
|
"retargets": [ |
||||
|
{ |
||||
|
"source": "^UDKGame\\\\Content\\\\", |
||||
|
"target": "UDKGame\\CookedPC\\" |
||||
|
} |
||||
|
], |
||||
|
"excluded_code": [ |
||||
|
"RA_Game" |
||||
|
] |
||||
|
}, |
||||
|
"RenX.SDK": { |
||||
|
"product": "sdk", |
||||
|
"prefix": "SDK", |
||||
|
"cook": false, |
||||
|
"excluded_code": [ |
||||
|
"RA_Game", |
||||
|
"TibSun_Game" |
||||
|
] |
||||
|
}, |
||||
|
"TibSun.SDK": { |
||||
|
"product": "sdk", |
||||
|
"prefix": "TSSDK", |
||||
|
"cook": false, |
||||
|
"excluded_code": [ |
||||
|
"RA_Game" |
||||
|
] |
||||
|
} |
||||
|
}, |
||||
|
"nodes": { |
||||
|
"default": { |
||||
|
"cook_params": "-platform=pc -verbose -singlethread -auto -unattended -nopause -processes=1", |
||||
|
"pull_mirror": "http://us-lv.buyvm.renegade-x.com/" |
||||
|
}, |
||||
|
"win2": { |
||||
|
"cook_params": "-platform=pc -verbose -singlethread -auto -unattended -nopause -processes=1", |
||||
|
"pull_mirror": "http://10.10.10.2:8081/" |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,53 @@ |
|||||
|
# Root folder |
||||
|
^compile\.bat$ |
||||
|
^Start[A-Za-z]+\.bat$ |
||||
|
|
||||
|
# Binaries folder |
||||
|
^Binaries\\ActorX\\.+ |
||||
|
^Binaries\\FaceFXPlugins\\.+ |
||||
|
^Binaries\\GFx\\.+ |
||||
|
^Binaries\\Redist\\.+ |
||||
|
^Binaries\\SpeedTreeModeler\\.+ |
||||
|
^Binaries\\[A-Za-z\.]+\.exe$ |
||||
|
^Binaries\\[A-Za-z\.]+\.dll$ |
||||
|
^Binaries\\[A-Za-z\.]+\.config$ |
||||
|
^Binaries\\[A-Za-z\.]+\.xml$ |
||||
|
|
||||
|
# Development folder |
||||
|
^Development\\Flash\\.+ |
||||
|
^Development\\Src\\(?!TibSun_Game)(?!RA_Game)(?!ConsoleVariableLibrary)[A-Za-z0-9\-_]+\\.+ |
||||
|
|
||||
|
# Engine folder |
||||
|
^Engine\\.+ |
||||
|
|
||||
|
# ExampleAssets folder |
||||
|
^ExampleAssets\\.+ |
||||
|
|
||||
|
# |
||||
|
# UDKGame |
||||
|
# |
||||
|
|
||||
|
# Build |
||||
|
^UDKGame\\Build\\.+ |
||||
|
|
||||
|
# Content |
||||
|
^UDKGame\\Content\\Functions\\.+ |
||||
|
^UDKGame\\Content\\GFx\\.+ |
||||
|
^UDKGame\\Content\\RedAlert\\.+ |
||||
|
^UDKGame\\Content\\RenX\\.+ |
||||
|
^UDKGame\\Content\\Shared\\.+ |
||||
|
^UDKGame\\Content\\Showcases\\.+ |
||||
|
^UDKGame\\Content\\TestPackages\\.+ |
||||
|
^UDKGame\\Content\\UT3\\.+ |
||||
|
^UDKGame\\Content\\[A-Za-z0-9\-_]+\.bin$ |
||||
|
^UDKGame\\Content\\[A-Za-z0-9\-_]+\.upk$ |
||||
|
|
||||
|
# Flash |
||||
|
^UDKGame\\Flash\\(?!TSHUD)(?!TSPurchaseMenu).+ |
||||
|
|
||||
|
# ProjectTemplates |
||||
|
^UDKGame\\ProjectTemplates\\.+ |
||||
|
|
||||
|
# Script |
||||
|
^UDKGame\\Script\\(?!TibSun_Game)(?!RA_Game)(?!ConsoleVariableLibrary)[A-Za-z\-_]+\.u |
||||
|
^UDKGame\\Script\\Manifest.txt$ |
@ -0,0 +1,54 @@ |
|||||
|
# Root folder |
||||
|
^compile\.bat$ |
||||
|
^Start[A-Za-z]+\.bat$ |
||||
|
|
||||
|
# Binaries folder |
||||
|
^Binaries\\ActorX\\.+ |
||||
|
^Binaries\\FaceFXPlugins\\.+ |
||||
|
^Binaries\\GFx\\.+ |
||||
|
^Binaries\\Redist\\.+ |
||||
|
^Binaries\\SpeedTreeModeler\\.+ |
||||
|
^Binaries\\[A-Za-z\.]+\.exe$ |
||||
|
^Binaries\\[A-Za-z\.]+\.dll$ |
||||
|
^Binaries\\[A-Za-z\.]+\.config$ |
||||
|
^Binaries\\[A-Za-z\.]+\.xml$ |
||||
|
|
||||
|
# Development folder |
||||
|
^Development\\Flash\\.+ |
||||
|
^Development\\Src\\(?!RA_Game)(?!ConsoleVariableLibrary)[A-Za-z0-9\-_]+\\.+ |
||||
|
|
||||
|
# Engine folder |
||||
|
^Engine\\.+ |
||||
|
|
||||
|
# ExampleAssets folder |
||||
|
^ExampleAssets\\.+ |
||||
|
|
||||
|
# |
||||
|
# UDKGame |
||||
|
# |
||||
|
|
||||
|
# Build |
||||
|
^UDKGame\\Build\\.+ |
||||
|
|
||||
|
# Content |
||||
|
^UDKGame\\Content\\Functions\\.+ |
||||
|
^UDKGame\\Content\\GFx\\.+ |
||||
|
^UDKGame\\Content\\RedAlert\\.+ |
||||
|
^UDKGame\\Content\\RenX\\.+ |
||||
|
^UDKGame\\Content\\Shared\\.+ |
||||
|
^UDKGame\\Content\\Showcases\\.+ |
||||
|
^UDKGame\\Content\\TestPackages\\.+ |
||||
|
^UDKGame\\Content\\TiberianSun\\.+ |
||||
|
^UDKGame\\Content\\UT3\\.+ |
||||
|
^UDKGame\\Content\\[A-Za-z0-9\-_]+\.bin$ |
||||
|
^UDKGame\\Content\\[A-Za-z0-9\-_]+\.upk$ |
||||
|
|
||||
|
# Flash |
||||
|
^UDKGame\\Flash\\.+ |
||||
|
|
||||
|
# ProjectTemplates |
||||
|
^UDKGame\\ProjectTemplates\\.+ |
||||
|
|
||||
|
# Script |
||||
|
^UDKGame\\Script\\(?!RA_Game)(?!ConsoleVariableLibrary)[A-Za-z\-_]+\.u |
||||
|
^UDKGame\\Script\\Manifest.txt$ |
@ -0,0 +1,7 @@ |
|||||
|
# |
||||
|
# CookedPC |
||||
|
# |
||||
|
^UDKGame\\CookedPC\\TiberianSun\\.+ |
||||
|
|
||||
|
# TibSun_Game.u |
||||
|
^UDKGame\\CookedPC\\[A-Za-z-_]+\.u |
@ -0,0 +1,72 @@ |
|||||
|
# |
||||
|
# PATCH INCLUSION LIST |
||||
|
# |
||||
|
# Each line must either be one of the following: |
||||
|
# 1) Entirely whitespace / empty (ignored by builds) |
||||
|
# 2) Start with # to indicate a comment (ignored by builds) |
||||
|
# 3) A regular expression to match files against, to indicate that they need to be included in the build |
||||
|
# |
||||
|
|
||||
|
# Binaries folder |
||||
|
^Binaries\\Win32\\.+ |
||||
|
^Binaries\\Win64\\.+ |
||||
|
^Binaries\\InstallData\\.+ |
||||
|
^Binaries\\build\.properties$ |
||||
|
^Binaries\\Ionic\.Zip\.Reduced\.dll$ |
||||
|
^Binaries\\MobileShaderAnalyzer\.exe$ |
||||
|
^Binaries\\MobileShaderAnalyzer\.exe\.config$ |
||||
|
^Binaries\\P4API\.dll$ |
||||
|
^Binaries\\RPCUtility\.exe$ |
||||
|
^Binaries\\RPCUtility\.exe\.config$ |
||||
|
^Binaries\\ShaderKeyTool\.exe$ |
||||
|
^Binaries\\ShaderKeyTool\.exe\.config$ |
||||
|
^Binaries\\UDKLift\.exe$ |
||||
|
^Binaries\\UnSetup\.exe$ |
||||
|
^Binaries\\UnSetup\.exe\.config$ |
||||
|
^Binaries\\UnSetup\.Game\.xml$ |
||||
|
^Binaries\\UnSetup\.Manifests\.Game\.xml$ |
||||
|
^Binaries\\UnSetup\.Manifests\.xml$ |
||||
|
|
||||
|
# Engine folder |
||||
|
^Engine\\Config\\[A-Za-z]+\.ini$ |
||||
|
^Engine\\Localization\\.+\\.+ |
||||
|
^Engine\\Shaders\\Binaries\\.+ |
||||
|
|
||||
|
# Preview videos |
||||
|
^PreviewVids\\Default.+ |
||||
|
|
||||
|
# |
||||
|
# UDKGame |
||||
|
# |
||||
|
|
||||
|
^UDKGame\\PCTOC.*\.txt$ |
||||
|
|
||||
|
# Cloud |
||||
|
^UDKGame\\Cloud\\.+ |
||||
|
|
||||
|
# Configs |
||||
|
^UDKGame\\Config\\Default.+\.ini$ |
||||
|
|
||||
|
# CookedPC |
||||
|
^UDKGame\\CookedPC\\Functions\\.+ |
||||
|
^UDKGame\\CookedPC\\GFx\\.+ |
||||
|
^UDKGame\\CookedPC\\Maps\\.+ |
||||
|
^UDKGame\\CookedPC\\RedAlert\\.+ |
||||
|
^UDKGame\\CookedPC\\RenX\\.+ |
||||
|
^UDKGame\\CookedPC\\Shared\\.+ |
||||
|
^UDKGame\\CookedPC\\UT3\\.+ |
||||
|
^UDKGame\\CookedPC\\[A-Za-z0-9\-_]+\.bin$ |
||||
|
^UDKGame\\CookedPC\\[A-Za-z0-9\-_]+\.upk$ |
||||
|
^UDKGame\\CookedPC\\(?!TibSun_Game)[A-Za-z-_]+\.u |
||||
|
|
||||
|
# Localization |
||||
|
^UDKGame\\Localization\\.+ |
||||
|
|
||||
|
# Movies |
||||
|
^UDKGame\\Movies\\RenX_Startup\.bik |
||||
|
^UDKGame\\Movies\\UDKFrontEnd.udk_loading\.bik |
||||
|
^UDKGame\\Movies\\UDKFrontEnd.udk_loading_HowToPlay\.bik |
||||
|
^UDKGame\\Movies\\UE3_logo\.bik |
||||
|
|
||||
|
# Splash |
||||
|
^UDKGame\\Splash\\.+ |
@ -0,0 +1,4 @@ |
|||||
|
RenX-FrontEndMap |
||||
|
RenX-MenuMap |
||||
|
CNC-PTLevel |
||||
|
CNC-TestMap_MP |
@ -0,0 +1,48 @@ |
|||||
|
BH-Daybreak |
||||
|
BH-Field |
||||
|
BH-LakeSide |
||||
|
BH-Snow |
||||
|
BH-Steppe |
||||
|
BH-Tomb |
||||
|
BH-Under |
||||
|
BH-Walls |
||||
|
|
||||
|
CNC-Arctic_Stronghold |
||||
|
CNC-Canyon |
||||
|
CNC-CliffSide |
||||
|
CNC-Complex |
||||
|
CNC-Crash_Site |
||||
|
CNC-Daybreak |
||||
|
CNC-Desolation |
||||
|
CNC-Eyes |
||||
|
CNC-Field |
||||
|
CNC-Field_X |
||||
|
CNC-Forest |
||||
|
CNC-Fort |
||||
|
CNC-GoldRush |
||||
|
CNC-Hourglass |
||||
|
CNC-Islands |
||||
|
CNC-Islands_X |
||||
|
CNC-LakeSide |
||||
|
CNC-Mesa |
||||
|
CNC-Oasis |
||||
|
CNC-Outposts |
||||
|
CNC-Reservoir |
||||
|
CNC-Snow |
||||
|
CNC-Snow_X |
||||
|
CNC-Steppe |
||||
|
CNC-Storm |
||||
|
CNC-Tomb |
||||
|
CNC-Tunnels |
||||
|
CNC-Under |
||||
|
CNC-Uphill |
||||
|
CNC-Volcano |
||||
|
CNC-Walls |
||||
|
CNC-Whiteout |
||||
|
CNC-Xmountain |
||||
|
|
||||
|
DEF-DarkNight |
||||
|
DEF-LakeSide |
||||
|
|
||||
|
TDM-Caves |
||||
|
TDM-Deck |
@ -0,0 +1,2 @@ |
|||||
|
RenX-FrontEndMap |
||||
|
RenX-MenuMap |
@ -0,0 +1,8 @@ |
|||||
|
CNC-City_Flying |
||||
|
TS-CrashSite |
||||
|
TS-Pharaoh |
||||
|
TS-Sanctuary |
||||
|
TS-Hovgaard |
||||
|
TS-Terrace |
||||
|
TS-Rift |
||||
|
TS-Pharaoh_Small |
@ -0,0 +1,2 @@ |
|||||
|
# These are levels that are included in both TibSun AND RenX builds |
||||
|
# Also known as: none |
@ -0,0 +1,175 @@ |
|||||
|
#!groovy |
||||
|
|
||||
|
def GetJobString() { |
||||
|
return JOB_NAME.substring(JOB_NAME.lastIndexOf('/') + 1, JOB_NAME.length()) + " #" + BUILD_NUMBER |
||||
|
} |
||||
|
|
||||
|
def GetBaseDiscordDescription() { |
||||
|
return ( |
||||
|
"Name: ${env.VersionName}.${env.BUILD_NUMBER}\n" |
||||
|
+ "Branch: ${env.VersionBranch}\n" |
||||
|
+ "Type: ${env.BuildType}\n" |
||||
|
+ "Build: [${env.BUILD_NUMBER}](${env.BUILD_URL})\n" |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
def GetStartedDiscordDescription() { |
||||
|
return ( |
||||
|
GetBaseDiscordDescription() |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
def GetFinishedDiscordDescription() { |
||||
|
return ( |
||||
|
GetBaseDiscordDescription() |
||||
|
+ "Status: [" + currentBuild.currentResult + "](${env.BUILD_URL})\n" |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
def GetSuccessDiscordDescription() { |
||||
|
return ( |
||||
|
GetFinishedDiscordDescription() |
||||
|
+ "Artifacts: [changelog.txt](${env.BUILD_URL}artifact/changelog.txt), [included_files.txt](${env.BUILD_URL}artifact/included_files.txt)" |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
def GetJobDescription() { |
||||
|
def PatchDataName = readFile(file: 'PatchDataName.txt', encoding: 'UTF-16') |
||||
|
return ("Build successful. Run the \"Set Game Version\" plan to point the appropriate branch to " + PatchDataName) |
||||
|
} |
||||
|
|
||||
|
def SetJobDescription() { |
||||
|
currentBuild.description = GetJobDescription() |
||||
|
} |
||||
|
|
||||
|
pipeline{ |
||||
|
agent { |
||||
|
node { |
||||
|
label 'renx-build' |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
environment { |
||||
|
DISCORD_WEBHOOK = credentials("f704b0eb-41e9-42d3-be14-0f951d6ef10b") |
||||
|
SVN_CREDS = credentials("bd2310a8-7607-4257-b749-7570e4ff2e22") |
||||
|
VCS_SSH_KEY = credentials("9b40a4a9-38fd-4230-bb4b-7fd29a09af85") |
||||
|
ROOT_DIR = "${env.workspace}" |
||||
|
UDK_PATH = "${ROOT_DIR}\\UDK_Uncooked" |
||||
|
BUILD_PATH = "${UDK_PATH}\\build" |
||||
|
UDK_URL = "svn://svn.renegade-x.com/svn/main/UDK_Uncooked" |
||||
|
} |
||||
|
|
||||
|
parameters { |
||||
|
choice(name: "BuildType", choices: ["Auto", "RenX", "TibSun", "RenX.SDK", "TibSun.SDK"], description: "") |
||||
|
choice(name: "VersionBranch", choices: ["release", "beta", "alpha", "nightly", "nightly_ts", "launcher", "sdk"], description: "Version branch to base the build on") |
||||
|
string(name: "VersionName", defaultValue: "", description: "Version name to assign to the build (i.e: Open Beta 5.1234)") |
||||
|
string(name: "RevisionNumber", defaultValue: "0", description: "SVN revision number to base the build on; leave as 0 to use most recent revision") |
||||
|
} |
||||
|
|
||||
|
stages { |
||||
|
stage("Prepare Workspace") { |
||||
|
// Requires: UdkPath, UdkUrl, TargetRevision, RootDir, BuildPath |
||||
|
steps { |
||||
|
discordSend description: GetStartedDiscordDescription(), footer: "Build Started", link: env.BUILD_URL, result: currentBuild.currentResult, title: ("Build Started: " + GetJobString()), webhookURL: "${env.DISCORD_WEBHOOK}" |
||||
|
|
||||
|
echo "Preparing Workspace..." |
||||
|
powershell ''' |
||||
|
# Source in common.ps1 |
||||
|
. "${Env:ROOT_DIR}\\common.ps1" |
||||
|
|
||||
|
# Prep the workspace |
||||
|
PrepRootDir "${Env:ROOT_DIR}" |
||||
|
|
||||
|
# Prep the workspace |
||||
|
PrepSVN "${Env:UDK_PATH}" "${Env:UDK_URL}" "${Env:RevisionNumber}" -SvnUsername ${Env:SVN_CREDS_USR} -SvnPassword ${Env:SVN_CREDS_PSW} |
||||
|
''' |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
stage("Build UDK") { |
||||
|
// Requires: BuildPath, SourceBranch, BuildType, UdkPath |
||||
|
steps { |
||||
|
echo "Building UDK..." |
||||
|
|
||||
|
powershell ''' |
||||
|
# Source in common.ps1 |
||||
|
. "${Env:ROOT_DIR}\\common.ps1" |
||||
|
|
||||
|
# Pull config data if type Auto |
||||
|
$BuildType = (GetBuildType "${Env:BUILD_PATH}" "${Env:VersionBranch}" -BuildType "${Env:BuildType}") |
||||
|
|
||||
|
# Build UDK |
||||
|
BuildUdk "${Env:UDK_PATH}" "$BuildType" |
||||
|
''' |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
stage("Make Patch") { |
||||
|
// Requires: RootDir, UdkPath, BuildType, PatchName, SourceBranch |
||||
|
steps { |
||||
|
echo "Making Patch Data..." |
||||
|
|
||||
|
powershell ''' |
||||
|
# Source in common.ps1 |
||||
|
. "${Env:ROOT_DIR}\\common.ps1" |
||||
|
|
||||
|
# Pull config data if type Auto |
||||
|
$BuildType = (GetBuildType "${Env:BUILD_PATH}" "${Env:VersionBranch}" -BuildType "${Env:BuildType}") |
||||
|
|
||||
|
# Make patch data |
||||
|
$PatchDataName = (MakePatchData "${Env:ROOT_DIR}" "${Env:UDK_PATH}" "$BuildType" "${Env:VersionName}.${Env:BUILD_NUMBER}" "${Env:VersionBranch}" -DeleteBuild) |
||||
|
echo "$PatchDataName" | Out-File "${Env:ROOT_DIR}\\PatchDataName.txt" -NoNewLine |
||||
|
''' |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
stage("Publish Patch") { |
||||
|
// Requires: Env:SSHKey, Env:SSHUsername, RootDir, PatchDataName |
||||
|
steps { |
||||
|
echo "Publishing Patch..." |
||||
|
|
||||
|
powershell ''' |
||||
|
$PatchDataName = (Get-Content "${Env:ROOT_DIR}\\PatchDataName.txt") |
||||
|
|
||||
|
# Source in common.ps1 |
||||
|
. "${Env:ROOT_DIR}\\common.ps1" |
||||
|
|
||||
|
# Publish patch data |
||||
|
PublishPatchData ${Env:VCS_SSH_KEY} ${Env:VCS_SSH_KEY_USR} "vcs.glitchware.com:/home/renx/patches/data/" "${Env:ROOT_DIR}\\$PatchDataName" |
||||
|
''' |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
post { |
||||
|
success { |
||||
|
archiveArtifacts 'included_files.txt,changelog.txt' |
||||
|
|
||||
|
echo GetJobDescription() |
||||
|
SetJobDescription() |
||||
|
discordSend description: GetSuccessDiscordDescription(), footer: GetJobDescription(), link: env.BUILD_URL, result: currentBuild.currentResult, title: GetJobString(), webhookURL: "${env.DISCORD_WEBHOOK}" |
||||
|
} |
||||
|
|
||||
|
failure { |
||||
|
discordSend description: GetFinishedDiscordDescription(), footer: "Build FAILED", link: env.BUILD_URL, result: currentBuild.currentResult, title: GetJobString(), webhookURL: "${env.DISCORD_WEBHOOK}" |
||||
|
} |
||||
|
|
||||
|
aborted { |
||||
|
discordSend description: GetFinishedDiscordDescription(), footer: "Build ABORTED", link: env.BUILD_URL, result: currentBuild.currentResult, title: GetJobString(), webhookURL: "${env.DISCORD_WEBHOOK}" |
||||
|
} |
||||
|
|
||||
|
cleanup { |
||||
|
// Cleanup build environment |
||||
|
powershell ''' |
||||
|
# Remove any lingering builds |
||||
|
Remove-Item "${Env:ROOT_DIR}\\Build*" -Recurse |
||||
|
|
||||
|
# Remove any lingering patch data |
||||
|
Remove-Item "${Env:ROOT_DIR}\\Patch*" -Recurse |
||||
|
Remove-Item "${Env:ROOT_DIR}\\TSPatch*" -Recurse |
||||
|
Remove-Item "${Env:ROOT_DIR}\\SDK*" -Recurse |
||||
|
Remove-Item "${Env:ROOT_DIR}\\TSSDK*" -Recurse |
||||
|
''' |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,611 @@ |
|||||
|
function ForceDesktopSession { |
||||
|
$LoggedInUser = $Env:USERNAME |
||||
|
|
||||
|
# Get list of users |
||||
|
$UserSessions = $(quser | ForEach-Object -Process { $_ -replace '\s{2,}',',' } | ConvertFrom-CSV) |
||||
|
ForEach ($UserSession in $UserSessions) { |
||||
|
if ($UserSession.USERNAME -eq "$LoggedInUser" -or |
||||
|
$UserSession.USERNAME -eq ">$LoggedInUser") { |
||||
|
# Found our user; check if we're in a session or not |
||||
|
if ($UserSession.STATE -eq "Disc" -or |
||||
|
$UserSession.ID -eq "Disc") { |
||||
|
# Our session state is disconnected; open up the console |
||||
|
$username = $UserSession.USERNAME; |
||||
|
Write-Host "$LoggedInUser is disconnected; opening console" |
||||
|
tscon $UserSession.SESSIONNAME /dest:console |
||||
|
sleep 10 # Give Windows some time to init the console session |
||||
|
} |
||||
|
break |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function PrepRootDir { |
||||
|
Param( |
||||
|
[string]$RootDir |
||||
|
) |
||||
|
|
||||
|
# Add this directory to windows defender |
||||
|
Write-Host "Adding Windows Defender exclusion..." |
||||
|
Add-MpPreference -ExclusionPath "$RootDir" |
||||
|
} |
||||
|
|
||||
|
function PrepSVN { |
||||
|
Param( |
||||
|
[string]$UdkPath, |
||||
|
[string]$UdkUrl, |
||||
|
[int]$TargetRevision, |
||||
|
[string]$SvnUsername="", |
||||
|
[string]$SvnPassword="" |
||||
|
) |
||||
|
|
||||
|
if (![System.IO.Directory]::Exists("$UdkPath")) { |
||||
|
Write-Host "Checking out UDK_Uncooked..." |
||||
|
if (![string]::IsNullOrWhiteSpace($SvnUsername) -and |
||||
|
![string]::IsNullOrWhiteSpace($SvnPassword)) { |
||||
|
svn checkout --non-interactive --trust-server-cert --username $SvnUsername --password $SvnPassword $UdkUrl $UdkPath |
||||
|
} |
||||
|
else { |
||||
|
svn checkout $UdkUrl $UdkPath |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
# Revert any local changes |
||||
|
svn revert --recursive $UdkPath |
||||
|
|
||||
|
# Update UDK to latest revision |
||||
|
if ($TargetRevision -eq 0) { |
||||
|
svn update $UdkPath |
||||
|
} |
||||
|
else { |
||||
|
svn update -r $TargetRevision $UdkPath |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function GetSvnRevision { |
||||
|
Param( |
||||
|
[string]$SvnPath |
||||
|
) |
||||
|
|
||||
|
return (svn info --show-item revision $SvnPath) |
||||
|
} |
||||
|
|
||||
|
function GetVersionData { |
||||
|
Param( |
||||
|
[string]$VersionUrl |
||||
|
) |
||||
|
|
||||
|
Invoke-WebRequest "$VersionUrl" | Select-Object -ExpandProperty Content | ConvertFrom-Json |
||||
|
} |
||||
|
|
||||
|
function GetBranchConfig { |
||||
|
Param( |
||||
|
[string]$BuildPath, |
||||
|
[string]$SourceBranch |
||||
|
) |
||||
|
|
||||
|
$ConfigData = (Get-Content "$BuildPath\config.json" | ConvertFrom-Json) |
||||
|
$ConfigBranchData = $ConfigData.branches.$SourceBranch |
||||
|
return $ConfigBranchData |
||||
|
} |
||||
|
|
||||
|
function GetTypeConfig { |
||||
|
Param( |
||||
|
[string]$BuildPath, |
||||
|
[string]$BuildType |
||||
|
) |
||||
|
|
||||
|
$ConfigData = (Get-Content "$BuildPath\config.json" | ConvertFrom-Json) |
||||
|
$ConfigTypeData = $ConfigData.types.$BuildType |
||||
|
return $ConfigTypeData |
||||
|
} |
||||
|
|
||||
|
function GetNodeConfig { |
||||
|
Param( |
||||
|
[string]$BuildPath, |
||||
|
[string]$NodeName |
||||
|
) |
||||
|
|
||||
|
$ConfigData = (Get-Content "$BuildPath\config.json" | ConvertFrom-Json) |
||||
|
if ([string]::IsNullOrEmpty($NodeName) -or |
||||
|
!$ConfigData.nodes.$NodeName) { |
||||
|
Write-Host "No config for $NodeName found; using default" |
||||
|
$NodeName = "default" |
||||
|
} |
||||
|
|
||||
|
$ConfigNodeData = $ConfigData.nodes.$NodeName |
||||
|
return $ConfigNodeData |
||||
|
} |
||||
|
|
||||
|
function GetBuildType { |
||||
|
Param( |
||||
|
[string]$BuildPath, |
||||
|
[string]$SourceBranch, |
||||
|
[string]$BuildType="Auto" |
||||
|
) |
||||
|
|
||||
|
if ($BuildType -eq "Auto") { |
||||
|
$BuildType = (GetBranchConfig "$BuildPath" "$SourceBranch").type |
||||
|
if (!$BuildType) { |
||||
|
Write-Host "ERROR: Config not found for branch '$SourceBranch'" |
||||
|
exit 1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $BuildType |
||||
|
} |
||||
|
|
||||
|
function OmitCodePackage { |
||||
|
Param( |
||||
|
[string]$UdkPath, |
||||
|
[string]$PackageName |
||||
|
) |
||||
|
|
||||
|
$EngineFile = "$UdkPath\UDKGame\Config\DefaultEngineUDK.ini" |
||||
|
$PackageRegex = "^\+ModEditPackages=${PackageName}`$" |
||||
|
(Get-Content $EngineFile) -replace "$PackageRegex", "" | Set-Content $EngineFile |
||||
|
} |
||||
|
|
||||
|
function OmitCodePackages { |
||||
|
Param( |
||||
|
[string]$UdkPath, |
||||
|
[string[]]$PackageNames |
||||
|
) |
||||
|
|
||||
|
foreach ($PackageName in $PackageNames) { |
||||
|
OmitCodePackage "$UdkPath" "$PackageName" |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function CleanupSVN { |
||||
|
Param( |
||||
|
[string]$UdkPath |
||||
|
) |
||||
|
|
||||
|
# Delete unversioned files created by previous runs (logs, generated INIs) |
||||
|
$ChangedFilesList = (svn status --no-ignore $UdkPath) |
||||
|
foreach ($ChangedFileEntry in $ChangedFilesList) { |
||||
|
$ChangedFileName = $ChangedFileEntry.Substring(1).Trim() |
||||
|
# Match unversioned (?) or ignored (I) files ending with: .ini, .log, .dmp |
||||
|
if ($ChangedFileEntry -match "^(\?|I).+\.(ini|log|dmp)$") { |
||||
|
Remove-Item -Path $ChangedFileName |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
# Delete CookedPC from previous runs |
||||
|
if ([System.IO.Directory]::Exists("$UdkPath\UDKGame\CookedPC\")) { |
||||
|
Write-Host "Deleting CookedPC..." |
||||
|
Remove-Item -Recurse -Force "$UdkPath\UDKGame\CookedPC\" |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function MakeChangelog { |
||||
|
Param( |
||||
|
[string]$UdkPath, |
||||
|
[int]$OldRevision, |
||||
|
[int]$NewRevision |
||||
|
) |
||||
|
|
||||
|
svn log -v -r ${OldRevision}:${NewRevision} "$UdkPath" | Out-File changelog.txt |
||||
|
} |
||||
|
|
||||
|
function BuildScripts { |
||||
|
Param( |
||||
|
[string]$UdkExePath |
||||
|
) |
||||
|
|
||||
|
& "$UdkExePath" make -full -buildmachine -stripsource -auto -unattended -nopause |
||||
|
} |
||||
|
|
||||
|
function BuildShaders { |
||||
|
Param( |
||||
|
[string]$UdkPath |
||||
|
) |
||||
|
|
||||
|
# Calculate paths |
||||
|
$MapsRootDir = "$UdkPath\UDKGame\Content\Maps" |
||||
|
$UdkExePath = "$UdkPath\Binaries\Win64\UDK.exe" |
||||
|
$RevisionFile = "$UdkPath\build\shaders_last_run.txt" |
||||
|
|
||||
|
# Build MapsDirs |
||||
|
$MapsDirs = New-Object System.Collections.Generic.List[System.String] |
||||
|
$MapsDirs += "$MapsRootDir\RenX" |
||||
|
$MapsDirs += "$MapsRootDir\TiberianSun" |
||||
|
|
||||
|
# Get last revision this script ran for |
||||
|
$LastRevision = 0 |
||||
|
if ([System.IO.File]::Exists($RevisionFile)) { |
||||
|
$LastRevision = Get-Content $RevisionFile |
||||
|
} |
||||
|
$CurrentRevision = (GetSvnRevision $UdkPath) |
||||
|
|
||||
|
# Get list of modified files |
||||
|
$Files = New-Object System.Collections.Generic.List[System.String] |
||||
|
foreach ($MapsDir in $MapsDirs) { |
||||
|
$ChangedFilesList = (svn diff "-r${LastRevision}:${CurrentRevision}" --summarize "$MapsDir") |
||||
|
foreach ($ChangedFileEntry in $ChangedFilesList) { |
||||
|
$ChangedFileName = $ChangedFileEntry.Substring(1).Trim() |
||||
|
if ([System.IO.File]::Exists($ChangedFileName)) { |
||||
|
$Files += $ChangedFileName |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
# Open each map to build shaders |
||||
|
foreach ($File in $Files) { |
||||
|
# Get package name from file |
||||
|
$PackageName = [System.IO.Path]::GetFileNameWithoutExtension($File) |
||||
|
|
||||
|
# Open each level with exec script to build shaders |
||||
|
# Note: not using 'server' for now, since it seems not to respect -EXEC, possibly because it's a "rendering" option |
||||
|
Write-Host "Building shaders for: $PackageName" |
||||
|
$Cmd = "server ${PackageName}?mutator=RenX_ExampleMutators.ShaderHelper?bIsLanMatch=true -auto -unattended -nopause" |
||||
|
Start-Process -Wait -FilePath "$UdkExePath" -ArgumentList "$Cmd" |
||||
|
} |
||||
|
|
||||
|
echo $CurrentRevision | Out-File $RevisionFile |
||||
|
} |
||||
|
|
||||
|
function CookGame { |
||||
|
Param( |
||||
|
[string]$UdkPath, |
||||
|
[string]$CookParams |
||||
|
) |
||||
|
$UdkExePath = "$UdkPath\Binaries\Win64\UDK.com" |
||||
|
ForceDesktopSession |
||||
|
|
||||
|
& "$UdkExePath" CookPackages $CookParams |
||||
|
$CookExitCode = $LASTEXITCODE |
||||
|
|
||||
|
# Check if cook failed (exit code != 0) |
||||
|
if ($CookExitCode -ne 0) { |
||||
|
Write-Host "ERROR: Cook failed with exit code $CookExitCode" |
||||
|
exit 1 |
||||
|
} |
||||
|
|
||||
|
# Check if cook succeeded |
||||
|
if (Get-ChildItem "$UdkPath\UDKGame\CookedPC\Process_*") { |
||||
|
Write-Host "ERROR: Cook failed to complete (Process paths are still present). Exiting..." |
||||
|
exit 1 |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function StageCookedPC { |
||||
|
Param( |
||||
|
[string]$UdkPath, |
||||
|
[string]$BuildType |
||||
|
) |
||||
|
|
||||
|
$CookedPCPath = "$UdkPath\UDKGame\CookedPC" |
||||
|
$TypedCookedPCPath = "$UdkPath\UDKGame\CookedPC_${BuildType}" |
||||
|
|
||||
|
if ([System.IO.Directory]::Exists($TypedCookedPCPath)) { |
||||
|
Copy-Item -Path $TypedCookedPCPath -Destination $CookedPCPath -Recurse |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function UnstageCookedPC { |
||||
|
Param( |
||||
|
[string]$UdkPath, |
||||
|
[string]$BuildType |
||||
|
) |
||||
|
|
||||
|
$CookedPCPath = "$UdkPath\UDKGame\CookedPC" |
||||
|
$TypedCookedPCPath = "$UdkPath\UDKGame\CookedPC_${BuildType}" |
||||
|
|
||||
|
if ([System.IO.Directory]::Exists($CookedPCPath)) { |
||||
|
if ([System.IO.Directory]::Exists($TypedCookedPCPath)) { |
||||
|
Remove-Item -Recurse -Force "$TypedCookedPCPath" |
||||
|
} |
||||
|
|
||||
|
Rename-Item -Path $CookedPCPath -NewName $TypedCookedPCPath |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function BuildUdk { |
||||
|
Param( |
||||
|
[string]$UdkPath, |
||||
|
[string]$BuildType |
||||
|
) |
||||
|
$UdkExePath = "$UdkPath\Binaries\Win64\UDK.com" |
||||
|
$BuildPath = "$UdkPath\build" |
||||
|
$TypeConfigData = (GetTypeConfig "$BuildPath" "$BuildType") |
||||
|
|
||||
|
# Omit private code packages where necessary |
||||
|
OmitCodePackages "$UdkPath" $TypeConfigData.excluded_code |
||||
|
|
||||
|
# Cleanup SVN data from previous runs |
||||
|
Write-Host "Cleaning up SVN from previous builds..." |
||||
|
CleanupSVN "$UdkPath" |
||||
|
|
||||
|
# Move in working CookedPC |
||||
|
Write-Host "Staging CookedPC for $BuildType build..." |
||||
|
StageCookedPC "$UdkPath" "$BuildType" |
||||
|
|
||||
|
# Compile scripts |
||||
|
Write-Host "Compiling scripts..." |
||||
|
BuildScripts "$UdkExePath" |
||||
|
|
||||
|
# Build shaders for all changed levels |
||||
|
Write-Host "Building shaders..." |
||||
|
BuildShaders "$UdkPath" |
||||
|
Write-Host "Shader build finished" |
||||
|
|
||||
|
# Cook packages |
||||
|
if ($TypeConfigData.cook) { |
||||
|
Write-Host "Cooking packages..." |
||||
|
$CookParams = (GetNodeConfig "$BuildPath" $Env:NODE_NAME).cook_params |
||||
|
CookGame "$UdkPath" "$CookParams" |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function GetIncludedFiles { |
||||
|
Param( |
||||
|
[string]$UdkPath, |
||||
|
[string]$BuildType |
||||
|
) |
||||
|
$BuildPath = "$UdkPath\build" |
||||
|
|
||||
|
# Read inclusion expressions |
||||
|
$IncludeExpressions = (Get-Content $BuildPath\expressions.include.txt) |
||||
|
if ([System.IO.File]::Exists("$BuildPath\expressions.include.$BuildType.txt")) { |
||||
|
$IncludeExpressions += (Get-Content "$BuildPath\expressions.include.$BuildType.txt") |
||||
|
} |
||||
|
|
||||
|
# Read map list into inclusion expressions |
||||
|
$IncludeLevels = (Get-Content $BuildPath\levels.include.txt) |
||||
|
if ([System.IO.File]::Exists("$BuildPath\levels.include.$BuildType.txt")) { |
||||
|
$IncludeLevels += (Get-Content "$BuildPath\levels.include.$BuildType.txt") |
||||
|
} |
||||
|
|
||||
|
foreach ($LevelName in $IncludeLevels) { |
||||
|
if ((![string]::IsNullOrWhiteSpace($LevelName)) -and # Ignore blank lines |
||||
|
(!$LevelName.StartsWith("#"))) { # Ignore comments/headers |
||||
|
$IncludeExpressions += "^PreviewVids\\$LevelName\..+$" |
||||
|
$IncludeExpressions += "^UDKGame\\Config\\$LevelName.ini$" |
||||
|
$IncludeExpressions += "^UDKGame\\Content\\Maps\\[A-Za-z]+\\$LevelName.udk$" |
||||
|
$IncludeExpressions += "^UDKGame\\Movies\\LoadingScreen_$LevelName.bik$" |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
# Checks if a file matches inclusion lists |
||||
|
function MatchesInclude { |
||||
|
param ( |
||||
|
[string]$FilePath |
||||
|
) |
||||
|
|
||||
|
# Iterate over all expressions and check if FilePath matches ANY of them |
||||
|
foreach ($Expression in $IncludeExpressions) { |
||||
|
if ((![string]::IsNullOrWhiteSpace($Expression)) -and # Ignore blank lines |
||||
|
(!$Expression.StartsWith("#")) -and # Ignore comments/headers |
||||
|
([System.IO.File]::Exists("$UdkPath\$FilePath")) -and # Ignore non-files |
||||
|
($FilePath -match $Expression)) { # Check if the path matches this expression |
||||
|
return $true |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $false |
||||
|
} |
||||
|
|
||||
|
# Compile list of files to copy from SVN |
||||
|
Write-Host "Scanning SVN for necessary files..." |
||||
|
$Files = (Get-ChildItem -Recurse $UdkPath) |
||||
|
$IncludedFiles = New-Object System.Collections.Generic.List[System.String] |
||||
|
foreach ($File in $Files) { |
||||
|
# Check if file matches inclusion list |
||||
|
$Filename = $File.FullName.Substring($UdkPath.Length + 1) |
||||
|
if (MatchesInclude $Filename) { |
||||
|
$IncludedFiles += $Filename |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
echo $IncludedFiles | Out-File included_files.txt |
||||
|
return $IncludedFiles |
||||
|
} |
||||
|
|
||||
|
function GenerateBuildData { |
||||
|
Param( |
||||
|
[string]$RootDir, |
||||
|
[string]$UdkPath, |
||||
|
[string]$BuildType, |
||||
|
[string]$PatchName, |
||||
|
[string]$VersionUrl |
||||
|
) |
||||
|
$CurrentRevision = (GetSvnRevision $UdkPath) |
||||
|
|
||||
|
Write-Host "Generating new build" |
||||
|
$NewBuildPath = "$RootDir\Build${CurrentRevision}" |
||||
|
$IncludedFiles = (GetIncludedFiles "$UdkPath" "$BuildType") |
||||
|
$RetargetData = (GetTypeConfig "$UdkPath\build" "$BuildType").retargets |
||||
|
|
||||
|
# Copy included files over to new build |
||||
|
Write-Host "Copying files from SVN..." |
||||
|
foreach ($Filename in $IncludedFiles) { |
||||
|
$SourceFilePath = "$UdkPath\$Filename" |
||||
|
$TargetFilePath = "$NewBuildPath\$Filename" |
||||
|
|
||||
|
# If it's from Content, copy it to CookedPC instead (i.e: Maps); note: retarget strings moved to config.json |
||||
|
foreach ($Retarget in $RetargetData) { |
||||
|
if ($Filename -match $Retarget.source) { |
||||
|
$TargetFilename = $Filename -replace $Retarget.source, $RetargetData.target |
||||
|
$TargetFilePath = "$NewBuildPath\$TargetFilename" |
||||
|
break |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
# Create parent directories |
||||
|
New-Item -ItemType File -Force "$TargetFilePath" | Out-Null |
||||
|
Remove-Item $TargetFilePath |
||||
|
|
||||
|
# Copy file |
||||
|
Write-Host "Copying $Filename..." |
||||
|
Copy-Item -Force "$SourceFilePath" "$TargetFilePath" |
||||
|
} |
||||
|
|
||||
|
# Update version in INI |
||||
|
Write-Host "Updating version file..." |
||||
|
$VersionFile = "$NewBuildPath\UDKGame\Config\DefaultRenegadeX.ini" |
||||
|
$VersionStringRegex = '^GameVersion=".+"$' |
||||
|
$VersionNumberRegex = '^GameVersionNumber=.+$' |
||||
|
$VersionUrlRegex = '^MasterVersionURL=.+$' |
||||
|
(Get-Content $VersionFile) -replace $VersionStringRegex, "GameVersion=`"${PatchName}`"" | Set-Content $VersionFile |
||||
|
(Get-Content $VersionFile) -replace $VersionNumberRegex, "GameVersionNumber=$CurrentRevision" | Set-Content $VersionFile |
||||
|
(Get-Content $VersionFile) -replace $VersionUrlRegex, "MasterVersionURL=$VersionUrl" | Set-Content $VersionFile |
||||
|
} |
||||
|
|
||||
|
function PrepRxPatch { |
||||
|
Param( |
||||
|
[string]$RxPatchPath, |
||||
|
[string]$RxPatchUrl |
||||
|
) |
||||
|
|
||||
|
# Checkout RXPatch if it doesn't exist |
||||
|
if (![System.IO.Directory]::Exists("$RxPatchPath")) { |
||||
|
Write-Host "Checkout RXPatch..." |
||||
|
svn checkout $RxPatchUrl |
||||
|
} |
||||
|
|
||||
|
# Enter RXPatch |
||||
|
svn update $RxPatchPath |
||||
|
} |
||||
|
|
||||
|
function PullGameBuild { |
||||
|
Param( |
||||
|
[string]$BuildUrl, |
||||
|
[string]$BuildPath, |
||||
|
[string]$RxPatchExe |
||||
|
) |
||||
|
$PatchWorkPath = "${BuildPath}_patch_tmp" |
||||
|
|
||||
|
# Prep paths |
||||
|
if (![System.IO.Directory]::Exists("$BuildPath")) { |
||||
|
New-Item -ItemType "Directory" $BuildPath | Out-Null |
||||
|
} |
||||
|
|
||||
|
# Pull old build |
||||
|
& "$RxPatchExe" apply_web $BuildUrl $BuildPath $PatchWorkPath |
||||
|
|
||||
|
# Cleanup PatchWorkPath |
||||
|
Remove-Item $PatchWorkPath -Recurse -Force |
||||
|
} |
||||
|
|
||||
|
function GeneratePatchData { |
||||
|
Param( |
||||
|
[string]$PatchDataPath, |
||||
|
[string]$OldBuildPath, |
||||
|
[string]$NewBuildPath, |
||||
|
[string]$RxPatchExe |
||||
|
) |
||||
|
|
||||
|
$ArgsFilePath = (New-TemporaryFile).FullName |
||||
|
|
||||
|
# Write args file |
||||
|
$ArgsJson = [ordered]@{ |
||||
|
OldPath = "$OldBuildPath" |
||||
|
NewPath = "$NewBuildPath" |
||||
|
PatchPath = "$PatchDataPath" |
||||
|
} |
||||
|
|
||||
|
echo $ArgsJson | ConvertTo-Json | Out-File $ArgsFilePath |
||||
|
|
||||
|
# Cleanup any old patch data |
||||
|
if ([System.IO.Directory]::Exists($PatchDataPath)) { |
||||
|
Remove-Item -Recurse -Force $PatchDataPath |
||||
|
} |
||||
|
|
||||
|
# Build new patch data |
||||
|
& "$RxPatchExe" create $ArgsFilePath |
||||
|
|
||||
|
# Cleanup args file |
||||
|
Remove-Item -Force $ArgsFilePath |
||||
|
} |
||||
|
|
||||
|
function PublishPatchData { |
||||
|
Param( |
||||
|
[string]$SSHKey, |
||||
|
[string]$SSHUsername, |
||||
|
[string]$Destination, |
||||
|
[string]$PatchDataPath |
||||
|
) |
||||
|
$CurrentUsername = [Environment]::UserName |
||||
|
|
||||
|
Write-Host "Setting permissions on SSH key..." |
||||
|
Icacls $SSHKey /c /t /Inheritance:d # Remove Inheritance |
||||
|
Icacls $SSHKey /c /t /Grant "${CurrentUsername}:F" # Set Ownership to Owner |
||||
|
Icacls $SSHKey /c /t /Remove "Authenticated Users" BUILTIN\Administrators BUILTIN Everyone System Users # Remove All Users, except for Owner |
||||
|
|
||||
|
Write-Host "Pushing data to VCS..." |
||||
|
scp -i "$SSHKey" -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL -r "$PatchDataPath" "$SSHUsername@$Destination" |
||||
|
|
||||
|
# TODO: Replace this with a build step in pipeline |
||||
|
Write-Host "Triggering sync for mirrors..." |
||||
|
ssh -i "$SSHKey" -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL "$SSHUsername@vcs.glitchware.com" "/home/renx/patches/updaterepos.sh" |
||||
|
|
||||
|
Write-Host "Patch data pushed to mirrors. Deleting local data..." |
||||
|
Remove-Item -Recurse -Force $PatchDataPath |
||||
|
} |
||||
|
|
||||
|
function MakePatchData { |
||||
|
Param( |
||||
|
[string]$RootDir, |
||||
|
[string]$UdkPath, |
||||
|
[string]$BuildType, |
||||
|
[string]$PatchName, |
||||
|
[string]$SourceBranch, |
||||
|
[switch]$DeleteBuild |
||||
|
) |
||||
|
$BuildPath = "$UdkPath\build" |
||||
|
$RxPatchPath = "$RootDir\RXPatch" |
||||
|
$RxPatchUrl = "svn://svn.renegade-x.com/svn/main/RXPatch" |
||||
|
$RxPatchExe = "$RxPatchPath\RXPatch.exe" |
||||
|
$CurrentRevision = (GetSvnRevision $UdkPath) |
||||
|
$NewBuildPath = "$RootDir\Build${CurrentRevision}" |
||||
|
$TypeConfig = GetTypeConfig "$BuildPath" "$BuildType" |
||||
|
$PatchPrefix = $TypeConfig.prefix |
||||
|
$ProductKey = $TypeConfig.product |
||||
|
$PatchDataName = "${PatchPrefix}${CurrentRevision}" |
||||
|
$PatchDataPath = "$RootDir\$PatchDataName" |
||||
|
$MirrorUrl = (GetNodeConfig "$BuildPath" $Env:NODE_NAME).pull_mirror |
||||
|
|
||||
|
# Get current version info |
||||
|
Write-Host "Fetching version info..." |
||||
|
$VersionUrl = "https://static.renegade-x.com/launcher_data/version/${SourceBranch}.json" |
||||
|
$VersionData = (GetVersionData "$VersionUrl") |
||||
|
$OldBuildNum = $VersionData.$ProductKey.version_number |
||||
|
$OldBuildPatchPath = $VersionData.$ProductKey.patch_path |
||||
|
$OldBuildUrl = "${MirrorUrl}${OldBuildPatchPath}" |
||||
|
$OldBuildPath = "$RootDir\Build${OldBuildNum}" |
||||
|
|
||||
|
# Compose changelog |
||||
|
MakeChangelog "$UdkPath" "$OldBuildNum" "$CurrentRevision" |
||||
|
|
||||
|
# Compose new build data |
||||
|
GenerateBuildData "$RootDir" "$UdkPath" "$BuildType" "$PatchName" "$VersionUrl" | Write-Host |
||||
|
UnstageCookedPC "$UdkPath" "$BuildType" |
||||
|
|
||||
|
# Prepare RXPatch for patching |
||||
|
PrepRxPatch "$RxPatchPath" "$RxPatchUrl" | Write-Host |
||||
|
|
||||
|
# Pull old patch data |
||||
|
Write-Host "Pulling previous build..." |
||||
|
PullGameBuild "$OldBuildUrl" "$OldBuildPath" "$RxPatchExe" | Write-Host |
||||
|
|
||||
|
# Generate patch data |
||||
|
Write-Host "Generating patch data" |
||||
|
GeneratePatchData "$PatchDataPath" "$OldBuildPath" "$NewBuildPath" "$RxPatchExe" | Write-Host |
||||
|
|
||||
|
# Cleanup build files |
||||
|
Remove-Item -Recurse -Force $OldBuildPath |
||||
|
if ($DeleteBuild) { |
||||
|
Remove-Item -Recurse -Force $NewBuildPath |
||||
|
} |
||||
|
|
||||
|
# Verify instructions.json is generated, and report failure if it's not present |
||||
|
if (![System.IO.File]::Exists("$PatchDataPath\instructions.json")) { |
||||
|
Write-Host "Patch data failed to generate" |
||||
|
Exit 1 |
||||
|
} |
||||
|
|
||||
|
Write-Host "Patch data generated successfully" |
||||
|
return $PatchDataName |
||||
|
} |
Binary file not shown.
@ -0,0 +1,72 @@ |
|||||
|
Param( |
||||
|
[string]$BuildType="Auto", |
||||
|
[string]$SourceBranch="release", |
||||
|
[string]$PatchName="Open Beta 5.1234", # TODO: make non-optional |
||||
|
[int]$TargetRevision=0, |
||||
|
[switch]$Jenkins |
||||
|
) |
||||
|
|
||||
|
# Constants |
||||
|
$UdkUrl = "svn://svn.renegade-x.com/svn/main/UDK_Uncooked" |
||||
|
$RootDir = (Get-Location).ProviderPath |
||||
|
$UdkPath = "$RootDir\UDK_Uncooked" |
||||
|
$BuildPath = "$UdkPath\build" |
||||
|
|
||||
|
### STAGE 1: Prepare Workspace |
||||
|
# Requires: UdkPath, UdkUrl, TargetRevision, RootDir, BuildPath |
||||
|
|
||||
|
function PrepSVN { |
||||
|
Param( |
||||
|
[string]$UdkPath, |
||||
|
[string]$UdkUrl, |
||||
|
[int]$TargetRevision |
||||
|
) |
||||
|
|
||||
|
if (![System.IO.Directory]::Exists("$UdkPath")) { |
||||
|
Write-Host "Checking out UDK_Uncooked..." |
||||
|
svn checkout $UdkUrl |
||||
|
} |
||||
|
|
||||
|
# Revert any local changes |
||||
|
svn revert --recursive $UdkPath |
||||
|
|
||||
|
# Update UDK to latest revision |
||||
|
if ($TargetRevision -eq 0) { |
||||
|
svn update $UdkPath |
||||
|
} |
||||
|
else { |
||||
|
svn update -r $TargetRevision $UdkPath |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
# Checkout/update SVN to target revision |
||||
|
PrepSVN "$UdkPath" "$UdkUrl" "$TargetRevision" |
||||
|
. "$BuildPath\scripts\common.ps1" |
||||
|
|
||||
|
# Prepare RootDir for build |
||||
|
PrepRootDir "$RootDir" |
||||
|
|
||||
|
### STAGE 2: Build |
||||
|
# Requires: BuildPath, SourceBranch, BuildType, UdkPath |
||||
|
|
||||
|
# Pull config data if type Auto |
||||
|
$BuildType = (GetBuildType "$BuildPath" "$SourceBranch" -BuildType "$BuildType") |
||||
|
|
||||
|
# Build UDK |
||||
|
BuildUdk "$UdkPath" "$BuildType" |
||||
|
|
||||
|
### STAGE 3: Make patch |
||||
|
# Requires: RootDir, UdkPath, BuildType, PatchName, SourceBranch |
||||
|
|
||||
|
# Make patch data |
||||
|
$PatchDataName = (MakePatchData "$RootDir" "$UdkPath" "$BuildType" "$PatchName" "$SourceBranch" -DeleteBuild) |
||||
|
echo "PatchDataName: $PatchDataName" |
||||
|
|
||||
|
### STAGE 4: Publish patch |
||||
|
# Requires: Env:SSHKey, Env:SSHUsername, RootDir, PatchDataName |
||||
|
|
||||
|
# Publish patch data |
||||
|
if ($Jenkins) { |
||||
|
PublishPatchData $Env:SSHKey $Env:SSHUsername "vcs.glitchware.com:/home/renx/patches/data/" "$RootDir\$PatchDataName" |
||||
|
echo "Build complete. Run the `"Set Game Version`" Jenkins plan to point the appropriate branch to $PatchDataName" |
||||
|
} |
Loading…
Reference in new issue