一键部署游戏idc测试环境【jenkins+tcm+runshell】

发表于2015-09-17
评论1 2.6k浏览

手机游戏的idc测试环境,有各种各样的需求,比较常见的有:

1、 测试idc。测试同学用于测试版本和验证bug修复,还需要能修改逻辑时间,来测试登录奖励、排行榜周或月度结算之类的功能。

2、  开发idc。手游客户端无法访问devnet,需要通过外网访问此idc环境,进行功能调试。

3、  苹果审核服。一套稳定的审核环境,用于苹果审核人员体验游戏的提交版本。

4、  预发布环境。此环境的db结构、资源、配置与现网基本保持一致,用于服务器发布前的验证。

5、  策划idc。策划专用环境,可以加载策划配置并reload程序,让策划同学能快速修改数值并验证。

6、  压力测试idc。服务器压力测试专用环境。

 

1. 各种各样的测试环境 

上述环境都是由后台开发人员来维护,在代码或资源更新时,需要随时去响应和处理。但是,如果能够一键自动化完成部署的话,将相应ci页面开放给对应环境的使用同学,那么将够极大地节省后台开发同学的时间,提高研发效率。

下面来看下一键部署的理想执行流程:

理想的CI流程

上面的“理想”化CI系统的实现,有几个问题需要解决。

1. 编译机是选择devnet的还是idc的?

按照公司安全策略的要求,只能从devnet拉取svn代码。如果想绕过这个限制,需要GM特批,而且举证流程非常复杂,建议还是算了吧。 

2. 如何将devnet编译后的bin和资源,推送到idc服务器上?

tlinux默认安装了rsync/rsyncdidc服务器上启动rsyncddevnet通过rsync推送,非常方便,推荐使用。

3.devnet机器如何操作idc程序的启停、reload

    这个问题通常有4种解决方案:

    a)ssh做免密认证,然后可以执行远程机器的任何命令。这个本来是最常规、最理想的解决防范,可是不符合公司的安全策略,而且要开放devnet访问idcssh端口(36000),基本也是不可能,此路不通。

    b)crontab +监控文件的方式。通过从devnetrsync推送restart.txtreload.txt文件到idc服务器的方式,让idc机器的crontab检测并执行restartreload操作。这个是很多项目组在使用的方法,酷跑早期也是这么来实现。不过问题也很明显,这是异步实现方案,操作的最终成功与否与CI过程无关,也无法通过CI页面来提示哪里出了问题,而且实时性不高。

    c)项目组自己写agentserver,分布部署在devnet ci机器和idc服务器上。server的功能也比较简单,接收命令并执行本地的脚本或者程序。缺点是需要花时间造下轮子,而且需要做额外部署。

    d)和方案c类似,也是agent方案。不过可以不用造轮子,使用现有的技术。

        1)开源解决方案,例如saltstack,但需要一些学习成本去使用,而且功能比较重和复杂,有点杀鸡用牛刀的感觉。

        2)公司的游戏后台部署基本都在使用tcm系统,而tcm本身就是一套分布式部署的agent/server解决方案。利用runshell特性和tcm命令,完成可以完成,而且是现成的部署。这个比较下来算是最优方案了,酷跑项目组选择的就是这个方案,详细的实现见后文。 

    下面以《天天酷跑》项目的后台CI系统搭建过程,来演示如何实现图2看似简单,实则比想象中麻烦很多的“理想”CI系统。

安装基本软件

2中提到,公司安全策略要求必须从devnet环境下,才能从svn拉代码。所以,首先需要申请一台devnet服务器来部署。接下来按照编译系统的需要,安装需要的各种软件,以及依赖的软件,基本都是体力活。酷跑ci环境安装的主要软件如下:

expat-2.0.1

apr-1.4.5

apr-util-1.3.9

neon-0.29.6

openssl-1.0.0d

SQLite3.7.11

sqlite-amalgamation-3071501.zip

subversion-1.7.0 

ccache-3.2.1

cmake-3.2.2

jre1.7.0_10

jenkins.war(1.617)

启动jenkins

Jenkins启动比较简单,去官网下载最新的jenkins.war ,执行“nohup java -jar ./jenkins.war --httpPort=80&”命令就可以后台运行jenkins服务了(提示:监听私有端口可能需要root权限)。

配置CI项目

Tips: 1.617版本的jenkins.war,自带的subversion插件支持1.4 – 1.7版本的subversion,但是插件默认的配置认为代码库是1.4版本的,如果提示代码库格式不兼容,可以将“系统管理”-》“系统设置”-》“Subversion-》“Subversion Workspace Version”字段,选成当前安装的Subversion版本。

下面开始演示下如何配置jenkins进行项目的编译和发布。

1. 进入jenkins主页。假设上面的devnet机器内网ipa.b.c.d,那么通过http://a.b.c.d就可以进入主页。如果端口不是80端口,那么url要带上端口号,格式为http://a.b.c.d:port

2. 新建一个编译项目。

3. 新建jenkins项目

 

3.添加编译选项

4. 编译选项

 

4.配置svn地址

5. 配置svn地址

 

5.自定义编译和部署脚本

6. 编译脚本

 

上图中脚本实现了项目的编译、部署、idc脚本执行和server进程启停,下面逐步来分解。

    a) 编译。这个比较简单,调用项目自己的编译脚本就可以了。

    b) 部署。通过rsync实现,开通idc服务器上的rsyncd端口后,就可以推送文件过去了。

    c) 远程脚本执行。这个需要用到tcm系统的runshell特性。

       1)修改项目的tcmcenter.xml配置,加入一个flagrunshell的虚拟进程。

 

    2)修改proc_deploy.xml文件,将runshell虚拟经常部署到每台idc机器上。

    3)修改tcmconsole配置文件模板,用脚本替换其中的tcmcenter服务地址。

tcmconsole模板配置文件(tcmconsole_template.xml

替换地址脚本如下:

addr="10.217.139.217:8821"

sed "s/SvrAddr/$addr/g" /tmp/tcmconsole_template.xml > tcmconsole.xml

    4)idc服务器的部署目录里,放入要执行的脚本。例如酷跑的在程序根目录,放入run/bin/runshell/config.sh脚本用来生成程序需要的配置文件。当然,脚本可以执行任何需要的命令。

    5)远程调用runshell脚本。脚本的名字就是runshell命令的参数。

./run/bin/tcmconsole/tcmconsole --no-bus --conf-file=./tcmconsole.xml --cmd="runshell *.*.*.* ./config.sh" --timeout 900 start

    6)远程执行tcm命令来启停/reload程序。

    #restart

    ./run/bin/tcmconsole/tcmconsole --no-bus --conf-file=./tcmconsole.xml --cmd="restart *.*.*.*" --timeout 900 start

    7)清理工作。删除临时tcmconsole.xml配置文件。

    #clean files

    rm -f tcmconsole*.xml

编译加速

       CI系统中最耗时的部分,通常是整个项目的编译过程。随着项目的发展,代码量越来越大,依赖也越来越大,编译时间可能会长到令人发指的地步。

酷跑项目组通过一些方案来加速编译,编译系统用的是cmake实现。因为本文的重点不在此部分,所以这里稍微列一下,并最后给出参考链接,有兴趣的同学可以自行研究。

       主要的工具有:

        ccache。全称是compiler cache,通过缓存编译器之前的编译结果来加速。

        distcc。开源的分布式编译系统。

        cotirecmake系统的预编译头技术实现。

总结

       本文实现了一键CI部署游戏idc测试环境的方法,核心点是如何利用tcm系统的runshell工具,去打通devnetidc环境的自定义命令执行,结合项目已有的编译系统,完成CI过程。

参考链接: 

后台构建利器 ccachedistcc介绍

http://km.oa.com/group/11893/articles/show/117448 

TCM进程管理实战系列】之 Runshell

http://km.oa.com/group/1200/articles/show/145242 

cotire

http://www.cppblog.com/yangsf5/archive/2013/04/23/199658.aspx?opt=admin

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引