jenkins打包环境搭建的一些坑点

最近为了提高版本更新的效率,搭建了jenkins环境,因为我们现在比较多的海外版本,更新频率越来越高。

导致我们前端花费了大量的时间在导UI和版本更新上,而且这些基本上都是一些重复性的工作。由于一些历史原因,每次策划的一些UI修改和调整都需要前端去导UI,然后提交SVN,测试和策划更新下来才能看到效果,非常麻烦。

所以特地花了2天的时间去做这件事,其实本身我们的框架导UI和打包都挺方便的,但是现在海外版本多,还是会比较复杂,而且人工操作容易出错。

jenkins相信做游戏的都不陌生,搭建起来其实也比较简单,去官网下载一个安装包即可,但是要适配自己的项目情况,配置一下参数是比较麻烦的,特别是要做一些自动化的操作,比如复制文件自动提交SVN等。

最麻烦的是在写批处理脚本的时候遇到的一些在jenkins上比较蛋疼的问题:

一、调用unity函数打AssetBundle的过程中发现老是会出现AB还没打完jenkins任务就执行完成了,也不是执行失败,就是提前结束了,这样导致C#里面一些自动拷贝文件的函数都没法执行下去,因为UI都没有完全导完。这个问题也是困扰了我很久,因为我特地试过脚本在BAT文件上执行是没问题的,但是就是在jenkins执行的时候出问题,后面实在是没办法就,写了一个循环每隔5秒钟去检测一次导出的LOG判断UI有没有导完,在C#导出完成的时候输入一段完成的LOG信息。

批处理调用U3D导AB的命令如下:start %UNITY_PATH% -projectPath %PROJ_PATH% -quit -batchmode -logFile %LOG_PATH% -executeMethod JenkinsExportManager.ExportHotFixOnlyJenkins

其中%LOG_PATH%即是导UI过程中unity输出的LOG路径(自己定义),在这个命令后执行循环检测:

:begin
@echo off
ping /n 5 127.0.0.1>nul
echo on
echo 正在导出,请稍后!
findstr /i /c:”export end” “%LOG_PATH%” >nul 2>nul && goto end || goto begin
:end

循环查找LOG中的“export end”字符串,如果有则UI导出完成了,可以继续往下执行,不然jenkins是无法判断导出进度的。

二、第2个坑点是我们想Jenkins上导出的UI复制到FTP共享盘上,这样策划和测试都可以用,因为Jenkins是运行在打包机上的,这台机器的配置也比较高,打包和导UI的效率比较高,他们可以使用Jenkins导出UI到FTP上,然后再从FTP复制到本地,查看UI的效果,确定没有问题了再提交SVN,这样既实现了人人可以用,又保证了安全性。

但是就在这个地方又卡了我好久,因为在Jenkins上死活识别不了共享盘的路径,明明已经做了共享盘的映射,但就是识别不了,我直接在CMD上执行是可以识别的,但是一放到Jenkins上就不行了,最后在Jenkins上执行了一次享盘映射的命令:net use X: \172.16.20.35\ftp /y 才识别上,真是奇葩。

三、第3个坑点是在Jenkins上是可以设置参数然后在命令中获取的,但是如果在设置的参数判断里面定义set命令然后给变量赋值是不起作用的,这就很奇怪了。本来是想利用不同的参数值设置不同的路径实现一些自动化操作,结果导致我只能把绝对路径全部写上。

比如在Jenkins上设置了一个region参数用来选择地区,然后在命令上做如下判断:

if "%region%"=="国内" (
   set NEWPATH=C:\ui
)

结果发现变量%NEWPATH%是空的,根本赋值不了,在if外面试可以赋值的。

对于这个问题,暂时还没有找到别的方法,只能是写死绝对路径不在Jenkins参数的判断里面去赋值。

四、第4个坑点和第一个类似,也是命令还没执行完成Jenkins就结束任务了,本来是想在导出UI完成的时候,复制一些文件到某个地方的,但是经常发现文件还没复制完成只复制了部分文件Jenkins就结束任务了。对于这个问题我也只能使用命令:

@echo off
ping /n 10 127.0.0.1>nul
echo on

来达到延迟的效果了,10代表延迟10秒才往后执行。

最终配置效果如下:

从此再也不用我们前端导UI啦!前端是万能的。