技术解析 | 适用于TeamCity的Unreal Engine支持插件,提升游戏构建效率
龙智是JetBrains授权合作伙伴、Perforce授权合作伙伴,为您提供TeamCity、Perforce Helix Core等热门的游戏开发工具及一站式服务,欢迎咨询:400-666-7732、marketing@shdsd.com。

在这款新插件的开发过程中,JetBrains 一直与多位游戏开发客户保持密切联系,以确保它符合从事实际 Unreal Engine 项目工作的 DevOps 团队的需求。
为 Unreal Engine 游戏设置合适的构建管道可能是一项艰巨的任务,特别是对于那些在平台独特性方面经验有限的人来说。本文,我们将带您了解基本设置,同时会展示该插件的功能,并演示分布式 BuildGraph 支持等高级功能。

主要功能
专为最常见用例(BuildCookRun、BuildGraph 和自动化测试)定制的专用运行程序。 基于 BuildGraph 描述构建发行版。 即时自动化测试报告。 自动发现构建计算机上的 Unreal Engine 安装。 兼容最新的 5.x 版 Unreal Engine,还支持 4.x 版本。
演示
使用 BuildCookRun 构建 Cropout
采用指定配置针对目标平台进行编译。 资源烘焙(将所有资源转换为可在目标平台上读取的资源)。 将项目封装为合适的分发格式。 等等。


unrealEngine {
engineDetectionMode = automatic {
identifier = "5.4"
}
command = buildCookRun {
project = "cropout/CropoutSampleProject.uproject"
buildConfiguration = standaloneGame {
configurations = "Development+Shipping"
platforms = "Mac"
}
cook = cookConfiguration {
maps = "Village+MainMenu"
cultures = "en"
unversionedContent = true
}
stage = stageConfiguration {
directory = "./staged"
}
archive = archiveConfiguration {
directory = "./archived"
}
pak = true
compressed = true
prerequisites = true
}
additionalArguments = "-utf8output -buildmachine -unattended -noP4 -nosplash -stdout -NoCodeSign"
}
所有设置的作用都一目了然,但有几项设置需要进一步说明:
engine detection mode
我们可以在此处指定“automatic”或“manual”。前者假定您已经在代理上安装引擎并在系统中注册。 我借此机会澄清一下“注册 ”的含义:当您通过 EGL 安装 Unreal Engine 或通过源代码构建 Unreal Engine 时,此操作会写入目标计算机上的某些文件(如果使用的是 Windows,则会写入注册表)。 这基本上就是自动检测模式的用途。我们读取这些文件并发布标识符作为代理属性,这样一来,您稍后便可使用这些属性为构建选择合适的代理。 “手动”模式允许您设置 Unreal Engine 根文件夹的准确路径,当您通过源代码构建时可能会用到该路径。稍后我们将介绍这部分内容。 build configuration
通过调整此参数,我们可以指定所创建构建的类型,它是单机游戏、客户端、服务器,还是既是客户端又是服务器组件。 根据所选的值,插件将应用 -client
、-server
、-noserver
标志,并相应地管理-clientconfig
、-serverconfig
、-config
、-targetplatform
和-servertargetplatform
参数。
unrealEngine {
engineDetectionMode = automatic {
identifier = "5.4"
}
command = runAutomation {
project = "cropout/CropoutSampleProject.uproject"
execCommand = runTests {
tests = """
StartsWith:JsonConfig
Input.Triggers.Released
""".trimIndent()
}
nullRHI = true
}
additionalArguments = "-utf8output -buildmachine -unattended -noP4 -nosplash -stdout -NoCodeSign"
}
RunAll
– 这是一个非常简单的命令,能够运行所有必需的测试。RunFilter
– 借助此命令,可以执行使用一个指定筛选器(包括Engine
、Stress
、Smoke
等值)标记的测试。RunTests
– 这是最通用的命令,因为您可以使用该命令指定要运行的测试列表(包括使用StartsWith
的前缀筛选器、运行组筛选器和简单的子字符串匹配)。





使用 BuildGraph 构建 Lyra

...
...
...
...
EditorPlatforms
迭代传递给脚本的平台列表,并为每个平台构建编辑器。这部分代码的一个有趣的功能是代理节点的 Type
属性。

unreal-engine.build-graph.agent.type
:此属性可以是任意值(或由 ; 分隔的值列表)。相应的任务集随后将仅在至少有一个匹配项的代理上运行。unreal-engine.build-graph.agent.shared-dir
:前文中讨论过,为了运行分布式 BuildGraph 构建,我们需要一个共享存储位置。通过此属性,我们可以在特定代理上设置该存储位置的路径。
对于 Linux:
unreal-engine.build-graph.agent.type = CompileLinux;CookLinux;Linux
unreal-engine.build-graph.agent.shared-dir = /mnt/agent-shared-dir/intermediate
- 对于 Windows(由于某些原因,将文件夹作为单独的驱动器进行装载导致一次 Windows 系统调用失败,因此我们在配置中选择了网络共享):
unreal-engine.build-graph.agent.type = CompileWin64;CookWin64;Win64
unreal-engine.build-graph.agent.shared-dir = \\\\fs-040b8d6dab476baf1.fsx.eu-west-1.amazonaws.com\\fsx\\
$(PublishPlatform)Client.zip']" />
params {
param("env.UE_SharedDataCachePath", "/mnt/agent-shared-dir/ddc")
param("env.UE-SharedDataCachePath", "\\\\fs-040b8d6dab476baf1.fsx.eu-west-1.amazonaws.com\\fsx\\ddc")
}
steps {
unrealEngine {
id = "Unreal_Engine"
name = "Build"
engineDetectionMode = manual {
rootDir = "engine"
}
command = buildGraph {
script = "game/BuildProject.xml"
targetNode = "BuildProject"
options = """
ProjectPath=%teamcity.build.checkoutDir%/game
ProjectName=Lyra
ClientPlatforms=Linux+Win64
ServerPlatforms=Linux
EditorPlatforms=Linux+Win64
TargetConfigurations=Shipping
""".trimIndent()
mode = UnrealEngine.BuildGraphMode.Distributed
}
additionalArguments = "-utf8output -buildmachine -unattended -noP4 -nosplash -stdout -NoCodeSign"
}
}


我们可以在指定构建的相应标签页上查看已发布的工件。Linux 服务器的显示如下:

为了确保 BuildGraph 分发过程正常运行,您的构建配置应仅包含一个有效构建步骤。 目前,该插件不会以任何方式管理共享存储中生成的工件的保留期。您负责正确设置保留期。 这篇博文中的示例绝不可用于生产。您的真实场景可能会更加复杂。但这些示例可作为一个良好的起点。
立即试用!
后续计划
我们对今后的工作还有一些想法,包括:
提供更加深入的构建日志分析。
包含与 UnrealGameSync (UGS) 的集成,添加构建状态发布等功能,以及提供开箱即用的元数据服务器。
添加对构建计算机上可用 SDK 的检测,可能会使用整体解决方案。
了解 Gauntlet 自动化框架以及我们可以在其中执行的操作。
了解我们如何利用 Epic Games 推出的构建过程中的最新进展,即查看 Unreal Build Accelerator (UBA) 并通过 TeamCity 在代理上进行协调。
将插件开源。我们相信这将提高透明度,并从整体上创建更好的插件。此外,开源会带来很多乐趣。
本博文英文原作者:Vladislav Grinin
关于 TeamCity

进一步了解 TeamCity,欢迎咨询:
JetBrains中国授权合作伙伴-龙智
官网:www.shdsd.com
电话:400-666-7732
邮箱:marketing@shdsd.com