CI的介绍和意义

CI简单来说就是把一些流程化,重复性的人力操作放在机器上去执行的过程,从而节省大量用户的时间,并且保证构建得出的产物一定是主干最新的。

所以CI对于工程项目来说意义重大,当然对于Unity,UE这种游戏研发项目更是如此,因为稍微大点的项目出一次版本可能要10-20分钟,此外还有一些工程特化的功能例如AB构建,Shader变体搜集,各种本地缓存构建,甚至是性能监测报告,GI烘焙,PCG生成,场景切割等重度流程,很难想象这些不放在流水线上让机器自动执行,会浪费大家多少时间

为什么是TeamCity

对比Jenkins和TeamCity的使用感受,TeamCity有几个非常明显的优势

  • 环境搭建简单,不论是Server还是Client
  • 界面友好,美观大方
  • 流水线拓展支持更加丰富的语言类型
  • 环境变量提示友好,更不容易出错
  • Docker支持完善,方便做云服务器迁移
  • 一些其他的基础设施比Jenkins更加完善(例如自动化单元测试),使用起来更加友好

综上,TeamCity相对于Jenkins是一个更加现代化的方案,所以我们也选择TeamCity作为CI方案

搭建教程

总览

目前CI环境的搭建有这样几种方式

  • 纯本地方案:本地电脑同时做CI Server和CI Agent,最不推荐的方式,因为执行CI的时候电脑会卡顿,基本上做不了其他工作,失去了CI的意义
  • 局域网方案:一台电脑做CI Server,其余电脑注册到CI Server上作为CI Agent,个人项目推荐
  • 云端方案:云端服务器作为CI Server,其余电脑注册到CI Server作为CI Agent,工作室,公司项目推荐

其中云端方案提供了最大的操作自由度,因为云端部署的方式可以让我们对版本控制模块做Commit Hook从而自动触发流水线,更加快速的发现问题

本教程将使用Github作为版本管理库,Windows作为CI Server,MAC作为CI Agent搭建一套局域网的CI方案,云端搭建与此类似,只是需要将本地IP改为云端IP即可

TeamCity官方文档:https://www.jetbrains.com/help/teamcity/2022.04/teamcity-documentation.html

下载安装TeamCity

前往TeamCity下载:https://www.jetbrains.com/teamcity/download/ 注意选择自己需要的环境,在这里下载的TeamCity默认包含Server + Agent内容

需要注意的是,TeamCity要求Java8,请确保自己已经安装Java8并配置了环境变量

由于我们Windows作为CI Server,所以不需要安装Agent相关模块

image-20220730101553803

端口号我们填写一个不会与其他程序占用冲突的即可

image-20220730101828908

随后一路Next,等待安装完成后会打开一个网页,表示TeamCity已安装完成并正常运行,这里选定一个文件夹,TeamCity所有的数据都会保存在这里

image-20220730102927977

数据库按需求选一个

image-20220730103018342

随后有一长串谁也不会看的协议声明,直接同意,然后创建管理员账号,至此,我们Windows CI Server环境的搭建部署已经完成了,随后即可创建项目了

TeamCity的管理架构

在正式开始创建工程之前,还是有必要把TeamCity的架构讲清楚

其中Root Project为TeamCity初始化时就创建的一个Project,可以当成系统自带的一个项目管理容器,可以配置一些全局设置

具体的项目则对应我们生产开发中的一个项目,例如一个项目是连连看,另一个项目是蜘蛛纸牌

而Build Configurations则对应具体项目中一个个具体的流水线,比如连连看项目中有一个构建AB流水线,一个构建EXE流水线,一个打包图集流水线等

创建通用构建流水线Template

在正式开始创建Project之前,我们最好先创建一个通用模板Project,这个通用模板Project里的配置可以在各个不同的Project不同流水线中进行复用,从而便于管理,节约成本

当然了,我们也可以在每个具体的Project里创建模板,来进行差异化管理,这里我就直接在Root Project下创建了

通过点击右上角Administration-Projects-Root Project-Create Template来创建一个模板,这里假如我们创建了一个名为SharedBuildPipline的模板,选择其Parameters进行如下配置

image-20220730203816901

这样我们就得到了可以复用在各个流水线上的几个变量,其他的例如Build Steps,Trigger也是同理

创建Project

这里的Project代表TeamCity的一个项目,其中可以包含多个构建流水线(Build Configurations)配置

image-20220730104144361

这里我们填入项目地址,创建工程,如果目标工程是私有的,则需要前往 http://localhost:8866/admin/editProject.html?projectId=_Root&tab=oauthConnections 配置相应的鉴权信息(其实就是仓库访问权限所需要的账号密码验证啦)

当然了,其实TeamCity本身的Project并不是和我们具体的项目仓库强相关的,这里通过这种方式创建是因为它可以自动帮我们配置好VCS,你也可以选择直接创建一个空项目

image-20220730104441196

image-20220730210646152

鉴权完成后会来到项目配置界面(需要点击Show advanced options来让他显示所有选项)

配置Project

配置Proejct主体

通用配置

可以看到Default template已经为我们默认从Root Project继承了SharedBuildPipline了

image-20220730210824842

VCS配置

VCS的配置其实就是用来为不同的Build Agent实时同步更新云端仓库的,其中的参数也是一目了然,顾名思义,这里因为我们在配置局域网CI,所以其实并没有什么卵用,毕竟我们局域网IP对于Github来说是隐藏的,所以Webhook是没用的

其他配置

大家可以根据自己的需求去官方文档查看使用说明

配置Project的构建流水线

刚才我们在创建Project的时候已经顺带创建了名为MAC_Build_AB流水线,选中即可进行配置

通用配置

image-20220730141914455

VCS配置

image-20220730142933831

创建流水线节点

选中Build Steps-Add build step,可以看到TeamCity提供了非常多的脚本支持,这里我们直接选择最常用的命令行脚本

image-20220730211738681

这里以执行Unity SVC收集工作为例

1
2
3
4
5
6
7
8
9
echo "开始收集SVC"

%Projects_UnityEngine_Path% -batchmode -projectPath %Projects_UnityProject_Path% -executeMethod ET.CIHelper.CollectSVC -logFile %Projects_UnityProject_Path%/Logs/CIBuildSVC.log

cat %Projects_UnityProject_Path%/Logs/CIBuildSVC.log | while read LINE; do
echo ${LINE}
done

exit

我们还可以在面板上配置流水线节点执行的其他选项,例如执行条件

ps:我们可以通过输入 % 来呼出所有环境变量选择界面,非常贴心的功能

image-20220730212010955

配置环境变量具体内容

还记得我们前面从SharedBuildPipline继承的那几个参数吗,我们想在这个MAC_Build_AB流水线里进行自定义的话,需要来到 Parameters ,勾选Show inherited parameter,即可进行编辑

image-20220730212338804

增加CI Build Agent

现在我们项目也创建好了,流水线也搭建好了,就要开始执行构建了,想要执行构建就必须要有具体的构建机器,也就是CI Build Agent,这里我们选择同一个局域网下的MAC电脑作为CI Build Agent

选中Toolbar的Agent,然后点击下载Agent包

image-20220730213022249

将下载的zip包传给MAC电脑,进行解压,解压好之后其实就算是安装完毕了,由于我们要将MAC作为Build Agent连接到Server,我们还需要进行一些配置操作

Server IP确认

回到我们的Windows上面,运行cmd,输入ipconfig查看自己的局域网ip地址,这里假设为192.168.1.2

配置修改

来到MAC上打开解压后的文件夹,将 conf/buildAgent.dist.properties 文件重命名为 conf/buildAgent.properties

然后用文本编辑器打开文件,将 serverUrl=http://localhost:8866/ 修改为 serverUrl=http://192.168.1.2:8866/ ,当然也可以对这个配置文件中的其他内容进行修改,例如修改Agent名字之类的

随后cd到解压文件夹,执行如下命令:

1
sh bin/agent.sh start

运行结果应当如下,如果出现任何错误,说明Java环境配置不正确,请按照文章开头环境配置指引进行操作

1
2
3
4
5
6
% sh bin/agent.sh start     
Starting TeamCity build agent...
Java executable is found: '/Library/Java/JavaVirtualMachines/jdk1.8.0_341.jdk/Contents/Home/jre/bin/java'
Starting TeamCity Build Agent Launcher...
Agent home directory is /Users/UserName/TeamCity/TeamCity/buildAgent
Done [42950], see log at /Users/UserName/TeamCity/TeamCity/buildAgent/logs/teamcity-agent.log

CI Server授权认证

随后我们回到Window这边,发现Unauthorized多了一个设备,需要对他进行授权

image-20220730214919762

进行授权后,这台MAC就会注册到我们的AgentPool中,可以执行构建流水线了

执行构建流水线

通过Administration-Projects-Root project-ProjectS-MAC_Build_AB来到我们的MAC_Build_AB流水线,点击Run,选择我们刚刚注册的MAC Agent,最后点击Run Build即可

image-20220730215918174

我们可以通过BuildLog界面查看流水线执行情况

image-20220730220936628

在流水线执行完毕后,也可以直接查看构件列表

image-20220730220733083

后记

本文只是介绍TeamCity最基础的一些功能,权当抛砖引玉,还有很多实用功能大家可以按需使用,官方文档也非常的详细友好

最后还是要说一句,做好CI真的很重要,不论是个人独立游戏,还是工作室还是公司,都是如此