-
-
Save regner/448551d141a8457561e4a197692cdc56 to your computer and use it in GitHub Desktop.
{ | |
"Horde": { | |
"AuthMethod": "OpenIdConnect", | |
"OidcAuthority": "", | |
"OidcClientId": "", | |
"OidcClientSecret": "", | |
"OidcSigninRedirect": "", | |
"AdminClaimType": "http://schemas.microsoft.com/ws/2008/06/identity/claims/role", | |
"AdminClaimValue": "", | |
"OidcRequestedScopes": [ | |
"profile", | |
"email", | |
"openid" | |
], | |
"OidcClaimNameMapping": [ | |
"preferred_username", | |
"email", | |
"name" | |
], | |
"OidcClaimEmailMapping": [ | |
"email", | |
"upn" | |
], | |
"OidcClaimHordeUserMapping": [ | |
"preferred_username", | |
"email", | |
"upn" | |
], | |
"OidcClaimHordePerforceUserMapping": [], | |
"CorsEnabled": true, | |
"CorsOrigin": "", | |
"DashboardUrl": "", | |
"P4SwarmUrl": "", | |
"ConfigPath": "globals.json", | |
"DatabaseConnectionString": "", | |
"DatabaseName": "", | |
"HelpEmailAddress": "", | |
"HelpSlackChannel": "", | |
"HttpPort": 8080, | |
"Http2Port": 8081, | |
"JwtIssuer": "", | |
"JwtSecret": "", | |
"ArtifactStorage": { | |
"Type": "FileSystem", | |
"BaseDir": "artifacts" | |
}, | |
"LogStorage": { | |
"Type": "FileSystem", | |
"BaseDir": "logs" | |
}, | |
"CommitStorage": { | |
"Type": "FileSystem", | |
"BaseDir": "commits" | |
}, | |
"LogJsonToStdOut": true, | |
"RedisConnectionConfig": "", | |
"UpdateStreamsNotificationChannel": "", | |
"SlackToken": "", | |
"SlackSocketToken": "", | |
"SingleInstance": false, | |
"RunModes": [ | |
"Server", | |
"Worker" | |
] | |
}, | |
"Serilog": { | |
"MinimumLevel": { | |
"Default": "Information" | |
} | |
} | |
} |
<?xml version='1.0' ?> | |
<!-- | |
Why is this one giant script instead of a bunch of smaller scripts? | |
Mostly this comes down to BuildGraph and personal preference. As the language BuildGraph isn't | |
really much of a programming language there is no easy way to use an IDE and jump between | |
includes, find usages of variables, and just generally quickly search things. It was found to | |
be easier to have a single large file that a developer can quickly jump up and down in when | |
trying to understand what the BuildGraph script is doing. | |
Some standard practices within this BuildGraph script: | |
# Formatting | |
* Use editorconfig, there is an editor config file next to these scripts | |
* Indentation: 4 spaces, no tabs | |
* Void elements must always have trailing slash | |
* Good: <thing value="true" /> | |
* Bad: <thing value="true"> | |
* Attributes must use double quotes | |
* Good: <thing value="true" /> | |
* Bad: <thing value='true' /> | |
* No space before closing bracket | |
* Good: <thing value="true" /> | |
* Bad: <thing value='true' / > | |
* Good: <thing value="true"> | |
* Bad: <thing value="true" > | |
* No space around = when specifying element arguments | |
* Good: <thing value="true" /> | |
* Bad: <thing value = "true"/> | |
* There must be a space before the trailing slash of a void element | |
* Good: <thing value="true" /> | |
* Bad: <thing value="true"/> | |
* No trailing spaces at the end of a line | |
* Single line comments should have space before and after comment | |
* Note: Have used * instead of - in the example otherwise the whole document gets commented | |
* Good: <!** Comment **> | |
* Bad: <!**Comment**> | |
* Multiline comments should have the start and end on their own lines and the comments themselves should be indented from the opening/closing tags | |
* Note: Have used * instead of - in the example otherwise the whole document gets commented | |
* Good: | |
<!** | |
Line one | |
Line two and a bit or something | |
**> | |
* Bad: | |
<!** Line one | |
Line two and a bit or something **> | |
# General script structure | |
* Options/base configuration at the top | |
* One section per major "thing" | |
* Editor | |
* Compile / cook / package the game and server | |
* HLODs | |
* Package resaving | |
* Tests | |
* etc. | |
* Sections should start with a section header (see examples below) | |
* General section comments can go in the same comment as the section header (see editor and tools section) | |
* Sections should end with adding that sections nodes to the BuildProjectNodes variable and setting labels, in that order | |
* For a node to be executed, it must be added to the BuildProjectNodes property, which BuildProject requires | |
# Environment variables | |
* Declaring of environment variables to be used within the script will happen only at the very top of the file | |
# Options | |
* All user configurable options will be placed towards the top of the file | |
* By default the script should do nothing, the caller of the script will enable the things they want | |
* Options that need other options set should have their checks at the top near where the options are first declared | |
* Default value should come before restrict value when declaring an option | |
* The enabling of steps should be done in one of two ways: | |
* An excplicit enable option such as EnableCooking, EnablePackaging, EnableSomeTest | |
* Populating a list used by a ForEach such as EditorAutomationTests | |
* In these cases steps should not have an excplicit enable option, as the list should default to empty | |
* This also means the adding of nodes to the BuildProjectNodes property should happen in the ForEach loop | |
# Targeting | |
* All calls to this script will target BuildProject | |
* As noted in Options above, by default nothing should happen when simply calling the BuildProject | |
# Node naming | |
* Node names tend to be reused a number of times by being referenced in the node, reiquirements, labels, and more | |
* Node names should always be declared as properties | |
* They should always be declared at the start of the section they are first used in | |
# Agent naming | |
* If an agent only has one node, the agent name should be the node name variable | |
* If it has multiple nodes, make it something that makes sense | |
# Labels and UGS badges | |
* We have two concepts for UGS badges: | |
* Per-step badges | |
* Overall status badges | |
* Per-step badges are put on all labels that we want to show up in UGS in the CIS column | |
* Any time we have a label that has UGS badges, we must duplicate it and also have the same label without badges | |
* Overall status badges are used to show overall job status as service badges in UGS | |
* There is only one overall job status badge, which is built at the very end of the script | |
* As a general rule of thumb labels and badges should follow the format of "process platform game/server" | |
* In the case of labels the process becomes the category for non-other things | |
* Examples: | |
* Category: Cook | |
* Name: Win64 Game | |
* UGS badge: Cook Win64 Game | |
# Note on node names with content paths | |
Nodes cannot contain slashes. Node names also must be unique. As an example, if you're attempting to generate a list | |
of nodes with one node per-map, you wont be able to use the map map (/Game/Maps/MapName) as part of the node name. | |
You could potentially split on the / and use just the last element. However there is nothing preventing users from | |
having multiple maps with the same name, just a different path. So we actually need the full path name. | |
In this case the solution we have come up with is to replace / with -. We originally wanted ~, but Horde just renders | |
those as - anyways. | |
--> | |
<BuildGraph xmlns="http://www.epicgames.com/BuildGraph" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.epicgames.com/BuildGraph ../Schema.xsd"> | |
<EnvVar Name="UE_HORDE_JOBID" /> | |
<EnvVar Name="COMPUTERNAME" /> | |
<EnvVar Name="uebp_PORT" /> | |
<EnvVar Name="uebp_USER" /> | |
<EnvVar Name="uebp_CLIENT" /> | |
<Property Name="HordeURL" Value="https://horde.example.net" /> | |
<!-- Project Options --> | |
<Option Name="ProjectName" DefaultValue="None" Restrict=".+" Description="Name of Project" /> | |
<Option Name="ProjectPath" DefaultValue="$(ProjectName)" Restrict=".+" Description="Path to the folder that contains your project" /> | |
<Option Name="UGSProject" DefaultValue="$(ProjectName)" Description="Path to the project folder in UGS" /> | |
<!-- Validate that the project exists --> | |
<Error Message="ProjectName must be specified" If="'$(ProjectName)' == 'None' or '$(ProjectPath)' == 'None'" /> | |
<Property Name="UProject" Value="$(ProjectPath)\$(ProjectName).uproject" /> | |
<Error Message="Project file $(UProject) does not exist" If="!Exists('$(UProject)')" /> | |
<!-- Game platforms to build and cook --> | |
<Option Name="BuildPS5Client" DefaultValue="false" Description="Build PS5 client" /> | |
<Option Name="BuildWin64Client" DefaultValue="false" Description="Build Win64 client" /> | |
<Option Name="BuildXSXClient" DefaultValue="false" Description="Build XSX client" /> | |
<Property Name="GamePlatforms" Value="" /> | |
<Property Name="GamePlatforms" Value="$(GamePlatforms)PS5+" If="$(BuildPS5Client)" /> | |
<Property Name="GamePlatforms" Value="$(GamePlatforms)Win64+" If="$(BuildWin64Client)" /> | |
<Property Name="GamePlatforms" Value="$(GamePlatforms)XSX+" If="$(BuildXSXClient)" /> | |
<!-- Server platforms to build and cook --> | |
<Option Name="BuildWin64Server" DefaultValue="false" Description="Build Win64 dedicated server" /> | |
<Option Name="BuildLinuxServer" DefaultValue="false" Description="Build Linux dedicated server" /> | |
<Property Name="ServerPlatforms" Value="" /> | |
<Property Name="ServerPlatforms" Value="$(ServerPlatforms)Win64+" If="$(BuildWin64Server)" /> | |
<Property Name="ServerPlatforms" Value="$(ServerPlatforms)Linux+" If="$(BuildLinuxServer)" /> | |
<!-- Combined platforms, users of this property must understand the addition of Server --> | |
<Property Name="CombinedPlatforms" Value="" /> | |
<Property Name="CombinedPlatforms" Value="$(GamePlatforms)" If="'$(GamePlatforms)' != ''" /> | |
<ForEach Name="Platform" Values="$(ServerPlatforms)" Separator="+"> | |
<Property Name="CombinedPlatforms" Value="$(CombinedPlatforms)$(Platform)Server+" /> | |
</ForEach> | |
<!-- Build configuration options --> | |
<Option Name="BuildDebugConfiguration" DefaultValue="false" Description="Build Debug configurations" /> | |
<Option Name="BuildDevelopmentConfiguration" DefaultValue="false" Description="Build Development configurations" /> | |
<Option Name="BuildShippingConfiguration" DefaultValue="false" Description="Build Shipping configurations" /> | |
<Option Name="BuildTestConfiguration" DefaultValue="false" Description="Build Test configurations" /> | |
<Property Name="BuildConfigurations" Value="" /> | |
<Property Name="BuildConfigurations" Value="$(BuildConfigurations)Debug+" If="$(BuildDebugConfiguration)" /> | |
<Property Name="BuildConfigurations" Value="$(BuildConfigurations)Development+" If="$(BuildDevelopmentConfiguration)" /> | |
<Property Name="BuildConfigurations" Value="$(BuildConfigurations)Shipping+" If="$(BuildShippingConfiguration)" /> | |
<Property Name="BuildConfigurations" Value="$(BuildConfigurations)Test+" If="$(BuildTestConfiguration)" /> | |
<!-- Extra arguments --> | |
<Property Name="CommonCompileArguments" Value="" /> | |
<Option Name="ExtraToolCompileArguments" DefaultValue="" Restrict="" Description="Extra arguments to use when building the tools" /> | |
<Option Name="ExtraEditorCompileArguments" DefaultValue="" Restrict="" Description="Extra arguments to use when building the editor" /> | |
<Option Name="ExtraProjectCompileArguments" DefaultValue="" Restrict="" Description="Extra arguments to use when building client and server" /> | |
<Option Name="WindowsCompilerVersion" DefaultValue="2019" Description="Version of the compiler toolchain to use on Windows platform" /> | |
<Property Name="CommonCompileArguments" Value="$(CommonCompileArguments) -$(WindowsCompilerVersion)" /> | |
<Option Name="EnableWarningsAsErrorsCompile" DefaultValue="false" Restrict="true|false" Description="Enable escalating warnings to errors when compiling" /> | |
<Property Name="CommonCompileArguments" Value="$(CommonCompileArguments) -WarningsAsErrors" If="$(EnableWarningsAsErrorsCompile)" /> | |
<Option Name="EnableStrictCompile" DefaultValue="false" Restrict="true|false" Description="Enable strict standard conformance mode when compiling" /> | |
<Property Name="CommonCompileArguments" Value="$(CommonCompileArguments) -Strict" If="$(EnableStrictCompile)" /> | |
<Option Name="EnableNonUnityCompile" DefaultValue="false" Restrict="true|false" Description="Disable unity for compiles, forces build to run in full workspace" /> | |
<Property Name="ExtraToolCompileArguments" Value="$(ExtraToolCompileArguments) -DisableUnity" If="$(EnableNonUnityCompile)" /> | |
<Property Name="ExtraEditorCompileArguments" Value="$(ExtraEditorCompileArguments) -NoPCH -NoSharedPCH -DisableUnity -NoLink" If="$(EnableNonUnityCompile)" /> | |
<Property Name="ExtraProjectCompileArguments" Value="$(ExtraProjectCompileArguments) -NoPCH -NoSharedPCH -DisableUnity -NoLink" If="$(EnableNonUnityCompile)" /> | |
<Option Name ="EnableStaticAnalyzer" DefaultValue ="false" Restrict="true|false" Description="Enable static code analysis, be advised this disables linking so will not produce binaries" /> | |
<Property Name="ExtraEditorCompileArguments" Value="$(ExtraEditorCompileArguments) -StaticAnalyzer=Default" If="$(EnableStaticAnalyzer)" /> | |
<Property Name="ExtraProjectCompileArguments" Value="$(ExtraProjectCompileArguments) -StaticAnalyzer=Default" If="$(EnableStaticAnalyzer)" /> | |
<Property Name="ExtraToolCompileArguments" Value="$(ExtraToolCompileArguments) $(CommonCompileArguments)" /> | |
<Property Name="ExtraEditorCompileArguments" Value="$(ExtraEditorCompileArguments) $(CommonCompileArguments)" /> | |
<Property Name="ExtraProjectCompileArguments" Value="$(ExtraProjectCompileArguments) $(CommonCompileArguments)" /> | |
<!-- Cooking and packaging enable/disable options --> | |
<Option Name="BuildEditor" DefaultValue="false" Restrict="true|false" Description="Should we build the editor" /> | |
<Option Name="EnableCooking" DefaultValue="false" Restrict="true|false" Description="Should we enable cooking steps" /> | |
<Option Name="EnablePackaging" DefaultValue="false" Restrict="true|false" Description="Should we enable packaging steps" /> | |
<!-- For now all hosts are Win64, in the future we may need to add support for Mac if building iOS --> | |
<Property Name="HostAgentType" Value="Win64" /> | |
<!-- Agent options --> | |
<Option Name="UseIncrementalAgents" DefaultValue="false" Restrict="true|false" Description="Use incremental agents for building" /> | |
<Option Name="AgentPrefixCompile" DefaultValue="Compile" Description="The prefix to use when definning agents that use compile type nodes." /> | |
<Option Name="AgentPrefixCook" DefaultValue="Cook" Description="The prefix to use when definning agents that use cook type nodes." /> | |
<Option Name="AgentPrefixTest" DefaultValue="Test" Description="The prefix to use when definning agents that run tests." /> | |
<Option Name="AgentOverride" DefaultValue="" Description="If set, other logic is ignored and this agent type is used for all non-test work." /> | |
<!-- Set properties for a common set of agent types known to exist in Horde. All jobs will use one of these agent types --> | |
<Property Name="CompileAgentType" Value="$(AgentPrefixCompile)$(HostAgentType)" /> | |
<Property Name="CompileAgentType" Value="Incremental$(CompileAgentType)" If="$(UseIncrementalAgents) and !$(EnableNonUnityCompile)" /> | |
<Property Name="CompileAgentType" Value="$(AgentOverride)" If="'$(AgentOverride)' != ''" /> | |
<Property Name="CookAgentType" Value="$(AgentPrefixCook)$(HostAgentType)" /> | |
<Property Name="CookAgentType" Value="Incremental$(CookAgentType)" If="$(UseIncrementalAgents)" /> | |
<Property Name="CookAgentType" Value="$(AgentOverride)" If="'$(AgentOverride)' != ''" /> | |
<!-- Test agents don't have an incremental version, they are expected to pull builds, not create them --> | |
<Property Name="TestAgentType" Value="$(AgentPrefixTest)$(HostAgentType)" /> | |
<Property Name="TestAgentType" Value="$(AgentOverride)" If="'$(AgentOverride)' != ''" /> | |
<!-- Build name options --> | |
<Option Name="PreflightChange" DefaultValue="" Description="Preflight CL number if preflight, empty otherwise" /> | |
<Option Name="SetPreflightFlag" DefaultValue="true" Description="Whether to set the IsPreflight flag to true for preflights. Use with caution: this will cause things like build versions to be set to their non-preflight form." /> | |
<Property Name="IsPreflight" Value="false" /> | |
<Property Name="IsPreflight" Value="true" If="'$(PreflightChange)' != '' And $(SetPreflightFlag)" /> | |
<Property Name="PreflightSuffix" Value="" /> | |
<Property Name="PreflightSuffix" Value="-PF-$(PreflightChange)" If="$(IsPreflight)" /> | |
<Property Name="CL-String" Value="CL-$(Change)-$(UE_HORDE_JOBID)" /> | |
<Property Name="BuildName" Value="$(ProjectName)-$(CL-String)$(PreflightSuffix)" /> | |
<!-- UGS options --> | |
<Option Name="SubmitUGSBinaries" DefaultValue="false" Restrict="true|false" Description="Should we create and submit a UGS binaries archive" /> | |
<Option Name="UGSBinariesStream" DefaultValue="None" Description="The stream in which to put the UGS binaries archive" /> | |
<Option Name="UGSBadgesPerStep" DefaultValue="false" Restrict="true|false" Description="Whether to use specific badges per compile/cook step" /> | |
<Option Name="UGSBadgesOverall" DefaultValue="false" Restrict="true|false" Description="Whether to use a single UGS badge to represent the whole job" /> | |
<Option Name="UGSBadgesOverallName" DefaultValue="None" Description="Name of the UGS badge to use for overall status" /> | |
<Error Message="SubmitUGSBinaries is enabled but UGSBinariesStream is not set" If="$(SubmitUGSBinaries) and '$(UGSBinariesStream)' == 'None'" /> | |
<Error Message="UGSBadgesOverall is enabled but UGSBadgesOverallName is not set" If="$(UGSBadgesOverall) and '$(UGSBadgesOverallName)' == 'None'" /> | |
<!-- DDC Fill options --> | |
<Option Name="FillDDC" DefaultValue="false" Restrict="true|false" Description="Fill the projects DDC" /> | |
<!-- Common SCC options --> | |
<Property Name="SCC_None" Value="-SCCProvider=None" /> | |
<!-- | |
We only ever currently apply this property to builds run under a build machine, if that changes then | |
this will need to be split into multiple parts, and only add the uebp stuff if build machine. | |
--> | |
<Property Name="SCC_P4" Value="-SCCProvider=Perforce -P4Port=$(uebp_PORT) -P4User=$(uebp_USER) -P4Client=$(uebp_CLIENT)" /> | |
<!-- World Partition Map Names --> | |
<Option Name="HLODMapNames" DefaultValue="" Description="List of maps to build HLODs for, + deliminated" /> | |
<Option Name="NavMeshMapNames" DefaultValue="" Description="The map(s) for which NavMesh will be generated, + deliminated" /> | |
<!-- Resave packages options --> | |
<Option Name="ResaveDirtyPackages" DefaultValue="false" Restrict="true|false" Description="Run ResavePackages for dirty packages only" /> | |
<Option Name="ResaveRedirectors" DefaultValue="false" Restrict="true|false" Description="Run ResavePackages for fixing redirectors" /> | |
<Option Name="MaxPackagesToResave" DefaultValue="500" Description="Maximum number of packages to save in a single run" /> | |
<!-- Automation Test options --> | |
<Option Name="EnableEditorBootTest" DefaultValue="false" Restrict="true|false" Description="Enable the editor boot test" /> | |
<!-- | |
These options are for controlling which automation tests get run in the editor. The goal here is to | |
allow as much flexability and control as possible for developers, whilest not making things overly complicated. | |
The idea is that projects can set EditorAutomationTestsPreflight, EditorAutomationTestsCI, and | |
EditorAutomationTestsNightly in their project configuration XML file. That gives projects direct control | |
over what tests get run in different builds without having to request the build team manage it. | |
It also alows developers to specify the exact tests they want to run by setting EditorAutomationTests directly | |
when running BuildGraph. | |
For most users this will be managed via Horde, where build templates will set enable a specific set of tests. | |
So the flow looks something like this: | |
* Development teams request automated tests be enabled on their project | |
* Build team updates Horde configurations to enable automation tests | |
* For Pre-flight builds, Horde will enable the EditorAutomationTestsPreflight set of tests | |
* For CI builds, Horde will enable the EditorAutomationTestsCI set of tests | |
* For Nightly builds, Horde will enable the EditorAutomationTestsNightly set of tests | |
* Development teams can then, at any time, manage what tests are getting run for each of those jobs | |
* They can manage groups in Project/Config/DefaultEngine.ini | |
* They can manage disabled tests in Project/Config/DefaultEngine.ini | |
* They can manage EditorAutomationTests* in Project/Build/Graph/Project-Config.xml | |
Of note: | |
* Tests seperated with + will run in sequence on the same agent | |
* Tests seperated with ; will run in parallel on multiple agents | |
* The two methods can be combined | |
* This would be valid: Group:QuickTestsOne+Group:QuickTestsTwo;Group:LongTests | |
--> | |
<Option Name="EditorAutomationTests" DefaultValue="" Description="List of editor automation tests to be run" /> | |
<Option Name="EditorAutomationTestsPreflight" DefaultValue="" Description="List of editor tests to run when editor Preflight tests enabled" /> | |
<Option Name="EditorAutomationTestsCI" DefaultValue="" Description="List of editor tests to run when editor CI tests enabled" /> | |
<Option Name="EditorAutomationTestsNightly" DefaultValue="" Description="List of editor tests to run when editor Nightly tests enabled" /> | |
<Option Name="EditorAutomationTestsPreflightEnable" DefaultValue="false" Restrict="true|false" Description="Should the editor Preflight tests be run" /> | |
<Option Name="EditorAutomationTestsCIEnable" DefaultValue="false" Restrict="true|false" Description="Should the editor CI tests be run" /> | |
<Option Name="EditorAutomationTestsNightlyEnable" DefaultValue="false" Restrict="true|false" Description="Should the editor Nightly tests be run" /> | |
<Property Name="EditorAutomationTests" Value="$(EditorAutomationTests);$(EditorAutomationTestsPreflight)" If="$(EditorAutomationTestsPreflightEnable)" /> | |
<Property Name="EditorAutomationTests" Value="$(EditorAutomationTests);$(EditorAutomationTestsCI)" If="$(EditorAutomationTestsCIEnable)" /> | |
<Property Name="EditorAutomationTests" Value="$(EditorAutomationTests);$(EditorAutomationTestsNightly)" If="$(EditorAutomationTestsNightlyEnable)" /> | |
<!-- Other tests --> | |
<Option Name="TestCompileAllBlueprints" DefaultValue="false" Restrict="true|false" Description="Test compiling all blueprints with the editor" /> | |
<!-- Path related options --> | |
<Property Name="ProjectOutputDirectory" Value="$(ProjectName)\Saved\StagedBuilds" /> | |
<Property Name="UGSArchiveDirectory" Value="$(ProjectName)\Saved\ArchiveForUGS" /> | |
<Property Name="UGSArchiveStagingDirectory" Value="$(UGSArchiveDirectory)\Staging" /> | |
<Property Name="UGSArchivePerforceDirectory" Value="$(UGSArchiveDirectory)\Perforce" /> | |
<Property Name="UGSArchiveFile" Value="$(UGSArchivePerforceDirectory)\$(EscapedBranch)-editor.zip" /> | |
<Option Name="NetworkRootDirectory" DefaultValue="" Description="The base folder in which builds will be stored on the network" /> | |
<Option Name="SaveNetworkBuild" DefaultValue="false" Restrict="true|false" Description="Should the build results be stored in the Saved folder and retained rather than the Scratch folder" /> | |
<Error Message="NetworkRootDirectory must be specified" If="'$(NetworkRootDirectory)' == ''" /> | |
<Error Message="$(NetworkRootDirectory) does not exist" If="!Exists('$(NetworkRootDirectory)')" /> | |
<Property Name="NetworkOutputDirectory" Value="" /> | |
<Property Name="NetworkOutputDirectory" Value="$(NetworkRootDirectory)\Builds\Scratch" If="!$(SaveNetworkBuild)" /> | |
<Property Name="NetworkOutputDirectory" Value="$(NetworkRootDirectory)\Builds\Saved" If="$(SaveNetworkBuild)" /> | |
<Property Name="NetworkOutputDirectory" Value="$(NetworkOutputDirectory)\$(EscapedBranch)\$(BuildName)" If="'$(NetworkOutputDirectory)' != ''" /> | |
<Property Name="ScratchBuildsPath" Value="$(NetworkRootDirectory)\Builds\Scratch" /> | |
<Property Name="SavedBuildsPath" Value="$(NetworkRootDirectory)\Builds\Saved" /> | |
<Property Name="HordeIntermediatePath" Value="$(NetworkRootDirectory)\Intermediate" /> | |
<Property Name="AutomationReportOutputDirectory" Value="" /> | |
<Property Name="AutomationReportOutputDirectory" Value="$(NetworkRootDirectory)\AutomationReports" If="$(IsBuildMachine)" /> | |
<Property Name="AutomationReportOutputDirectory" Value="$(AutomationReportOutputDirectory)\$(EscapedBranch)\$(CL-String)" If="'$(AutomationReportOutputDirectory)' != ''" /> | |
<Property Name="UploadSymbols" Value="false" /> | |
<Property Name="UploadSymbols" Value="true" If="$(SubmitUGSBinaries)" /> | |
<Option Name="ProjectSymbolServerPath" DefaultValue="" Description="Path to the symbol server storage" /> | |
<Error Message="ProjectSymbolServerPath must be specified to upload symbols" If="$(UploadSymbols) and '$(ProjectSymbolServerPath)' == ''" /> | |
<Property Name="ProjectSymbolServerPath" Value="$(ProjectSymbolServerPath)\$(EscapedBranch)" /> | |
<!-- Cleanup options --> | |
<Option Name="ScratchBuildsPurge" DefaultValue="false" Description="Should the NetworkRootDirectory\Builds\Scratch folder be purged of old content" /> | |
<Option Name="ScratchBuildsMaxAge" DefaultValue="1" Description="Maximum age of files, in days, to keep of temp builds when purging is enabled" /> | |
<Option Name="SavedBuildsPurge" DefaultValue="false" Description="Should the NetworkRootDirectory\Builds\Saved folder be purged of old content" /> | |
<Option Name="SavedBuildsMaxAge" DefaultValue="7" Description="Maximum age of files, in days, to keep of temp builds when purging is enabled" /> | |
<Option Name="IntermediateBuildsPurge" DefaultValue="false" Description="Should the NetworkRootDirectory\Intermediate folder be purged of old content" /> | |
<Option Name="IntermediateBuildsMaxAge" DefaultValue="1" Description="Maximum age of files, in days, to keep of intermediate builds when purging is enabled" /> | |
<Option Name="SymbolDaysKeep" DefaultValue="30" Description="Number of days worth of symbols to keep" /> | |
<!-- This is the main property to add nodes to for the final aggregate --> | |
<Property Name="BuildProjectNodes" Value="" /> | |
<!-- | |
########################################################## | |
# Editor and tools | |
########################################################## | |
We only ever build the Editor for Win64, not going to complicate this by adding support for other | |
platforms. If we ever get to the point we want to for some reason, we can add it then. | |
--> | |
<Property Name="VersionNodeName" Value="Set binary version" /> | |
<Property Name="ToolsNodeName" Value="Compile Tools" /> | |
<Property Name="EditorNodeName" Value="Compile Editor" /> | |
<Agent Name="Build Editor and tools" Type="$(CompileAgentType)"> | |
<Node Name="$(VersionNodeName)"> | |
<SetVersion Change="$(Change)" CompatibleChange="$(CodeChange)" Branch="$(EscapedBranch)" Licensee="true" If="$(IsBuildMachine)" /> | |
</Node> | |
<Node Name="$(ToolsNodeName)" Requires="$(VersionNodeName)" Produces="#ToolBinaries"> | |
<Compile Target="BootstrapPackagedGame" Platform="Win64" Configuration="Shipping" Arguments="$(ExtraToolCompileArguments)" Tag="#ToolBinaries" /> | |
<Compile Target="CrashReportClient" Platform="Win64" Configuration="Shipping" Arguments="$(ExtraToolCompileArguments)" Tag="#ToolBinaries" /> | |
<Compile Target="CrashReportClientEditor" Platform="Win64" Configuration="Shipping" Arguments="$(ExtraToolCompileArguments)" Tag="#ToolBinaries" /> | |
<Compile Target="ShaderCompileWorker" Platform="Win64" Configuration="Development" Arguments="$(ExtraToolCompileArguments)" Tag="#ToolBinaries" /> | |
<Compile Target="UnrealHeaderTool" Platform="Win64" Configuration="Development" Arguments="$(ExtraToolCompileArguments)" Tag="#ToolBinaries" /> | |
<Compile Target="UnrealPak" Platform="Win64" Configuration="Development" Arguments="$(ExtraToolCompileArguments)" Tag="#ToolBinaries" /> | |
</Node> | |
<Node Name="$(EditorNodeName)" Requires="$(ToolsNodeName)" Produces="#EditorBinaries"> | |
<Compile Target="$(ProjectName)Editor" Platform="Win64" Configuration="Development" Arguments="$(ExtraEditorCompileArguments)" Tag="#EditorBinaries" /> | |
</Node> | |
</Agent> | |
<!--Add these nodes to our dependency list --> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(EditorNodeName);" If="$(BuildEditor)" /> | |
<!-- Create Labels --> | |
<Label Category="Compile" Name="Editor" Requires="$(EditorNodeName)" If="!$(UGSBadgesPerStep)" /> | |
<Label Category="Compile" Name="Editor" Requires="$(EditorNodeName)" UgsBadge="Compile Editor" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" /> | |
<!-- | |
########################################################## | |
# Compile / cook / package the game | |
########################################################## | |
Tried really hard to get the game and server sections to be the same | |
section, but was unsucessful. There are just to many differences, however | |
small they are, for it to make sense. | |
The main differences that caused problems (if someone is able to fix it): | |
* Target changing between Project and ProjectServer | |
* Wanting to package client and server separetly | |
* Because we are doing them separetly, the BCRArgs need to vary | |
Any changes done to this section should be duplicated in the server section | |
below. | |
--> | |
<ForEach Name="Platform" Values="$(GamePlatforms)" Separator="+"> | |
<!-- | |
########################################################## | |
# Compile game | |
########################################################## | |
Testing showed that there was no advantage to splitting the compiling of different | |
configurations between different machines. It might make a difference to non-unity | |
and full compiles, but the added time of copying files around for each agent | |
outweight the time it actually took to compile the different configurations. | |
--> | |
<Property Name="CompileNodeName" Value="Compile $(Platform) Game" /> | |
<Property Name="UploadSymbolsNodeName" Value="Upload Symbols $(Platform) Game" /> | |
<Agent Name="$(CompileNodeName)" Type="$(CompileAgentType)"> | |
<Node Name="$(CompileNodeName)" Requires="$(ToolsNodeName)" Produces="#$(CompileNodeName) Binaries" RunEarly="true"> | |
<ForEach Name="Configuration" Values="$(BuildConfigurations)" Separator="+"> | |
<Compile Target="$(ProjectName)" Platform="$(Platform)" Configuration="$(Configuration)" Arguments="-BuildVersion="$(BuildName)" $(ExtraProjectCompileArguments)" /> | |
</ForEach> | |
</Node> | |
<Node Name="$(UploadSymbolsNodeName)" Requires="$(CompileNodeName)"> | |
<SymStore Platform="$(Platform)" Files="#$(CompileNodeName)" StoreDir="$(ProjectSymbolServerPath)\$(Platform)" Product="$(ProjectName)" BuildVersion="$(BuildName)" /> | |
</Node> | |
</Agent> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(CompileNodeName)" /> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(UploadSymbolsNodeName)" If="$(UploadSymbols) and '$(Platform)' != 'Linux'" /> | |
<Label Category="Compile" Name="$(Platform) Game" Requires="$(CompileNodeName)" Exclude="$(ToolsNodeName)" If="!$(UGSBadgesPerStep)" /> | |
<Label Category="Compile" Name="$(Platform) Game" Requires="$(CompileNodeName)" Exclude="$(ToolsNodeName)" UgsBadge="Compile $(Platform) Game" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" /> | |
<!-- | |
########################################################## | |
# Cook, stage, and package the client | |
########################################################## | |
This is all done on a single node to reduce the amount of stuff copied around | |
the network. The packaging also tends to work well on the type of agent used | |
for cooking. | |
Cook being separate also means it can start once the editor is done, but before | |
the game is done being compiled. | |
The staging happens within the same node, but doesn't have RunEarly, so has to wait | |
for compile and cook. | |
--> | |
<Property Name="CookNodeName" Value="Cook $(Platform) game" /> | |
<Property Name="StageNodeName" Value="Stage $(Platform) game" /> | |
<Property Name="CopyStagedNodeName" Value="Copy Staged $(Platform) game" /> | |
<Property Name="PackageNodeName" Value="Package $(Platform) game" /> | |
<Property Name="CopyPackagedNodeName" Value="Copy Packaged $(Platform) game" /> | |
<Property Name="CookPlatform" Value="$(Platform)" /> | |
<Property Name="CookPlatform" Value="Windows" If="'$(Platform)' == 'Win64'" /> | |
<Property Name="BCRArgs" Value="-Project=$(UProject) -Platform=$(Platform) -Configuration=$(BuildConfigurations) -NoCodeSign" /> | |
<Agent Name="Cook, package, and stage $(Platform) game" Type="$(CookAgentType)"> | |
<Node Name="$(CookNodeName)" Requires="$(EditorNodeName)" Produces="#$(CookNodeName) Complete" RunEarly="true"> | |
<Cook Project="$(UProject)" Platform="$(CookPlatform)" /> | |
</Node> | |
<!-- Stage --> | |
<Node Name="$(StageNodeName)" Requires="$(CompileNodeName);#$(CompileNodeName) Binaries;#$(CookNodeName) Complete"> | |
<Command Name="BuildCookRun" Arguments="$(BCRArgs) -SkipBuild -SkipCook -Stage -Pak" /> | |
<!-- By request of QA, they would like a file at the root with the relevant CL in it --> | |
<WriteTextFile | |
File="$(ProjectOutputDirectory)/$(CookPlatform)/cl.txt" | |
Text="$(Change)" | |
/> | |
</Node> | |
<!-- Publish (Staged) --> | |
<Node Name="$(CopyStagedNodeName)" Requires="$(StageNodeName)"> | |
<Copy Files="..." From="$(ProjectOutputDirectory)/$(CookPlatform)" To="$(NetworkOutputDirectory)\$(CookPlatform)\Staged" /> | |
</Node> | |
<!-- Package --> | |
<Node Name="$(PackageNodeName)" Requires="$(CopyStagedNodeName)"> | |
<Command Name="BuildCookRun" Arguments="$(BCRArgs) -SkipBuild -SkipCook -SkipStage -SkipPak -Package" /> | |
</Node> | |
<!-- Publish (Packages) --> | |
<Node Name="$(CopyPackagedNodeName)" Requires="$(PackageNodeName)"> | |
<Property Name="ArchiveDirectory" Value=""$(NetworkOutputDirectory)\$(CookPlatform)\Packages"" /> | |
<Command Name="BuildCookRun" Arguments="$(BCRArgs) -SkipBuild -SkipCook -SkipStage -SkipPak -SkipPackage -Archive -ArchiveDirectory=$(ArchiveDirectory)" /> | |
</Node> | |
</Agent> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(CookNodeName)" If="$(EnableCooking)" /> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(CopyPackagedNodeName)" If="$(EnablePackaging)" /> | |
<Label Category="Cook" Name="$(Platform) Game" Requires="$(CookNodename)" Exclude="$(EditorNodeName)" If="!$(UGSBadgesPerStep)" /> | |
<Label Category="Cook" Name="$(Platform) Game" Requires="$(CookNodename)" Exclude="$(EditorNodeName)" UgsBadge="Cook $(Platform) Game" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" /> | |
<Label Category="Package" Name="$(Platform) Game" Requires="$(CopyPackagedNodeName)" Exclude="$(EditorNodeName);$(CookNodename);$(CompileNodeName)" /> | |
</ForEach> | |
<!-- | |
########################################################## | |
# Compile / cook / package the server | |
########################################################## | |
--> | |
<ForEach Name="Platform" Values="$(ServerPlatforms)" Separator="+"> | |
<!-- | |
########################################################## | |
# Compile server | |
########################################################## | |
--> | |
<Property Name="CompileNodeName" Value="Compile $(Platform) Server" /> | |
<Property Name="UploadSymbolsNodeName" Value="Upload Symbols $(Platform) Server" /> | |
<Agent Name="$(CompileNodeName)" Type="$(CompileAgentType)"> | |
<Node Name="$(CompileNodeName)" Requires="$(ToolsNodeName)" Produces="#$(CompileNodeName) Binaries" RunEarly="true"> | |
<ForEach Name="Configuration" Values="$(BuildConfigurations)" Separator="+"> | |
<Compile Target="$(ProjectName)Server" Platform="$(Platform)" Configuration="$(Configuration)" Arguments="-BuildVersion="$(BuildName)" $(ExtraProjectCompileArguments)" /> | |
</ForEach> | |
</Node> | |
<Node Name="$(UploadSymbolsNodeName)" Requires="$(CompileNodeName)"> | |
<SymStore Platform="$(Platform)" Files="#$(CompileNodeName)" StoreDir="$(ProjectSymbolServerPath)\$(Platform)" Product="$(ProjectName)" BuildVersion="$(BuildName)" /> | |
</Node> | |
</Agent> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(CompileNodeName)" /> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(UploadSymbolsNodeName)" If="$(UploadSymbols) and '$(Platform)' != 'Linux'" /> | |
<Label Category="Compile" Name="$(Platform) Server" Requires="$(CompileNodeName)" Exclude="$(ToolsNodeName)" If="!$(UGSBadgesPerStep)" /> | |
<Label Category="Compile" Name="$(Platform) Server" Requires="$(CompileNodeName)" Exclude="$(ToolsNodeName)" UgsBadge="Compile $(Platform) Server" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" /> | |
<!-- | |
########################################################## | |
# Cook, stage, and package the server | |
########################################################## | |
--> | |
<Property Name="CookNodeName" Value="Cook $(Platform) server" /> | |
<Property Name="StageNodeName" Value="Stage $(Platform) server" /> | |
<Property Name="CopyStagedNodeName" Value="Copy Staged $(Platform) server" /> | |
<Property Name="PackageNodeName" Value="Package $(Platform) server" /> | |
<Property Name="CopyPackagedNodeName" Value="Copy Packaged $(Platform) server" /> | |
<Property Name="CookPlatform" Value="$(Platform)Server" /> | |
<Property Name="CookPlatform" Value="WindowsServer" If="'$(Platform)' == 'Win64'" /> | |
<Property Name="BCRArgs" Value="-Project=$(UProject) -Platform=$(Platform) -Configuration=$(BuildConfigurations) -NoCodeSign -Server -NoClient" /> | |
<Agent Name="Cook, package, and stage $(Platform) server" Type="$(CookAgentType)"> | |
<Node Name="$(CookNodeName)" Requires="$(EditorNodeName)" Produces="#$(CookNodeName) Complete" RunEarly="true"> | |
<Cook Project="$(UProject)" Platform="$(CookPlatform)" /> | |
</Node> | |
<!-- Stage --> | |
<Node Name="$(StageNodeName)" Requires="$(CompileNodeName);#$(CompileNodeName) Binaries;#$(CookNodeName) Complete"> | |
<Command Name="BuildCookRun" Arguments="$(BCRArgs) -SkipBuild -SkipCook -Stage -Pak" /> | |
<!-- By request of QA, they would like a file at the root with the relevant CL in it --> | |
<WriteTextFile | |
File="$(ProjectOutputDirectory)/$(CookPlatform)/cl.txt" | |
Text="$(Change)" | |
/> | |
</Node> | |
<!-- Publish (Staged) --> | |
<Node Name="$(CopyStagedNodeName)" Requires="$(StageNodeName)"> | |
<Copy Files="..." From="$(ProjectOutputDirectory)/$(CookPlatform)" To="$(NetworkOutputDirectory)\$(CookPlatform)\Staged" /> | |
</Node> | |
<!-- Package --> | |
<Node Name="$(PackageNodeName)" Requires="$(CopyStagedNodeName)"> | |
<Command Name="BuildCookRun" Arguments="$(BCRArgs) -SkipBuild -SkipCook -SkipStage -SkipPak -Package" /> | |
</Node> | |
<!-- Publish (Packages) --> | |
<Node Name="$(CopyPackagedNodeName)" Requires="$(PackageNodeName)"> | |
<Property Name="ArchiveDirectory" Value=""$(NetworkOutputDirectory)\$(CookPlatform)\Packages"" /> | |
<Command Name="BuildCookRun" Arguments="$(BCRArgs) -SkipBuild -SkipCook -SkipStage -SkipPak -SkipPackage -Archive -ArchiveDirectory=$(ArchiveDirectory)" /> | |
</Node> | |
</Agent> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(CookNodeName)" If="$(EnableCooking)" /> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(CopyPackagedNodeName)" If="$(EnablePackaging)" /> | |
<Label Category="Cook" Name="$(Platform) Server" Requires="$(CookNodename)" Exclude="$(EditorNodeName)" If="!$(UGSBadgesPerStep)" /> | |
<Label Category="Cook" Name="$(Platform) Server" Requires="$(CookNodename)" Exclude="$(EditorNodeName)" UgsBadge="Cook $(Platform) Server" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" /> | |
<Label Category="Package" Name="$(Platform) Server" Requires="$(CopyPackagedNodeName)" Exclude="$(EditorNodeName);$(CookNodename);$(CompileNodeName)" /> | |
</ForEach> | |
<!-- | |
########################################################## | |
# Package UGS pre-compiled binaries | |
########################################################## | |
--> | |
<Property Name="UGSBinariesStageNodeName" Value="Stage files for UGS Archive" /> | |
<Property Name="UGSBinariesSubmitNodeName" Value="Submit UGS Archive" /> | |
<Property Name="UGSBinariesSymbolsNodeName" Value="Upload Editor symbols" /> | |
<Agent Name="Package UGS binaries" Type="$(CompileAgentType)"> | |
<Node Name="$(UGSBinariesStageNodeName)" Requires="$(EditorNodeName)" Produces="#ArchiveFiles"> | |
<!-- Clear out the archive directory so we ensure clean archives --> | |
<Delete Files="$(UGSArchiveDirectory)\..." /> | |
<!-- | |
Since the AutomationTool is built automatically, it actually isn't in our | |
required files list, so lets tag it specifically. | |
Of note, we tag it with ArchiveBinaries directly. If we tag it with ArchiveFiles | |
we get an error when stripping the AutomationTool symbols. | |
--> | |
<Tag Files="Engine\Binaries\DotNET\AutomationTool\..." With="#ArchiveBinaries" /> | |
<!-- | |
Write a text file marker indicating that we're using precompiled binaries, I | |
have no idea why Epic does this... | |
--> | |
<Spawn Exe="cmd.exe" Arguments="/C echo. >"$(RootDir)\Engine\Build\PrecompiledBinaries.txt"" /> | |
<Tag Files="$(RootDir)\Engine\Build\PrecompiledBinaries.txt" With="#ArchiveFiles" /> | |
<!-- Partition all the binaries and symbols --> | |
<Tag Files="#ToolBinaries;#EditorBinaries" Except=".../Intermediate/..." With="#ArchiveFiles" /> | |
<Tag Files="#ArchiveFiles" Except="*.pdb" With="#ArchiveBinaries" /> | |
<Tag Files="#ArchiveFiles" Filter="*.pdb" With="#ArchiveSymbols" /> | |
<!-- List all the files being archived --> | |
<Log Message="Archive binaries:" Files="#ArchiveBinaries" /> | |
<Log Message="Archive symbols:" Files="#ArchiveSymbols" /> | |
<!-- Stage all the files to be archived --> | |
<Copy Files="#ArchiveBinaries" From="$(RootDir)" To="$(UGSArchiveStagingDirectory)" /> | |
<Strip Files="#ArchiveSymbols" BaseDir="$(RootDir)" OutputDir="$(UGSArchiveStagingDirectory)" Platform="Win64" /> | |
<!-- Create the zip file and submit it to Perforce --> | |
<Zip FromDir="$(UGSArchiveStagingDirectory)" ZipFile="$(UGSArchiveFile)" /> | |
<!-- Tag the editor symbols with source information --> | |
<!-- <Tag Files="..." Filter="*.c;*.h;*.cpp;*.hpp;*.inl" Except="Engine/Source/ThirdParty/..." With="#SourceFiles" /> | |
<SrcSrv BinaryFiles="#ArchiveFiles" SourceFiles="#SourceFiles" Branch="$(Branch)" Change="$(CodeChange)" /> --> | |
</Node> | |
<Node Name="$(UGSBinariesSubmitNodeName)" Requires="$(UGSBinariesStageNodeName)"> | |
<Submit | |
Description="[CL $(CodeChange)] $(ProjectName) - Precompiled editor binaries" | |
Files="$(UGSArchiveFile)" | |
FileType="binary+FS64" | |
Workspace="$(COMPUTERNAME)_ArchiveForUGS" | |
Stream="$(UGSBinariesStream)" | |
RootDir="$(UGSArchivePerforceDirectory)" | |
/> | |
</Node> | |
<Node Name="$(UGSBinariesSymbolsNodeName)" Requires="#ArchiveFiles"> | |
<SymStore Platform="Win64" Files="#ArchiveFiles" StoreDir="$(ProjectSymbolServerPath)\Win64" Product="UGSEditor" BuildVersion="$(BuildName)" /> | |
</Node> | |
</Agent> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(UGSBinariesSubmitNodeName);$(UGSBinariesSymbolsNodeName);" If="$(SubmitUGSBinaries)" /> | |
<Label Category="Other" Name="UGS Binaries" Requires="$(UGSBinariesSubmitNodeName);$(UGSBinariesSymbolsNodeName)" Exclude="$(EditorNodeName)" UgsBadge="UGS Binaries" UgsProject="$(UGSProject)" If="$(SubmitUGSBinaries)" /> | |
<!-- | |
########################################################## | |
# HLOD generation | |
########################################################## | |
To avoid cluttering the Horde UI with lots of labels for each map, we bundle all the nodes into | |
GeneratedHLODNodes, and then append that to BuildProjectNodes as well as use that for the | |
labels. | |
--> | |
<Property Name="GeneratedHLODNodes" Value="" /> | |
<ForEach Name="MapName" Values="$(HLODMapNames)" Separator="+"> | |
<Property Name="CleanMapName" Value="" /> | |
<ForEach Name="Part" Values="$(MapName)" Separator="/"> | |
<Property Name="CleanMapName" Value="$(CleanMapName)-$(Part)" /> | |
</ForEach> | |
<Property Name="HLODNodeName" Value="Generate HLODs $(CleanMapName)" /> | |
<Property Name="HLODCommonCommandletArgs" Value="$(MapName) -Builder=WorldPartitionHLODsBuilder -AllowCommandletRendering" /> | |
<Agent Name="$(HLODNodeName)" Type="$(TestAgentType)"> | |
<Node Name="$(HLODNodeName)" Requires="$(EditorNodeName)"> | |
<Commandlet Name="WorldPartitionBuilder" Project="$(UProject)" Arguments="$(HLODCommonCommandletArgs) $(SCC_None) -SetupHLOD" /> | |
<Commandlet Name="WorldPartitionBuilder" Project="$(UProject)" Arguments="$(HLODCommonCommandletArgs) $(SCC_None) -BuildHLODs" /> | |
<Property Name="HLODFinalizeArgs" Value="$(HLODCommonCommandletArgs) -FinalizeHLODs" /> | |
<Property Name="HLODFinalizeArgs" Value="$(HLODFinalizeArgs) $(SCC_P4) -Submit" If="$(IsBuildMachine)" /> | |
<Commandlet Name="WorldPartitionBuilder" Project="$(UProject)" Arguments="$(HLODFinalizeArgs)" /> | |
</Node> | |
</Agent> | |
<Property Name="GeneratedHLODNodes" Value="$(GeneratedHLODNodes);$(HLODNodeName);" /> | |
</ForEach> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(GeneratedHLODNodes)" /> | |
<Label Category="Other" Name="Generate HLODs" Requires="$(GeneratedHLODNodes)" Exclude="$(EditorNodeName)" /> | |
<!-- | |
########################################################## | |
# Resave dirty packages | |
########################################################## | |
--> | |
<Property Name="ResaveDirtyPackagesNodeName" Value="Resave dirty packages" /> | |
<Property Name="ResavePackagesArgs" Value="" /> | |
<Property Name="ResavePackagesArgs" Value="$(ResavePackagesArgs) -ProjectOnly -MaxPackagesToResave=$(MaxPackagesToResave) -GCFreq=10000 -SkipFails" /> | |
<Property Name="ResavePackagesArgs" Value="$(ResavePackagesArgs) -OnlySaveDirtyPackages -SkipCheckedOutPackages -AutoCheckOut" /> | |
<Property Name="ResavePackagesArgs" Value="$(ResavePackagesArgs) $(SCC_P4) -AutoCheckIn" If="$(IsBuildMachine)" /> | |
<Agent Name="$(ResaveDirtyPackagesNodeName)" Type="$(CompileAgentType)"> | |
<Node Name="$(ResaveDirtyPackagesNodeName)" Requires="$(EditorNodeName)"> | |
<Commandlet Name="ResavePackages" Project="$(UProject)" Arguments="$(ResavePackagesArgs)" /> | |
</Node> | |
</Agent> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(ResaveDirtyPackagesNodeName);" If="$(ResaveDirtyPackages)" /> | |
<Label Category="Other" Name="Resave Packages" Requires="$(ResaveDirtyPackagesNodeName)" Exclude="$(EditorNodeName)" /> | |
<!-- | |
########################################################## | |
# Resave redirectors | |
########################################################## | |
Compared to the resave dirty packages: | |
* We remove the MaxPackagesToResave and add SearchAllAssets | |
* This is to ensure we are not leaving partial redirectors around | |
From Epic comment in ContentCommandlets.cpp regarding SearchAllAssets: | |
> This option allows the dependency graph and soft object path redirect map to be | |
populated. This is useful if you want soft object references to redirectors to | |
be followed to the destination asset at save time. | |
--> | |
<Property Name="ResaveRedirectorsNodeName" Value="Fixup redirectors" /> | |
<Property Name="ResaveRedirectorsArgs" Value="-ProjectOnly -FixupRedirectors -SearchAllAssets -SkipCheckedOutPackages -AutoCheckOut" /> | |
<Property Name="ResaveRedirectorsArgs" Value="$(ResaveRedirectorsArgs) $(SCC_P4) -AutoCheckIn" If="$(IsBuildMachine)" /> | |
<Agent Name="$(ResaveRedirectorsNodeName)" Type="$(CompileAgentType)"> | |
<Node Name="$(ResaveRedirectorsNodeName)" Requires="$(EditorNodeName)"> | |
<Commandlet Name="ResavePackages" Project="$(UProject)" Arguments="$(ResaveRedirectorsArgs)" /> | |
</Node> | |
</Agent> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(ResaveRedirectorsNodeName);" If="$(ResaveRedirectors)" /> | |
<Label Category="Other" Name="Resave Redirectors" Requires="$(ResaveRedirectorsNodeName)" Exclude="$(EditorNodeName)" /> | |
<!-- | |
########################################################## | |
# Fill the DDC | |
########################################################## | |
--> | |
<Property Name="FillDDCNodeName" Value="Fill DDC" /> | |
<Agent Name="$(FillDDCNodeName)" Type="$(CompileAgentType)"> | |
<Node Name="$(FillDDCNodeName)" Requires="$(EditorNodeName)"> | |
<Commandlet Name="DerivedDataCache" Project="$(UProject)" Arguments="-Fill -TargetPlatform=WindowsEditor" /> | |
</Node> | |
</Agent> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(FillDDCNodeName);" If="$(FillDDC)" /> | |
<Label Category="Other" Name="Fill DDC" Requires="$(FillDDCNodeName)" Exclude="$(EditorNodeName)" /> | |
<!-- | |
########################################################## | |
# Generate NavMesh | |
########################################################## | |
To avoid cluttering the Horde UI with lots of individual maps, we bundle all the nodes into | |
GeneratedNavMeshNodes, and then append that to BuildProjectNodes as well as use that for the | |
labels. | |
As of 2022-11-14 and UE 5.0.3, the WorldPartitionBuilder commandlet doesn't support -Submit on the | |
WorldPartitionNavigationDataBuilder builder. The only builder that supports -Submit is | |
WorldPartitionHLODsBuilder. Our choice was to either edit the WorldPartitionBuilder automation | |
command C# code, or the WorldPartitionBuilder commandlet c++ code. Neither of which were super | |
enticing because they are engine code. To get around it we are simply calling the p4.exe. Hopefully | |
Epic adds support for the -Submit argument on the commandlet for all builders and this can be removed. | |
--> | |
<Property Name="GeneratedNavMeshNodes" Value="" /> | |
<ForEach Name="MapName" Values="$(NavMeshMapNames)" Separator="+"> | |
<Property Name="CleanMapName" Value="" /> | |
<ForEach Name="Part" Values="$(MapName)" Separator="/"> | |
<Property Name="CleanMapName" Value="$(CleanMapName)-$(Part)" /> | |
</ForEach> | |
<Property Name="NavMeshGenerationNodeName" Value="Generate Nav Mesh $(CleanMapName)" /> | |
<Property Name="NavMeshSubmitNodeName" Value="Submit Nav Mesh $(CleanMapName)" /> | |
<Agent Name="$(NavMeshGenerationNodeName)" Type="$(TestAgentType)"> | |
<Node Name="$(NavMeshGenerationNodeName)" Requires="$(EditorNodeName)"> | |
<Property Name="NavMeshCommonBuilderArgs" Value="-Builder=WorldPartitionNavigationDataBuilder $(MapName) -AllowCommandletRendering $(SCC_P4)" /> | |
<Commandlet Name="WorldPartitionBuilder" Project="$(UProject)" Arguments="$(NavMeshCommonBuilderArgs)" /> | |
</Node> | |
<Node Name="$(NavMeshSubmitNodeName)" Requires="$(NavMeshGenerationNodeName)"> | |
<Property Name="NavMeshP4Args" Value="-c $(uebp_CLIENT)" /> | |
<Property Name="NavMeshP4Args" Value="$(NavMeshP4Args) submit" /> | |
<Property Name="NavMeshP4Args" Value="$(NavMeshP4Args) -d "Generated navigation mesh for $(MapName)"" /> | |
<Spawn Exe="p4.exe" Arguments="$(NavMeshP4Args)" /> | |
</Node> | |
</Agent> | |
<Property Name="GeneratedNavMeshNodes" Value="$(GeneratedNavMeshNodes);$(NavMeshGenerationNodeName)" /> | |
<Property Name="GeneratedNavMeshNodes" Value="$(GeneratedNavMeshNodes);$(NavMeshSubmitNodeName)" If="$(IsBuildMachine)" /> | |
</ForEach> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(GeneratedNavMeshNodes)" /> | |
<Label Category="Other" Name="Generate NavMesh" Requires="$(GeneratedNavMeshNodes)" Exclude="$(EditorNodeName)" /> | |
<!-- | |
########################################################## | |
# Test CompileAllBlueprints | |
########################################################## | |
--> | |
<Property Name="TestCompileAllBlueprintsNodeName" Value="Test Compile All Blueprints" /> | |
<Agent Name="$(TestCompileAllBlueprintsNodeName)" Type="$(CompileAgentType)"> | |
<Node Name="$(TestCompileAllBlueprintsNodeName)" Requires="$(EditorNodeName)"> | |
<Commandlet Name="CompileAllBlueprints" Project="$(UProject)" /> | |
</Node> | |
</Agent> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(TestCompileAllBlueprintsNodeName);" If="$(TestCompileAllBlueprints)" /> | |
<Label Category="Test" Name="Compile All Blueprints" Requires="$(TestCompileAllBlueprintsNodeName)" Exclude="$(EditorNodeName)" If="!$(UGSBadgesPerStep)" /> | |
<Label Category="Test" Name="Compile All Blueprints" Requires="$(TestCompileAllBlueprintsNodeName)" Exclude="$(EditorNodeName)" UgsBadge="Test Compile All Blueprints" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" /> | |
<!-- | |
########################################################## | |
# Editor Automation Testing | |
########################################################## | |
Valid test names can contain both colon (:) and slashes (/). Those characters are however | |
not allowed to be in BuildGraph node names. So we need to strip them out. | |
That is why we have several ForEach loops that might appear useless at first. They are meant | |
to replace colons with underscores, and slashes with dashes. | |
Since node names are presented to users, it's not just important they are valid but also | |
that they are clean. That is why we have the two properties with if statements. Without it | |
we would end up with the node names being _-TestName, which just isn't very clean. | |
Note: BuildGraph doesn't seem to have a ElseIf element, so we must do the negative check | |
first. | |
--> | |
<Property Name="EditorAutomationGeneratedNodes" Value="" /> | |
<ForEach Name="TestName" Values="$(EditorAutomationTests)"> | |
<Property Name="TestNameNoSlashes" Value="" /> | |
<ForEach Name="Part" Values="$(TestName)" Separator="/"> | |
<Property Name="TestNameNoSlashes" Value="$(TestNameNoSlashes)-$(Part)" If="'$(TestNameNoSlashes)' != ''" /> | |
<Property Name="TestNameNoSlashes" Value="$(Part)" If="'$(TestNameNoSlashes)' == ''" /> | |
</ForEach> | |
<Property Name="TestNameNoColon" Value="" /> | |
<ForEach Name="Part" Values="$(TestNameNoSlashes)" Separator=":"> | |
<Property Name="TestNameNoColon" Value="$(TestNameNoColon)_$(Part)" If="'$(TestNameNoColon)' != ''" /> | |
<Property Name="TestNameNoColon" Value="$(Part)" If="'$(TestNameNoColon)' == ''" /> | |
</ForEach> | |
<Property Name="EditorAutomationTestNodeName" Value="Test $(TestNameNoColon)" /> | |
<Agent Name="$(EditorAutomationTestNodeName)" Type="$(TestAgentType)"> | |
<Node Name="$(EditorAutomationTestNodeName)" Requires="$(EditorNodeName)"> | |
<Property Name="TestArgs" Value="-Project=$(UProject) -NullRHI -NoVSync -FPS=60 -Deterministic" /> | |
<Property Name="TestArgs" Value="$(TestArgs) -WriteTestResultsForHorde" If="'$(UE_HORDE_JOBID)' != ''" /> | |
<Property Name="TestArgs" Value="$(TestArgs) -Test="UE.EditorAutomation(RunTest=$(TestName))"" /> | |
<Property Name="TestArgs" Value="$(TestArgs) -Build=Editor -UseEditor" /> | |
<Command Name="RunUnreal" Arguments="$(TestArgs)" /> | |
</Node> | |
</Agent> | |
<Property Name="EditorAutomationGeneratedNodes" Value="$(EditorAutomationGeneratedNodes);$(EditorAutomationTestNodeName)" /> | |
</ForEach> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(EditorAutomationGeneratedNodes)" /> | |
<Label Category="Test" Name="Editor Automation" Requires="$(EditorAutomationGeneratedNodes)" Exclude="$(EditorNodeName)" If="!$(UGSBadgesPerStep)" /> | |
<Label Category="Test" Name="Editor Automation" Requires="$(EditorAutomationGeneratedNodes)" Exclude="$(EditorNodeName)" UgsBadge="Test Editor Automation" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" /> | |
<!-- | |
########################################################## | |
# Editor Boot Test | |
########################################################## | |
--> | |
<Property Name="EditorBootTestNodeName" Value="Test Editor Boot" /> | |
<Agent Name="$(EditorBootTestNodeName)" Type="$(TestAgentType)"> | |
<Node Name="$(EditorBootTestNodeName)" Requires="$(EditorNodeName)"> | |
<Property Name="TestArgs" Value="-Project=$(UProject)" /> | |
<Property Name="TestArgs" Value="$(TestArgs) -Test="UE.EditorBootTest"" /> | |
<Property Name="TestArgs" Value="$(TestArgs) -Build=Editor -UseEditor" /> | |
<Command Name="RunUnreal" Arguments="$(TestArgs)" /> | |
</Node> | |
</Agent> | |
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(EditorBootTestNodeName);" If="$(EnableEditorBootTest)" /> | |
<Label Category="Test" Name="Editor Boot" Requires="$(EditorBootTestNodeName)" Exclude="$(EditorNodeName)" If="!$(UGSBadgesPerStep)" /> | |
<Label Category="Test" Name="Editor Boot" Requires="$(EditorBootTestNodeName)" Exclude="$(EditorNodeName)" UgsBadge="Test Editor Boot" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" /> | |
<!-- | |
########################################################## | |
# Build aggregate for targeting | |
########################################################## | |
--> | |
<Aggregate Name="BuildProject" Requires="$(BuildProjectNodes)" /> | |
<Label Category="Other" Name="$(UGSBadgesOverallName)" Requires="$(BuildProjectNodes)" UgsBadge="$(UGSBadgesOverallName)" UgsProject="$(UGSProject)" If="$(UGSBadgesOverall)" /> | |
<!-- | |
########################################################## | |
# Miscellaneous build targets | |
########################################################## | |
The following build targets have their own sections and are after | |
the main BuildProject aggregate because they don't require or need | |
anything from the rest of the script. They are self contained other | |
than utalizing the same set of options and properties from the top. | |
--> | |
<!-- | |
########################################################## | |
# Age symstore | |
########################################################## | |
Server binaries symbols are stored in the same place as client binaries. Need to | |
handle the situation where we build Windows server, but not Windows client. | |
Linux symbols are not even supported, so only worried about Win64. | |
To do that we build a new list of platforms, and add Win64 if not already there. | |
--> | |
<Property Name="AgeSymStoreNodes" Value="" /> | |
<Property Name="AgeSymStorePlatforms" Value="$(GamePlatforms)" /> | |
<Property Name="AgeSymStorePlatforms" Value="$(GamePlatforms)+Win64" If="!ContainsItem('$(GamePlatforms)', 'Win64', '+') and $(BuildWin64Server)"/> | |
<Agent Name="Age Symstore" Type="Utility"> | |
<ForEach Name="Platform" Values="$(AgeSymStorePlatforms)" Separator="+"> | |
<Property Name="NodeName" Value="Age $(Platform) Symstore" /> | |
<Node Name="$(NodeName)"> | |
<Log Message="Aging Symstore at $(ProjectSymbolServerPath)\$(Platform)" /> | |
<AgeStore Platform="$(Platform)" Days="$(SymbolDaysKeep)" StoreDir="$(ProjectSymbolServerPath)\$(Platform)" /> | |
</Node> | |
<Property Name="AgeSymStoreNodes" Value="$(AgeSymStoreNodes);$(NodeName)" /> | |
</ForEach> | |
</Agent> | |
<!-- Create an aggregate with all the generated nodes --> | |
<Aggregate Name="AgeSymstore" Requires="$(AgeSymStoreNodes)" /> | |
<!-- | |
########################################################## | |
# Cleanup network directories | |
########################################################## | |
--> | |
<Property Name="CleanupNodes" Value="" /> | |
<Agent Name="Purge Builds" Type="Utility"> | |
<Node Name="Purge Scratch Builds"> | |
<Log Message="Purging all files older than $(ScratchBuildsMaxAge) in $(ScratchBuildsPath)" /> | |
<PurgeOldFiles Days="$(ScratchBuildsMaxAge)" RootDirectory="$(ScratchBuildsPath)" Files="*/..." /> | |
</Node> | |
<Property Name="CleanupNodes" Value="$(CleanupNodes);Purge Scratch Builds" If="$(ScratchBuildsPurge)" /> | |
<Node Name="Purge Saved Builds"> | |
<Log Message="Purging all files older than $(SavedBuildsMaxAge) in $(SavedBuildsPath)" /> | |
<PurgeOldFiles Days="$(SavedBuildsMaxAge)" RootDirectory="$(SavedBuildsPath)" Files="*/..." /> | |
</Node> | |
<Property Name="CleanupNodes" Value="$(CleanupNodes);Purge Saved Builds" If="$(SavedBuildsPurge)" /> | |
<Node Name="Purge Intermediate Builds"> | |
<Log Message="Purging all files older than $(IntermediateBuildsMaxAge) in $(HordeIntermediatePath)" /> | |
<PurgeOldFiles Days="$(IntermediateBuildsMaxAge)" RootDirectory="$(HordeIntermediatePath)" Files="*/..." /> | |
</Node> | |
<Property Name="CleanupNodes" Value="$(CleanupNodes);Purge Intermediate Builds" If="$(IntermediateBuildsPurge)" /> | |
</Agent> | |
<!-- Create an aggregate with all the generated nodes --> | |
<Aggregate Name="UtilityCleanup" Requires="$(CleanupNodes)" /> | |
</BuildGraph> |
<?xml version='1.0' ?> | |
<BuildGraph xmlns="http://www.epicgames.com/BuildGraph" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.epicgames.com/BuildGraph ../Schema.xsd"> | |
<Property Name="ProjectName" Value="Project" /> | |
<Property Name="NetworkRootDirectory" Value="\\some\network\path\Horde" /> | |
<Property Name="ProjectSymbolServerPath" Value="\\some\network\path\Symstore" /> | |
<Property Name="SymbolDaysKeep" Value="14" /> | |
<Property Name="EnableWarningsAsErrorsCompile" Value="false" /> | |
<Property Name="EnableStrictCompile" Value="false" /> | |
<Property Name="UGSBinariesStream" Value="//project/binaries" /> | |
<!-- | |
Editor automation test configuration | |
We currently run the same tests for all cases, so just define it once. | |
--> | |
<Property Name="EditorAutomationTestsCommon" Value="Group:AI_Navigation;Group:AI_MassAI;Group:AI_SmartObjects;Group:AI_Behaviors;Group:AI_UnitTests" /> | |
<Property Name="EditorAutomationTestsPreflight" Value="$(EditorAutomationTestsCommon)" /> | |
<Property Name="EditorAutomationTestsCI" Value="$(EditorAutomationTestsCommon)" /> | |
<Property Name="EditorAutomationTestsNightly" Value="$(EditorAutomationTestsCommon)" /> | |
</BuildGraph> |
{ | |
"Name": "//ue5/main", | |
"ClusterName": "Default", | |
"NotificationChannel": "#......", | |
"NotificationChannelFilter": "Failure", | |
"TriageChannel": "#.......", | |
"DefaultPreflight": { | |
"TemplateID": "pre-flight" | |
}, | |
"Tabs": [ | |
{ | |
"Title": "Continuous Integration", | |
"Type": "Jobs", | |
"ShowNames": true, | |
"Templates": [ | |
"continuous-integration" | |
], | |
"Columns": [ | |
{ | |
"Heading": "Compile", | |
"Category": "Compile", | |
"RelativeWidth": 1 | |
}, | |
{ | |
"Heading": "Cook", | |
"Category": "Cook", | |
"RelativeWidth": 1 | |
}, | |
{ | |
"Heading": "Other", | |
"Category": "Other", | |
"RelativeWidth": 1 | |
} | |
] | |
}, | |
{ | |
"Title": "Pre-Flights", | |
"Type": "Jobs", | |
"ShowNames": true, | |
"Templates": [ | |
"pre-flight" | |
], | |
"Columns": [ | |
{ | |
"Heading": "Compile", | |
"Category": "Compile", | |
"RelativeWidth": 1 | |
}, | |
{ | |
"Heading": "Cook", | |
"Category": "Cook", | |
"RelativeWidth": 1 | |
}, | |
{ | |
"Heading": "Package", | |
"Category": "Package", | |
"RelativeWidth": 1 | |
}, | |
{ | |
"Heading": "Other", | |
"Category": "Other", | |
"RelativeWidth": 1 | |
} | |
] | |
}, | |
{ | |
"Title": "Full Builds", | |
"Type": "Jobs", | |
"ShowNames": true, | |
"Templates": [ | |
"on-demand-full-build", | |
"non-unity-compile", | |
"nightly-full-build", | |
"static-analysis" | |
], | |
"Columns": [ | |
{ | |
"Heading": "Compile", | |
"Category": "Compile", | |
"RelativeWidth": 1 | |
}, | |
{ | |
"Heading": "Cook", | |
"Category": "Cook", | |
"RelativeWidth": 1 | |
}, | |
{ | |
"Heading": "Package", | |
"Category": "Package", | |
"RelativeWidth": 1 | |
}, | |
{ | |
"Heading": "Other", | |
"Category": "Other", | |
"RelativeWidth": 1 | |
} | |
] | |
}, | |
{ | |
"Title": "Utilities", | |
"Type": "Jobs", | |
"ShowNames": true, | |
"Templates": [ | |
"utility-age-symstore", | |
"utility-cleanup", | |
"utility-ddc-fill", | |
"utility-hlod-generation", | |
"utility-navmesh-generation", | |
"utility-resave-dirty-packages", | |
"utility-resave-redirectors", | |
"utility-ugs-binaries" | |
], | |
"Columns": [ | |
{ | |
"Heading": "Other", | |
"Category": "Other", | |
"RelativeWidth": 1 | |
} | |
] | |
} | |
], | |
"AgentTypes": { | |
"IncrementalCompileWin64": { | |
"Pool": "ue5-compile", | |
"Workspace": "Incremental", | |
"TempStorageDir": "\\\\network\\share\\project\\Horde\\Intermediate", | |
"Environment": { | |
"UE-SharedDataCachePath": "\\\\network\\share\\project_DDC" | |
} | |
}, | |
"CompileWin64": { | |
"Pool": "ue5-compile", | |
"Workspace": "Full", | |
"TempStorageDir": "\\\\network\\share\\project\\Horde\\Intermediate", | |
"Environment": { | |
"UE-SharedDataCachePath": "\\\\network\\share\\project_DDC" | |
} | |
}, | |
"IncrementalCookWin64": { | |
"Pool": "ue5-cook", | |
"Workspace": "Incremental", | |
"TempStorageDir": "\\\\network\\share\\project\\Horde\\Intermediate", | |
"Environment": { | |
"UE-SharedDataCachePath": "\\\\network\\share\\project_DDC" | |
} | |
}, | |
"CookWin64": { | |
"Pool": "ue5-cook", | |
"Workspace": "Full", | |
"TempStorageDir": "\\\\network\\share\\project\\Horde\\Intermediate", | |
"Environment": { | |
"UE-SharedDataCachePath": "\\\\network\\share\\project_DDC" | |
} | |
}, | |
"TestWin64": { | |
"Pool": "ue5-test", | |
"Workspace": "Incremental", | |
"TempStorageDir": "\\\\network\\share\\project\\Horde\\Intermediate", | |
"Environment": { | |
"UE-SharedDataCachePath": "\\\\network\\share\\project_DDC" | |
} | |
}, | |
"Utility": { | |
"Pool": "utility", | |
"Workspace": "Utility" | |
} | |
}, | |
"WorkspaceTypes": { | |
"Incremental": { | |
"Stream": "//ue5/main-horde", | |
"Identifier": "UE5MainInc", | |
"Incremental": true, | |
"UseAutoSdk": true | |
}, | |
"Full": { | |
"Stream": "//ue5/main-horde", | |
"Identifier": "UE5MainFull", | |
"Incremental": false, | |
"UseAutoSdk": true | |
}, | |
"Utility": { | |
"Stream": "//ue5/main-horde-utility", | |
"Identifier": "UE5MainUtil", | |
"Incremental": false, | |
"UseAutoSdk": true | |
} | |
}, | |
"Templates": [ | |
{ | |
"ID": "continuous-integration", | |
"Name": "Continuous Integration", | |
"AllowPreflights": false, | |
"InitialAgentType": "Utility", | |
"ShowUgsBadges": true, | |
"Arguments": [ | |
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml", | |
"-Target=BuildProject", | |
"-set:UseIncrementalAgents=true", | |
"-set:UGSBadgesPerStep=true", | |
"-set:BuildWin64Client=true", | |
"-set:BuildPS5Client=true", | |
"-set:BuildXSXClient=true", | |
"-set:BuildWin64Server=true", | |
"-set:BuildLinuxServer=true", | |
"-set:BuildDevelopmentConfiguration=true", | |
"-set:BuildShippingConfiguration=true", | |
"-set:BuildTestConfiguration=true", | |
"-set:EnableCooking=true", | |
"-set:EditorAutomationTestsCIEnable=true", | |
"-set:TestCompileAllBlueprints=false" | |
], | |
"Schedule": { | |
"Enabled": true, | |
"Patterns": [ | |
{ | |
"Interval": 1 | |
} | |
] | |
}, | |
"Parameters": [] | |
}, | |
{ | |
"ID": "pre-flight", | |
"Name": "Pre-flight Build", | |
"AllowPreflights": true, | |
"Priority": "High", | |
"InitialAgentType": "Utility", | |
"Arguments": [ | |
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml", | |
"-Target=BuildProject", | |
"-set:UseIncrementalAgents=true" | |
], | |
"Parameters": [ | |
{ | |
"Type": "List", | |
"Label": "Clients", | |
"Style": "MultiList", | |
"Items": [ | |
{ | |
"Text": "Windows", | |
"ArgumentIfEnabled": "-set:BuildWin64Client=true", | |
"ArgumentIfDisabled": "-set:BuildWin64Client=false", | |
"Default": true | |
}, | |
{ | |
"Text": "Playstation 5", | |
"ArgumentIfEnabled": "-set:BuildPS5Client=true", | |
"ArgumentIfDisabled": "-set:BuildPS5Client=false", | |
"Default": false | |
}, | |
{ | |
"Text": "Xbox Series X", | |
"ArgumentIfEnabled": "-set:BuildXSXClient=true", | |
"ArgumentIfDisabled": "-set:BuildXSXClient=false", | |
"Default": false | |
} | |
] | |
}, | |
{ | |
"Type": "List", | |
"Label": "Servers", | |
"Style": "MultiList", | |
"Items": [ | |
{ | |
"Text": "Windows", | |
"ArgumentIfEnabled": "-set:BuildWin64Server=true", | |
"ArgumentIfDisabled": "-set:BuildWin64Server=false", | |
"Default": true | |
}, | |
{ | |
"Text": "Linux", | |
"ArgumentIfEnabled": "-set:BuildLinuxServer=true", | |
"ArgumentIfDisabled": "-set:BuildLinuxServer=false", | |
"Default": true | |
} | |
] | |
}, | |
{ | |
"Type": "List", | |
"Label": "Configurations", | |
"Style": "MultiList", | |
"Items": [ | |
{ | |
"Text": "Debug", | |
"ArgumentIfEnabled": "-set:BuildDebugConfiguration=true", | |
"ArgumentIfDisabled": "-set:BuildDebugConfiguration=false", | |
"Default": false | |
}, | |
{ | |
"Text": "Development", | |
"ArgumentIfEnabled": "-set:BuildDevelopmentConfiguration=true", | |
"ArgumentIfDisabled": "-set:BuildDevelopmentConfiguration=false", | |
"Default": true | |
}, | |
{ | |
"Text": "Testing", | |
"ArgumentIfEnabled": "-set:BuildTestConfiguration=true", | |
"ArgumentIfDisabled": "-set:BuildTestConfiguration=false", | |
"Default": false | |
}, | |
{ | |
"Text": "Shipping", | |
"ArgumentIfEnabled": "-set:BuildShippingConfiguration=true", | |
"ArgumentIfDisabled": "-set:BuildShippingConfiguration=false", | |
"Default": false | |
} | |
] | |
}, | |
{ | |
"Type": "List", | |
"Label": "Tests", | |
"Style": "MultiList", | |
"Items": [ | |
{ | |
"Text": "Compile All Blueprints", | |
"ArgumentIfEnabled": "-set:TestCompileAllBlueprints=true", | |
"ArgumentIfDisabled": "-set:TestCompileAllBlueprints=false", | |
"Default": false | |
} | |
] | |
}, | |
{ | |
"Type": "List", | |
"Label": "Editor Automation Tests", | |
"Style": "MultiList", | |
"Items": [ | |
{ | |
"Text": "Preflight Test Group", | |
"ArgumentIfEnabled": "-set:EditorAutomationTestsPreflightEnable=true", | |
"Default": true | |
}, | |
{ | |
"Text": "CI Test Group", | |
"ArgumentIfEnabled": "-set:EditorAutomationTestsCIEnable=true", | |
"Default": false | |
}, | |
{ | |
"Text": "Nightly Test Group", | |
"ArgumentIfEnabled": "-set:EditorAutomationTestsNightlyEnable=true", | |
"Default": false | |
} | |
] | |
}, | |
{ | |
"Type": "Bool", | |
"Label": "Cook content", | |
"ArgumentIfEnabled": "-set:EnableCooking=true", | |
"ArgumentIfDisabled": "-set:EnableCooking=false", | |
"Default": true | |
}, | |
{ | |
"Type": "Bool", | |
"Label": "Package build", | |
"ArgumentIfEnabled": "-set:EnablePackaging=true", | |
"ArgumentIfDisabled": "-set:EnablePackaging=false", | |
"Default": false | |
}, | |
{ | |
"Type": "Bool", | |
"Label": "Non-unity Compile", | |
"ArgumentIfEnabled": "-set:EnableNonUnityCompile=true", | |
"ArgumentIfDisabled": "-set:EnableNonUnityCompile=false", | |
"Default": false | |
} | |
] | |
}, | |
{ | |
"ID": "nightly-full-build", | |
"Name": "Nightly Full Build", | |
"AllowPreflights": false, | |
"InitialAgentType": "Utility", | |
"ShowUgsBadges": true, | |
"Arguments": [ | |
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml", | |
"-Target=BuildProject", | |
"-set:SaveNetworkBuild=true", | |
"-set:UGSBadgesOverall=true", | |
"-set:UGSBadgesOverallName=Nightly Build", | |
"-set:BuildWin64Client=true", | |
"-set:BuildPS5Client=true", | |
"-set:BuildXSXClient=true", | |
"-set:BuildWin64Server=true", | |
"-set:BuildLinuxServer=true", | |
"-set:BuildDevelopmentConfiguration=true", | |
"-set:BuildShippingConfiguration=true", | |
"-set:BuildTestConfiguration=true", | |
"-set:EnablePackaging=true", | |
"-set:EditorAutomationTestsNightlyEnable=true", | |
"-set:TestCompileAllBlueprints=false" | |
], | |
"Schedule": { | |
"Enabled": true, | |
"MaxActive": 1, | |
"Patterns": [ | |
{ | |
"minTime": 1200 | |
} | |
] | |
}, | |
"Parameters": [] | |
}, | |
{ | |
"ID": "non-unity-compile", | |
"Name": "Non-Unity Compile", | |
"AllowPreflights": false, | |
"InitialAgentType": "Utility", | |
"ShowUgsBadges": true, | |
"Arguments": [ | |
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml", | |
"-Target=BuildProject", | |
"-set:UGSBadgesOverall=true", | |
"-set:UGSBadgesOverallName=Non-Unity Build", | |
"-set:EnableNonUnityCompile=true" | |
], | |
"Schedule": { | |
"Enabled": true, | |
"MaxActive": 1, | |
"Patterns": [ | |
{ | |
"MinTime": 1380 | |
} | |
] | |
}, | |
"Parameters": [ | |
{ | |
"Type": "Bool", | |
"Label": "Editor", | |
"ArgumentIfEnabled": "-set:BuildEditor=true", | |
"ArgumentIfDisabled": "-set:BuildEditor=false", | |
"Default": true | |
}, | |
{ | |
"Type": "List", | |
"Label": "Clients", | |
"Style": "MultiList", | |
"Items": [ | |
{ | |
"Text": "Windows", | |
"ArgumentIfEnabled": "-set:BuildWin64Client=true", | |
"ArgumentIfDisabled": "-set:BuildWin64Client=false", | |
"Default": true | |
}, | |
{ | |
"Text": "Playstation 5", | |
"ArgumentIfEnabled": "-set:BuildPS5Client=true", | |
"ArgumentIfDisabled": "-set:BuildPS5Client=false", | |
"Default": true | |
}, | |
{ | |
"Text": "Xbox Series X", | |
"ArgumentIfEnabled": "-set:BuildXSXClient=true", | |
"ArgumentIfDisabled": "-set:BuildXSXClient=false", | |
"Default": true | |
} | |
] | |
}, | |
{ | |
"Type": "List", | |
"Label": "Servers", | |
"Style": "MultiList", | |
"Items": [ | |
{ | |
"Text": "Windows", | |
"ArgumentIfEnabled": "-set:BuildWin64Server=true", | |
"ArgumentIfDisabled": "-set:BuildWin64Server=false", | |
"Default": true | |
}, | |
{ | |
"Text": "Linux", | |
"ArgumentIfEnabled": "-set:BuildLinuxServer=true", | |
"ArgumentIfDisabled": "-set:BuildLinuxServer=false", | |
"Default": true | |
} | |
] | |
}, | |
{ | |
"Type": "List", | |
"Label": "Configurations", | |
"Style": "MultiList", | |
"Items": [ | |
{ | |
"Text": "Debug", | |
"ArgumentIfEnabled": "-set:BuildDebugConfiguration=true", | |
"ArgumentIfDisabled": "-set:BuildDebugConfiguration=false", | |
"Default": false | |
}, | |
{ | |
"Text": "Development", | |
"ArgumentIfEnabled": "-set:BuildDevelopmentConfiguration=true", | |
"ArgumentIfDisabled": "-set:BuildDevelopmentConfiguration=false", | |
"Default": true | |
}, | |
{ | |
"Text": "Testing", | |
"ArgumentIfEnabled": "-set:BuildTestConfiguration=true", | |
"ArgumentIfDisabled": "-set:BuildTestConfiguration=false", | |
"Default": false | |
}, | |
{ | |
"Text": "Shipping", | |
"ArgumentIfEnabled": "-set:BuildShippingConfiguration=true", | |
"ArgumentIfDisabled": "-set:BuildShippingConfiguration=false", | |
"Default": false | |
} | |
] | |
} | |
] | |
}, | |
{ | |
"ID": "static-analysis", | |
"Name": "Static Analysis", | |
"AllowPreflights": false, | |
"InitialAgentType": "Utility", | |
"ShowUgsBadges": false, | |
"Arguments": [ | |
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml", | |
"-Target=BuildProject", | |
"-set:EnableStaticAnalyzer=true", | |
"-set:BuildDevelopmentConfiguration=true" | |
], | |
"Schedule": { | |
"Enabled": false, | |
"MaxActive": 1, | |
"Patterns": [ | |
{ | |
"MinTime": 1200 | |
} | |
] | |
}, | |
"Parameters": [ | |
{ | |
"Type": "Bool", | |
"Label": "Editor", | |
"ArgumentIfEnabled": "-set:BuildEditor=true", | |
"ArgumentIfDisabled": "-set:BuildEditor=false", | |
"Default": true | |
}, | |
{ | |
"Type": "Bool", | |
"Label": "Windows Client", | |
"ArgumentIfEnabled": "-set:BuildWin64Client=true", | |
"ArgumentIfDisabled": "-set:BuildWin64Client=false", | |
"Default": true | |
}, | |
{ | |
"Type": "Bool", | |
"Label": "Windows Server", | |
"ArgumentIfEnabled": "-set:BuildWin64Server=true", | |
"ArgumentIfDisabled": "-set:BuildWin64Server=false", | |
"Default": true | |
} | |
] | |
}, | |
{ | |
"ID": "on-demand-full-build", | |
"Name": "On-Demand Full Build", | |
"AllowPreflights": false, | |
"InitialAgentType": "Utility", | |
"Priority": "high", | |
"Arguments": [ | |
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml", | |
"-Target=BuildProject", | |
"-set:SaveNetworkBuild=true" | |
], | |
"Parameters": [ | |
{ | |
"Type": "List", | |
"Label": "Clients", | |
"Style": "MultiList", | |
"Items": [ | |
{ | |
"Text": "Windows", | |
"ArgumentIfEnabled": "-set:BuildWin64Client=true", | |
"ArgumentIfDisabled": "-set:BuildWin64Client=false", | |
"Default": true | |
}, | |
{ | |
"Text": "Playstation 5", | |
"ArgumentIfEnabled": "-set:BuildPS5Client=true", | |
"ArgumentIfDisabled": "-set:BuildPS5Client=false", | |
"Default": false | |
}, | |
{ | |
"Text": "Xbox Series X", | |
"ArgumentIfEnabled": "-set:BuildXSXClient=true", | |
"ArgumentIfDisabled": "-set:BuildXSXClient=false", | |
"Default": false | |
} | |
] | |
}, | |
{ | |
"Type": "List", | |
"Label": "Servers", | |
"Style": "MultiList", | |
"Items": [ | |
{ | |
"Text": "Windows", | |
"ArgumentIfEnabled": "-set:BuildWin64Server=true", | |
"ArgumentIfDisabled": "-set:BuildWin64Server=false", | |
"Default": true | |
}, | |
{ | |
"Text": "Linux", | |
"ArgumentIfEnabled": "-set:BuildLinuxServer=true", | |
"ArgumentIfDisabled": "-set:BuildLinuxServer=false", | |
"Default": true | |
} | |
] | |
}, | |
{ | |
"Type": "List", | |
"Label": "Configurations", | |
"Style": "MultiList", | |
"Items": [ | |
{ | |
"Text": "Debug", | |
"ArgumentIfEnabled": "-set:BuildDebugConfiguration=true", | |
"ArgumentIfDisabled": "-set:BuildDebugConfiguration=false", | |
"Default": false | |
}, | |
{ | |
"Text": "Development", | |
"ArgumentIfEnabled": "-set:BuildDevelopmentConfiguration=true", | |
"ArgumentIfDisabled": "-set:BuildDevelopmentConfiguration=false", | |
"Default": true | |
}, | |
{ | |
"Text": "Testing", | |
"ArgumentIfEnabled": "-set:BuildTestConfiguration=true", | |
"ArgumentIfDisabled": "-set:BuildTestConfiguration=false", | |
"Default": true | |
}, | |
{ | |
"Text": "Shipping", | |
"ArgumentIfEnabled": "-set:BuildShippingConfiguration=true", | |
"ArgumentIfDisabled": "-set:BuildShippingConfiguration=false", | |
"Default": true | |
} | |
] | |
}, | |
{ | |
"Type": "Bool", | |
"Label": "Cook", | |
"ArgumentIfEnabled": "-set:EnableCooking=true", | |
"ArgumentIfDisabled": "-set:EnableCooking=false", | |
"Default": true | |
}, | |
{ | |
"Type": "Bool", | |
"Label": "Package", | |
"ArgumentIfEnabled": "-set:EnablePackaging=true", | |
"ArgumentIfDisabled": "-set:EnablePackaging=false", | |
"Default": true | |
} | |
] | |
}, | |
{ | |
"ID": "utility-cleanup", | |
"Name": "Cleanup", | |
"AllowPreflights": false, | |
"InitialAgentType": "Utility", | |
"Arguments": [ | |
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml", | |
"-Target=UtilityCleanup" | |
], | |
"Schedule": { | |
"Enabled": true, | |
"MaxActive": 1, | |
"Patterns": [ | |
{ | |
"MinTime": 1320 | |
} | |
] | |
}, | |
"Parameters": [ | |
{ | |
"Type": "Bool", | |
"Label": "Purge scratch build files", | |
"ArgumentIfEnabled": "-set:ScratchBuildsPurge=true", | |
"ArgumentIfDisabled": "-set:ScratchBuildsPurge=false", | |
"Default": true | |
}, | |
{ | |
"Type": "Bool", | |
"Label": "Purge saved build files", | |
"ArgumentIfEnabled": "-set:SavedBuildsPurge=true", | |
"ArgumentIfDisabled": "-set:SavedBuildsPurge=false", | |
"Default": true | |
}, | |
{ | |
"Type": "Bool", | |
"Label": "Purge intermediate build files", | |
"ArgumentIfEnabled": "-set:IntermediateBuildsPurge=true", | |
"ArgumentIfDisabled": "-set:IntermediateBuildsPurge=false", | |
"Default": true | |
} | |
] | |
}, | |
{ | |
"ID": "utility-ddc-fill", | |
"Name": "DDC Fill", | |
"AllowPreflights": false, | |
"InitialAgentType": "Utility", | |
"Arguments": [ | |
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml", | |
"-Target=BuildProject", | |
"-set:FillDDC=true" | |
], | |
"Schedule": { | |
"Enabled": true, | |
"MaxActive": 1, | |
"Patterns": [ | |
{ | |
"MinTime": 1320 | |
} | |
] | |
}, | |
"Parameters": [] | |
}, | |
{ | |
"ID": "utility-hlod-generation", | |
"Name": "HLOD Generation", | |
"AllowPreflights": false, | |
"InitialAgentType": "Utility", | |
"Arguments": [ | |
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml", | |
"-Target=BuildProject", | |
"-set:UseIncrementalAgents=true", | |
"-set:GenerateHLODs=true", | |
"-set:NavMeshMapNames=", | |
"-set:BuilderCount=" | |
], | |
"Schedule": { | |
"Enabled": false, | |
"Patterns": [ | |
{ | |
"MinTime": 1320 | |
} | |
] | |
}, | |
"Parameters": [ ] | |
}, | |
{ | |
"ID": "utility-navmesh-generation", | |
"Name": "NavMesh Generation", | |
"AllowPreflights": false, | |
"InitialAgentType": "Utility", | |
"Arguments": [ | |
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml", | |
"-Target=BuildProject", | |
"-set:UseIncrementalAgents=true", | |
"-set:NavMeshMapNames=" | |
], | |
"Schedule": { | |
"Enabled": false, | |
"MaxActive": 1, | |
"Patterns": [ | |
{ | |
"MinTime": 1320 | |
} | |
] | |
}, | |
"Parameters": [ ] | |
}, | |
{ | |
"ID": "utility-ugs-binaries", | |
"Name": "UGS Binaries", | |
"AllowPreflights": false, | |
"InitialAgentType": "Utility", | |
"ShowUgsBadges": true, | |
"Priority": "High", | |
"Arguments": [ | |
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml", | |
"-Target=BuildProject", | |
"-set:UseIncrementalAgents=true", | |
"-set:SubmitUGSBinaries=true" | |
], | |
"Schedule": { | |
"Enabled": false, | |
"MaxActive": 1, | |
"Filter": [ | |
"ContainsCode" | |
], | |
"Patterns": [ | |
{ | |
"Interval": 1 | |
} | |
] | |
}, | |
"Parameters": [ ] | |
}, | |
{ | |
"ID": "utility-age-symstore", | |
"Name": "Age Symstore", | |
"AllowPreflights": false, | |
"InitialAgentType": "Utility", | |
"ShowUgsBadges": false, | |
"Priority": "Normal", | |
"Arguments": [ | |
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml", | |
"-Target=AgeSymstore", | |
"-set:UseIncrementalAgents=true", | |
"-set:BuildWin64Client=true", | |
"-set:BuildPS5Client=true", | |
"-set:BuildXSXClient=true", | |
"-set:BuildWin64Server=true", | |
"-set:BuildLinuxServer=true" | |
], | |
"Schedule": { | |
"Enabled": true, | |
"MaxActive": 1, | |
"Patterns": [ | |
{ | |
"MinTime": 1200 | |
} | |
] | |
}, | |
"Parameters": [ ] | |
}, | |
{ | |
"ID": "utility-resave-dirty-packages", | |
"Name": "Resave Dirty Packages", | |
"AllowPreflights": false, | |
"InitialAgentType": "Utility", | |
"ShowUgsBadges": false, | |
"Priority": "Normal", | |
"Arguments": [ | |
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml", | |
"-Target=BuildProject", | |
"-set:ResaveDirtyPackages=true" | |
], | |
"Schedule": { | |
"Enabled": false, | |
"MaxActive": 1, | |
"Patterns": [ | |
{ | |
"MinTime": 120 | |
} | |
] | |
}, | |
"Parameters": [ ] | |
}, | |
{ | |
"ID": "utility-resave-redirectors", | |
"Name": "Resave Redirectors", | |
"AllowPreflights": false, | |
"InitialAgentType": "Utility", | |
"ShowUgsBadges": false, | |
"Priority": "Normal", | |
"Arguments": [ | |
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml", | |
"-Target=BuildProject", | |
"-set:UseIncrementalAgents=true", | |
"-set:ResaveRedirectors=true" | |
], | |
"Schedule": { | |
"Enabled": false, | |
"MaxActive": 1, | |
"Patterns": [ | |
{ | |
"MinTime": 180 | |
} | |
] | |
}, | |
"Parameters": [ ] | |
} | |
] | |
} |
<?xml version='1.0' ?> | |
<BuildGraph xmlns="http://www.epicgames.com/BuildGraph" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.epicgames.com/BuildGraph ../Schema.xsd"> | |
<Include Script="Project-Config.xml" /> | |
<!-- This will declare an aggregate called BuildAndPackage --> | |
<Include Script="..\..\..\Engine\Build\Graph\BuildProject.xml" /> | |
</BuildGraph> |
@Nik153 Interesting, so it's a limiter option on ResavePackages that only resaves if there's a change in the output? It wasn't clear from reading the code what that was specifically useful for. I've been doing a lot of wholesale resaving, that would be useful for making it more targeted. (edit: been playing with it.. it takes an insane amount of time to do this operation!)
@ericblade If I remember correctly there are also ways to limit the resaving to project files (excluding editor/engine stuff) or even specifying the packages/path to process/ignore directly.
Also debugging and stepping through the process line-by-line answered lots of questions for me. Especially "why is this not resaved?" kind.
Note of caution though - in 5.3 relese there was an issue with ResavePackages (and fixup redirects by extension) - it was trying to compare relative paths with full paths and filtered everything out in UResavePackagesCommandlet::InitializeResaveParameters. Don't know if that was fixed at any point
I'm finally getting to trying out this implementation, and finding that the "Purge Builds" section is non-functional due to "PurgeOldFiles" not being an available task. Not sure if this was a custom task or one that Epic used to include but does not now. Either way, commenting out that section should get it running.
edit: also have to remove the line to build UnrealHeaderTool if you're using a newer unreal
how to enabled the Studio Telemetry, I try to follow on official document, but is does not work. How to debug test it.
@ericblade
It's more of a cleanup thing for the cases when e.g. name of the function/variable was changed in code, but some BPs might still reference it.
ResaveDirtyPackages commandlet loads all packages and checks if the loading resulted in any updates/changes. If yes the packaged is saved and might be checked in automatically.
Personally used that to get rid of assets with version 0 by adding -bOnlyUnversioned flag
Some info could be found here
https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Editor/UnrealEd/Commandlets/UResavePackagesCommandlet?application_version=5.4
https://www.coconutlizard.co.uk/blog/the-cook-the-resave-his-garbage-and-her-optimization/