游戏开发中的CI/CD优化案例:知名游戏公司Gearbox使用TeamCity简化CI/CD流程

案例背景

关于Gearbox:

Gearbox 是一家美国电子游戏公司,总部位于德克萨斯州弗里斯科,靠近达拉斯。Gearbox 成立于1999年,推出过多款史上最具代表性的视频游戏,包括《半衰期》、《战火兄弟连》以及《无主之地》。

 

团队介绍:

Steve和Phillip是Gearbox 核心发布工程团队的成员。团队分布在魁北克市、蒙特利尔和弗里斯科,负责为公司的所有项目提供服务,并设置自动化来满足每个人的需求。启动一个新项目时,团队会立即在 Perforce 中建立一个仓库,并确保 TeamCity 中有一个项目与其绑定。

团队试图为每个项目分配一个人。每个发布工程师都是发布团队和游戏项目的一部分。这使团队能够响应每个项目在自动化方面的需求。

它还让发布工程师可以分享有关 TeamCity 最佳做法的知识,并在其他项目需要帮助时介入。得益于标准化的 CI/CD 做法和可重用的项目模板,他们可以快速应对任何问题。

Gearbox的技术栈:

团队以 Perforce 作为版本控制系统,使用 Unreal 作为游戏引擎。团队构建了位于Unreal 之上的 C# 脚本,TeamCity 与之交互。这一层与 CI 无关,可以处理 Unity 和 Unreal 项目。

团队还通过 Artifactory 为构建机器和存储使用AWS,对于Artifactory,他们使用的是 TeamCity JFrog 插件。

 

为什么团队决定寻找新的CI/CD解决方案

Gearbox之前使用的 CI/CD 解决方案存在一些局限性,与Perforce的集成很差。团队使用的 CI/CD 工具不提供 TeamCity 中提供的个人构建,并且在构建步骤之间传递信息也是一个挑战。

“有一个产品我们在内部使用了很长时间。我们尝试过换到不同的竞品,但都没有成功。然后,一些来自另一家游戏公司的同行说,‘我们使用过TeamCity。’我们调查了一下,发现 TeamCity 可以解决我们的很多问题。” 

— Phillip Peterson,高级发布工程师

使用TeamCity 简化构建步骤连接:

在 Gearbox 使用的一个竞品中,在两个构建步骤之间建立连接的过程非常繁琐。例如,有一个构建步骤会产生一个工件,团队想将工件的名称传递给后续作业,但在两个构建步骤之间进行对话就是一个巨大的障碍。相比之下,这在 TeamCity 中极其简单。

让团队感到苦恼的另一件事是在构建步骤之间传递构建结果,而 TeamCity 提供的依赖项途径解决了这一问题。

新CI/CD解决方案的选择标准

跨项目应用批量更改:

在新的 CI/CD 解决方案中,团队主要关注两个方面。其一是能否轻松跨项目应用批量更改。此前,团队需要从头开始每个项目。随着项目数量的增加,团队开始寻找让他们能够复制粘贴项目设置、更改名称和运行项目的模板。

人性化 UI:

第二个要求是人性化 UI,让最终用户和管理员能够轻松使用新的 CI/CD 工具。

“一个竞品的 UI 非常不友好。在 CI/CD 系统里,我应该感觉很踏实,做什么都不会坏。我认为 TeamCity 的 UI 非常出色。浏览的时候,你会相信系统运作良好。”

— Steve Fortier,首席发布工程师

 

TeamCity 精致的 UI 使其非常容易被接受。在团队证明概念可行后,一番展示就很快说服其他人转向新的 CI/CD 解决方案。

访问管理:

Gearbox 选择新 CI/CD 解决方案的另一个因素是访问管理及其在 TeamCity 中的运作方式。团队当时正在寻找一种按项目编辑用户访问权限的方法。

在 TeamCity 中,您可以创建层次结构,人员可以在层次结构中获得对项目的访问权限,访问所有子项目。这对 Gearbox 产生了巨大的影响。

在TeamCity Cloud与On-Premises之间选择:

在团队听说 TeamCity 后,他们最初尝试的是本地部署版本。不过,TeamCity Cloud 的选项让 Gearbox 的 IT 部门非常高兴,因为他们知道唯一需要做的就是设置身份验证。这也让过渡速度远比此前估计的本地部署设置速度快得多。

TeamCity Cloud 用户可以在 JetBrains 托管和自托管构建代理之间选择。Gearbox 团队使用自托管代理,能够完全自定义运行构建的环境。

 

过渡过程

过渡到 TeamCity 时,团队开始从头开始设置所有项目。不过,他们故意让旧构建脚本与 CI 系统无关。这意味着虽然是在 TeamCity 中设置大量新项目,他们也只是将旧系统中的现有命令复制粘贴到其中。

经过几次讨论如何组织项目的研讨会后,团队得以在短短 6 周内从旧的 CI 解决方案转移到 TeamCity。

CI/CD指标

目前,Gearbox 在TeamCity Cloud 中拥有 340 个提交者和 138 个项目。

团队使用托管在自己的 AWS 账户中的代理以及 TeamCity 的云配置文件。根据构建的需要,TeamCity 会自动从团队使用的“base”、“high”、“mega”或“GPU”实例中进行选择。

过渡期间,Gearbox 采用了他们为之前的 CI/CD 解决方案启动的 Amazon Machine Image (AMI),并安装了 TeamCity。如此一来,Gearbox 只需维护一个 AMI,因为旧系统和新系统都使用同一个 AMI。这使迁移过程更加容易。

TeamCity中的构建链

Gearbox 在整个 CI/CD 流程中广泛使用构建链。Unreal 流程经历 5 个阶段:编译、烘焙、暂存、打包和发布。

 Gearbox 构建链示例

如果一款游戏将在不到 12 小时内发布,但在链中的某个位置,一个被填满的卷停止了进程,那么,扩展卷再重新开始是不现实的,时间完全不够。

在 TeamCity 的帮助下,Gearbox 团队能够将这些部分分解成自己的构建。这样,如果在构建流程中卷已满并且必须扩展,那么构建会失败,但团队可以快速处理。他们可以从中断的地方重新启动流程,重新挂载该持久卷,然后从原来的地方继续。这要归功于 TeamCity 的内置构建链优化,使用快照依赖项时,重用构建会对其起到促进作用。

Gearbox的测试流程:从本地到集中的动态编排

在 Gearbox,当开发者开始运行本地测试时,TeamCity 可以发挥更多作用,集中运行整套测试。CI/CD 系统还可以在不同类型的机器上动态编排这些测试运行,在给定时刻根据需要启动尽可能多的机器,并在过后将其关闭以优化资源。

Gearbox使用TeamCity 简化项目设置和资源共享

轻松共享知识:

TeamCity 帮助 Gearbox 解决的最大挑战之一是启动新项目。在其他方案中,每个项目都必须从头开始。随着项目的发展,它们会彼此偏离,变得相当不同,让公司在每个项目上都需要一个主题专家。这使团队之间难以共享知识,导致开发过程中出现瓶颈,并增加出错和不一致的风险。

更高的生产力:

自从团队采用 TeamCity 作为 CI/CD 解决方案后,事情就简单多了。得益于模板,团队可以跨项目共享资源。只要熟悉一个项目,也就熟悉了所有项目。这有助于团队提高生产力并专注于高效开发。

在EC2实例方面显著节省资源:

在Gearbox之前的CI解决方案中,每次构建都会构建编辑器,这可能需要长达一个小时的时间。现在,团队可以将该步骤整合到自己的构建中,然后在各处重用。这帮助团队在 EC2 实例方面节省了大量资源,因为他们不必再重复编译相同的东西。

Gearbox的配置即代码:

当Gearbox开始使用Kotlin进行项目配置时,团队充满期待。即使是那些对 Kotlin 经验不多的人也能够很快理解并开始使用。“的确有一个学习曲线,但总的来说,氛围是积极的。”Steve Fortier 说。

目前,需要在一个项目中更改内容时,团队会使用UI。如果是更改特定构建配置在多个项目中的工作方式,团队将使用 Kotlin。对于Gearbox来说,灵活使用这种混合方法进行项目配置是 TeamCity 的另一大亮点。

Gearbox的未来计划

Gearbox 的目标是通过实现个人构建来增强对 TeamCity 的使用,提升提交的可靠度并为 QA 测试提供有效构建。团队还希望提高构建速度、缩短构建链并最大程度地减少失败。

团队目前跟踪服务器性能、构建持续时间和构建失败,但计划包括更精细的指标,例如工件大小和队列持续时间。他们的目标是利用 TeamCity 的一系列可自定义功能建立更高效的 CI 流程,节省时间并确保构建的可靠性。

结论

切换到 TeamCity Cloud 在多个方面改进了 Gearbox 的 CI/CD 做法。

  • 易于采用的特性使团队能够在短短 6 周内从之前的 CI 解决方案迁移到 TeamCity。

  • TeamCity的内置 Perforce 集成帮助团队简化了整个 CI/CD 流程,并节省了团队原本要花在创建集成变通方案上的时间。

  • 借助 TeamCity 的项目模板,团队现在可以按照标准化做法更快、更轻松地启动新项目。

  • 得益于 TeamCity 的云解决方案和人性化 UI,团队发现维护项目比以前容易得多。

TeamCity 还帮助 Gearbox 在 EC2 实例方面实现了显著节省,因为使用依赖项可以避免多次重复编译。

龙智是JetBrains、Perforce及JFrog的授权合作伙伴,对于案例中涉及的如下开发工具,提供本地化的销售和技术支持服务:

  • CI/CD工具:TeamCity
  • 版本控制系统:Perforce P4
  • 制品库管理:JFrog Artifactory 

官网:www.shdsd.com  |  电话:400-666-7732  |  邮箱:marketing@shdsd.com
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视觉slam--三维刚体运动

线性代数 外积与矩阵乘法的等价性 欧拉角的奇异性--万向死锁 现象 第二个轴旋转度,会导致第三个旋转轴和恶原始坐标轴的第一个旋转轴重合,导致第一次旋转与第三次旋转都使用了同一个轴进行旋转,也就是本质上旋转三次,但是只在两个…

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…

R语言速释制剂QBD解决方案之一

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…

“详规一张图”——新加坡土地利用数据

在城市规划和土地管理领域,精确且详尽的空间数据是进行有效决策的基石。随着地理信息系统(GIS)技术的发展,我们能够以前所未有的精度和细节来捕捉、分析和展示土地利用信息。这不仅提升了数据的质量和可靠性,还使得城市…

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…

MySQL自定义函数零基础学习教程

1. 引言 想象一下,你在用计算器做数学题。每次计算"圆形面积"时,你都要输入:3.14 半径 半径。如果能把这个计算步骤保存起来,下次只要输入半径就自动算出面积,那该多方便! MySQL自定义函数就…

八股---7.JVM

1. JVM组成 1.1 JVM由哪些部分组成?运行流程? 难易程度:☆☆☆ 出现频率:☆☆☆☆ Java Virtual Machine:Java 虚拟机,Java程序的运行环境(java二进制字节码的运行环境)好处:一次编写,到处运行;自动内存管理,垃圾回收机制程序运行之前,需要先通过编译器将…

企业级AI-DevOps工具链的构成及实现方案

企业级AI-DevOps工具链的构成及实现方案 DevOps在AI大模型研发中的重要性及应用背景一、场景驱动的AI产品研发运营机制二、AI-DevOps生产线建设三、基于DevOps的AI大模型研发机制四、基于DevOps的智能体场景研发机制五、场景驱动的应用评估分析机制 DevOps在AI大模型研发中的重…

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…

在 Win10 上 WSL 安装 Debian 12 后,Linux 如何启动 SMTP 服务?

在 WSL 的 Debian 12 中启动 SMTP 服务&#xff08;以 Postfix 为例&#xff09;&#xff0c;请按以下步骤操作&#xff1a; 1. 安装 Postfix sudo apt update sudo apt install postfix mailutils安装过程中会弹出配置窗口&#xff1a; General type of mail configuration&a…

树莓派超全系列教程文档--(59)树莓派摄像头rpicam-apps

这里写目录标题 rpicam-apps libcamera 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 rpicam-apps 树莓派操作系统 Bookworm 将相机捕捉应用程序从 libcamera-\* 重命名为 rpicam-*。符号链接允许用户暂时使用旧名称。尽快采用新的应用程序名称…

【数据结构】图论最短路径算法深度解析:从BFS基础到全算法综述​

最短路径 导读一、最短路径1.1 单源最短路径1.2 各顶点间的最短路径1.3 最短路径算法 二、BFS算法结语内容回顾下一篇预告&#xff1a;挑战带权最短路径&#xff01; 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 欢迎继续探索图算法的…

中国政务数据安全建设细化及市场需求分析

(基于新《政务数据共享条例》及相关法规) 一、引言 近年来,中国政府高度重视数字政府建设和数据要素市场化配置改革。《政务数据共享条例》(以下简称“《共享条例》”)的发布,与《中华人民共和国数据安全法》(以下简称“《数据安全法》”)、《中华人民共和国个人信息…

Linux信号保存与处理机制详解

Linux信号的保存与处理涉及多个关键机制&#xff0c;以下是详细的总结&#xff1a; 1. 信号的保存 进程描述符&#xff08;task_struct&#xff09;&#xff1a;每个进程的PCB中包含信号相关信息。 pending信号集&#xff1a;记录已到达但未处理的信号&#xff08;未决信号&a…

【Redis】笔记|第10节|京东HotKey实现多级缓存架构

缓存架构 京东HotKey架构 代码结构 代码详情 功能点&#xff1a;&#xff08;如代码有错误&#xff0c;欢迎讨论纠正&#xff09; 多级缓存&#xff0c;先查HotKey缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新…

php apache构建 Web 服务器

虚拟机配置流程winsever2016配置Apache、Mysql、php_windows server 2016配置web服务器-CSDN博客 PHP 和 Apache 通过 ​​模块化协作​​ 共同构建 Web 服务器&#xff0c;以下是它们的交互机制和工作流程&#xff1a; ​​一、核心组件分工​​ 组件角色​​Apache​​Web …

二分查找排序讲解

一、二分查找&#xff08;Binary Search&#xff09; 核心思想&#xff1a; 前提&#xff1a;数组必须是 有序的&#xff08;比如从小到大排列&#xff09;。目标&#xff1a;在数组中快速找到某个数&#xff08;比如找 7&#xff09;。方法&#xff1a;每次排除一半的数&…

【Redis实战:缓存与消息队列的应用】

在现代互联网开发中&#xff0c;Redis 作为一款高性能的内存数据库&#xff0c;广泛应用于缓存和消息队列等场景。本文将深入探讨 Redis 在这两个领域的应用&#xff0c;并通过代码示例比较两个流行的框架&#xff08;Redis 和 RabbitMQ&#xff09;的特点与适用场景&#xff0…