当前位置: 首页 > article >正文

游戏开发中的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
 

相关文章:

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

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

Linux --TCP协议实现简单的网络通信(中英翻译)

一、什么是TCP协议 1.1 、TCP是传输层的协议,TCP需要连接,TCP是一种可靠性传输协议,TCP是面向字节流的传输协议; 二、TCPserver端的搭建 2.1、我们最终好实现的效果是 客户端在任何时候都能连接到服务端,然后向服务…...

LlamaIndex 工作流简介以及基础工作流

什么是工作流? 工作流是一种由事件驱动、基于步骤的应用程序执行流程控制方式。 你的应用程序被划分为多个称为“步骤(Steps)”的部分,这些步骤由“事件(Events)”触发,并且它们自身也会发出事…...

如何利用Elastic Stack(ELK)进行安全日志分析

在以下文章中,我将解释如何使用Elastic Stack(ELK)进行安全日志分析,以提高安全性和监控网络活动。ELK是一个功能强大的开源日志管理和分析平台,由Elasticsearch、Logstash和Kibana组成,适用于各种用例&…...

创客匠人:以 AI 利器赋能创始人 IP 打造,加速知识变现新路径

在知识付费与个人 IP 崛起的时代,创客匠人作为行业领先的技术服务商,正通过 AI 工具重构创始人 IP 打造与知识变现的生态。其推出的三大 AI 利器 ——AI 销售信、免训数字人、AI 智能客服,精准解决 IP 运营中的核心痛点。 以 AI 销售信为例&…...

Opencv中的copyto函数

一.OpenCV中copyto函数详解 copyto()是 OpenCV 中用于图像复制和融合的核心函数,支持灵活的数据复制和掩模(Mask)操作,其功能和使用方法如下: 1. 核心功能 基础复制:将源图像&…...

TeamCity Agent 配置完整教程(配合 Docker Compose 快速部署)

在《使用 Docker Compose 从零部署 TeamCity PostgreSQL(详细新手教程)》中,我们成功部署了 TeamCity Server 和数据库服务。但要真正运行构建任务,还需要至少一个 Build Agent(构建代理)。 本教程将继续…...

基于深度强化学习的Scrapy-Redis分布式爬虫动态调度策略研究

在大数据时代,网络数据的采集与分析变得至关重要,分布式爬虫作为高效获取海量数据的工具,被广泛应用于各类场景。然而,传统的爬虫调度策略在面对复杂多变的网络环境和动态的抓取需求时,往往存在效率低下、资源浪费等问…...

在 Ubuntu 24.04 LTS 上安装 Jenkins 并配置全局工具(Git、JDK、Maven)

在 Ubuntu 24.04 LTS 上安装 Jenkins 并配置全局工具(Git、JDK、Maven) Jenkins 是一款开源的持续集成和持续交付(CI/CD)工具,在 DevOps 实践中有着广泛的应用。本文将手把手带你在 Ubuntu 24.04 LTS 系统中完成 Jenkins 的安装,并配置所需的全局工具:Git、JDK 和 Maven…...

Tika Server:企业级文档内容解析的轻量级服务化方案

目录 Tika Server:企业级文档内容解析的轻量级服务化方案 一、什么是 Tika Server? 二、Tika Server 的功能特点 1. 多种文档格式支持 2. 提取结构化信息 3. RESTful 接口设计 三、是否开源?是否支持私有化部署? 四、部署…...

LMG1020YFFR 电子元器件详解

LMG1020YFFR 电子元器件详解 基本概述 LMG1020YFFR是德州仪器(TI)生产的一款高性能、低侧栅极驱动器,属于其GaN(氮化镓)功率器件驱动产品系列。 主要功能特性 驱动能力: 峰值输出电流:5A/-5A 可驱动GaN FETs、SiC MOSFETs和高速硅MOSFETs…...

防爆型断链保护器的应用场景有哪些?

​ ​防爆型断链保护器是一种用于防止链条断裂导致设备损坏或安全事故的装置,尤其适用于存在爆炸风险的工业环境。以下是其主要应用场景: ​ ​1.石油化工行业 在石油化工厂、炼油厂等场所,防爆型断链保护器可用于保护输送设备&#xf…...

leetcode_206 反转链表

1. 题意 原地反转链表,非常经典的一道题。 2. 解决 2.1 非递归 非递归的比较好理解;链表需要维护前驱和后继两个信息,当我们要更改后继时,先要把原来的后继先存起来。 /*** Definition for singly-linked list.* struct List…...

OPenCV CUDA模块光流------高效地执行光流估计的类BroxOpticalFlow

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::BroxOpticalFlow 是 OpenCV CUDA 模块中实现Brox光流算法的类。该类用于在 GPU 上高效地计算两帧图像之间的稠密光流(Dens…...

高考:如何合理选择学科、专业以及职业

如何合理选择学科、专业以及职业 一、自我认知:明确自身兴趣与优势(一)兴趣探索(二)能力评估(三)价值观与目标 二、外部调研:深入了解学科、专业与职业(一)学…...

K8S认证|CKS题库+答案| 3. 默认网络策略

目录 3. 默认网络策略 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、官网找模板 3)、按照题目要求创建networkpolicy 4)、应用networkpolicy 5)、检查策略 3. 默认网络策略…...

HTTP、WebSocket、SSE 对比

特性HTTPWebSocketSSE (Server-Sent Events)通信模式请求-响应(单向)全双工双向通信服务器到客户端的单向通信连接方式短连接(默认)长连接长连接协议基础TCP(HTTP/1.1, HTTP/2)基于HTTP升级基于HTTP数据格式…...

Linux编程:1、文件编程

一、Linux 文件编程与 C 语言文件编程的区别 特性C 语言 I/O 库函数Linux 文件编程(系统调用)实现层面用户空间(glibc 库)内核空间(系统调用)跨平台性跨平台(Windows/Linux)仅限 Li…...

Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁

Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁...

【Spark征服之路-2.3-Spark运行架构】

运行架构 Spark 框架的核心是一个计算引擎,整体来说,它采用了标准 master-slave 的结构。 如下图所示,它展示了一个 Spark 执行时的基本结构。图形中的 Driver 表示 master,负责管理整个集群中的作业任务调度。图形中的 Executor …...

PART 6 树莓派小车+QT (TCP控制)

1. 树莓派作为服务器的程序 (1)服务器tcp_server_socket程序 可以实现小车前进、后退、左转、右转、加减速(可能不行) carMoveControl.py import RPi.GPIO as GPIO import time import tty,sys,select,termios import socket…...

软珊瑚成分 CI-A:靶向口腔癌细胞的 “氧化利剑” 与 ERK 密码

在生命科学探索的浩瀚星海中,癌症研究始终是最为耀眼却又充满挑战的领域之一。口腔癌,作为全球范围内日益严峻的公共健康问题,尤其在中南亚、美拉尼西亚以及我国台湾地区,其发病率和死亡率持续攀升,如同隐藏在黑暗中的…...

Cilium动手实验室: 精通之旅---4.Cilium Gateway API - Lab

Cilium动手实验室: 精通之旅---4.Cilium Gateway API - Lab 1. 环境准备2. API 网关--HTTP2.1 部署应用2.2 部署网关2.3 HTTP路径匹配2.4 HTTP头匹配 3. API网关--HTTPS3.1 创建TLS证书和私钥3.2 部署HTTPS网关3.3 HTTPS请求测试 4. API网关--TLS 路由4.1 部署应用4.2 部署网关…...

【芯片设计- RTL 数字逻辑设计入门 4.2 -- 组合逻辑赋值 + 时序逻辑状态保持】

文章目录 Overview原语句分析变量含义假设(根据命名推测)状态更新逻辑详解状态转移逻辑举个实际例子小结Overview 本文将详细介绍 verilog rtl 中 assign reg_halt_mode_nx = halt_taken | (reg_halt_mode & ~halt_return);的作用,以及这里为何要使用 reg_halt_mode,…...

如何使用索引和条件批量更改Series数据

视频演示 如何通过索引与布尔条件修改 pandas Series?实操演示来了 一、前言:掌握Series数据修改是数据处理的基础 在使用Python进行数据分析时,Pandas库的Series对象是最常用的结构之一。在上一个视频中我们已经学习了如何创建Series对象&a…...

Java转Go日记(六十):gin其他常用知识

1. 日志文件 package mainimport ("io""os""github.com/gin-gonic/gin" )func main() {gin.DisableConsoleColor()// Logging to a file.f, _ : os.Create("gin.log")gin.DefaultWriter io.MultiWriter(f)// 如果需要同时将日志写入…...

89.实现添加收藏的功能的后端实现

实现完查看收藏列表之后,实现的是添加收藏的功能 我的设想是:在对话界面中,如果用户认为AI的回答非常好,可以通过点击该回答对应的气泡中的图标,对该内容进行添加 所以后端实现为: service类中添加&…...

v1.0.1版本更新·2025年5月22日发布-优雅草星云物联网AI智控系统

v1.0.1版本更新2025年5月22日发布-优雅草星云物联网AI智控系统 开源地址 星云智控官网: 优雅草星云物联网AI智控软件-移动端vue: 优雅草星云物联网AI智控软件-移动端vue 星云智控PC端开源: 优雅草星云物联网AI智控软件-PC端vue: 优雅草星云物联网AI…...

如何创造出一种不同于程序语言的人与机器自然交互语言?

人机交互自然语言通过模拟人类日常交流方式,使机器能够理解并响应人类的自然表达,从而打破编程语言的复杂性壁垒,极大地提升人机协同的效率和自然性,让机器更好地融入人类的工作与生活场景。创造一种通用的人与机器自然交互语言是…...

宝塔think PHP8 安装使用FFmpeg 视频上传

宝塔think PHP8 安装使用FFmpeg 一、 安装think PHP8二、安装 FFmpeg1,登录到宝塔面板。2,进入“软件商店”。3,搜索“FFmpeg”。4,选择版本点击安装。5,检查 FFmpeg 是否安装成功6, 在 ThinkPHP 8 中使用 …...