通过Jenkins搭配Unity3d + luaframework实现网页端自动化打包
阅前提示
本文讲述内容为在实现unity3d+luaframework一键打包后,如何与jenkins整合,进行自动化打包,如果您不知道如何做到一键打包,请参阅我的另一篇文章:
https://www.cnblogs.com/CraneInForest/p/9496236.html
如果您对unity3d,luaframework不熟悉,则不建议阅读.
上一篇我们讲了Unity3D + luaframework如何做到一键打包,但那只是在编译调试时有用,并不能彻底解放我们的电脑和双手,接下来我们就来看看怎么和jenkins结合做到真正的自动化打包.
以下操作都是在windows10操作系统下完成,确保你的电脑环境已经安装好git,python,unity3d和luaframework,并且已经搭建好luaframework一键打包环境.
如何安装jenkins
进入jenkins官网:https://jenkins.io/
在首页点击Download进行下载安装.
安装完毕后在浏览器输入地址http://localhost:8080/jenkins打开jenkins主页
首次登陆会要求输入在安装时自动生成的密码,以确保是通过管理员来进行安装的,密码存放在如下图所示的initialAdminPassword文件中,使用记事本即可打开,把密码贴到输入框中继续下一步
通过密码验证后会要求输入管理员信息:
接下来就可以真正进入Jenkins主界面了:
如何跟项目进行关联
点击开始创建一个新任务
在打开的页面中输入任务的名称,这里我们输入"luaframework"
任务类型我们选择"构建一个自由风格的软件项目"
点击确定后继续
在新打开的页面中选中General选项卡
在General选项卡页面下拉到底部,在构建那一栏选择"增加构建步骤",并选中"执行windows批处理命令"
接着在命令栏里输入命令:
cd /d D:\luaframework
git pull
git submodule update --init --recursive
python package.py %clearWrapFiles% %buildResource%
这段命令的功能如下:
- 1.切换到项目所在文件夹
- 2.用git拉取最新的工程
- 3.用git拉取最新的子模块(如果有子模块的话)
- 4.调用python脚本package.py并传入指定的参数进行打包
使用python作为嫁接而不是完全直接用windows批处理命令是因为我们需要在后续的操作里面执行一些稍微复杂的的逻辑,比如根据传递的参数调用不同的打包函数,以及显示日志等等功能,使用python更方便一些
通过上面的命令可以发现,我们传入了clearWrapFiles和buildResource两个参数,传入的格式是用两个%组合,下面对这两个参数进行讲解:
- clearWrapFiles 是否重新生成lua接口文件(修改了c#接口文件后需要勾上)
- buildResource 是否重新打包assetbundle文件
接下来我们需要在jenkins里面进行参数的配置:
在General选项卡中勾选参数化构建过程,添加两个布尔型参数,如下图:
最后点击应用和保存
接下来我们来看看package.py里面的内容:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import sys
unity_exe='"C:\Program Files\Unity5.5.6f1\Editor\Unity.exe"'
keystore= 'D:/keystore/luaframework.keystore'
code_path = os.getcwd()
buildfunction = ""
if sys.argv[1] == "true":
buildfunction = "AutoBuild.clearAndBuild"
elif sys.argv[2] == "true":
buildfunction = "AutoBuild.build"
else:
print("nothing happen.")
cmd = unity_exe + " -projectPath " + code_path + " -executeMethod " + buildfunction + " -batchmode -logFile" + "log.txt" + \
" keyName-" + keystore + \
" keyPass-luaframework" + \
" keyAliasName-luafw" + \
" keyAliasPass-luaframework"
print(cmd)
result = os.system(cmd)
if (result != 0):
print(result)
f=open(code_path + "/pylog.txt","r")
print(f.read().decode('UTF-8').encode('GBK'))
raise Exception('Error!')
else :
print("complete!")
这段代码的功能如下:
- 首先指定本地unity安装程序的位置和android签名文件的位置
- 根据传递进来的参数调用不同的打包函数
- 调用unity的-executeMethod方法执行打包函数(这里以打android包为例,所以需要传入keystore的相关信息,如果是打其它平台的包则不需要传)
- 把打包的日志文件保存到本地
- 打包完毕后如果有错误,把日志文件打印到控制台以便排查
注意!
这里对clearWrapFiles和buildResource两个参数的判断是以字符串来进行比对的,虽然我们在jenkins中配置的是布尔型,但传递到python后的true/false都是以字符串的形式,并不是真正的布尔型,这里需要注意.
接下来对一些容易出现的坑进行详细讲解:
如何正确调用系统git命令
git pull
上述命令非常简单,但为什么要单独提出来说呢,因为这里有个坑,我在这里花了半天的时间.
jenkins是以服务的形式运行的,首次安装后如果不进行设置,它会以访客的身份进行登录,于是乎就会出现各种没有访问权限导致的错误,如果你在通过jenkins执行git操作时出现了错误,那多半是因为权限不够导致的问题,因此我们需要对jenkins服务进行一次用户提权的登录配置:
首先打开计算机管理,在左边找到服务和应用程序--服务,在右边找到Jenkins服务,双击打开
切换到登录选项卡,选中此账户,填入本机管理员的用户名和密码,点击应用和确定
这样就可以正常执行git命令了
如何处理打包过程中出现的异常
为什么要手动处理异常?因为jenkins并没有聪明到可以检测到打包过程中发生逻辑错误的情况,如果我们不主动给jenkins抛出异常,那jenkins会认为一切正常,并且让控制台也显示一切正常,这样会对我们进行误导,明明一切都没有问题,为什么包迟迟打不出来,导致效率低下,所以我们需要手动进行处理,抛出异常让jenkins接收,以便其在控制台正确的显示错误让我们能及时知道.
unity支持在打包逻辑代码中主动调用EditorApplication.Exit(-1);来抛出异常(比如版本号不对等等),注意,必须要填写一个非0的参数,如果参数为0,则unity认为是正常退出.
另外,如果在打包过程中有任何的编译错误,unity会自动抛出一个值为1的异常,如果没有任何异常,则会返回0,因此我们可以通过
result = os.system(cmd)
if (result != 0):
这段代码进行捕获,一旦捕获到非0的返回值即代表发生了异常,这时我们再通过python代码
raise Exception('Error!')
抛出异常,这样就能被jenkins接收到,标记事件执行失败,以便我们及时的排查错误.
如何在控制台显示日志
我们在调用打包函数时可以带上
-logFile" + "log.txt"
把打包过程中的日志输出到log.txt文件中,在发生错误后通过
f=open(code_path + "/pylog.txt","r")
print(f.read().decode('UTF-8').encode('GBK'))
把日志直接打印打控制台进行查看
如果你的日志中有中文字符,则需要以GBK进行编码才能正常显示.
好了,现在所以配置都完毕了,我们来试试打包吧
回到luaframework主页面,点击左边的立即构建:
在下面的Build History中可以看到构建的进度,如果正常构建则会以灰蓝色显示,如果出现问题会以红色显示
关于构建进度的说明:除非出现错误,否则jenkins是不知道真实的构建进度的,也就是说这次打包是需要三分钟还是五分钟它是不知道的,那它的进度以什么为依据呢?其实是以上一次成功构建的时间来计算的,所以它显示的进度是一个大概的进度,并不精确,如果两次版本构建的时间间隔很长,项目发生了很大的变化,那这个进度就更不准去了,所以关于进度我们心理有数就好,还是把重心放在其结果是红色还是灰蓝色上好了.
至此整个自动化打包已制作完毕,enjoy it!