在软件开发过程中,特别是在一些大型多人合作开发的项目中,如何将各个人开发的不同模块集合为一个完整的系统,最终输出一个完整的目标文件,这个过程包括编译,发布,自动化测试等环节。这一过程的完善程度和流畅程度将会影响整个发布过程,如果整个过程都需要人为干预,那么每次需要构建版本的时候都会是一场灾难。
笔者刚进入游戏行业时,曾经在一个初创手游团队工作过,当时所有版本的发布都是由我负责,在开发前期只有一个版本维护,仅仅是在验收的时候发布一个PC版,但是到了后期需要维护IOS和Android两个平台,其中Android版本在接入渠道后,针对每个渠道都要分别打包,整个过程都需要我手动控制,虽然写了几个自动化脚本但是整个流程并不是完全自动化,常常是之前搭建好的构建环境,在经过几次提交后又会出现若干错误,这时候又需要我一个一个解决。项目虽然还是在有条不紊的进行中但是整个发布过程却是异常痛苦。
后来又参与了一款端游的研发,项目的负责人利用Windows的定时任务和批处理脚本制作了一套自动化构建脚本,每次需要构建版本时只需要运行下批处理脚本,这个过程会锁定SVN的提交权限,任何人都无法提交任何东西,直到构建完毕,如果在构建过程中出现错误脚本会自动将错误信息发送到开发人员的IM工具。虽然端游只需要发布到一个平台,但是整个构建过程是不需要人为干预的完全不影响开发人员当前的工作。在每天的凌晨2点工具会自动构建当前最新的版本,这样测试组在上班后就可以立即用最新版本的游戏进行测试,并反馈测试结果。
因此一个完善的构建系统对于整个团队的开发效率是有很大影响的,通俗来讲构建系统(build system)是用来从源代码生成用户可以使用的目标(targets)的自动化工具,一个灵活的构建系统应该可以支持任意扩展和随意配置,并且支持流水线作业。目前市面上的几款自动化构建系统都已经非常完善强大了。
- Jenkins:Jenkins是一个老牌开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
- Travis CI :Travis CI 是目前新兴的开源持续集成构建项目,它与jenkins,GO的很明显的区别在于采用yaml格式,简洁清新独树一帜。
Jenkins
本文主要以Jenkins为例讲解如何在Windows环境配置自动化构建系统,Linux环境的配置可自行搜索相关文献。作为一款持续集成工具Jenkins不仅提供了基本的持续构建功能,还提供了很多强大的额外功能,比如:打包后使用开源软件FileZilla进行上传、下载部署;可以编写单元测试脚本自动执行打包后版本进行汇总性能分析;打包失败自动发送邮件给相关负责人等等。不仅如此Jenkins提供的插件功能更是涵盖了持续化集成的方方面面,这些功能基本可以满足任何项目的持续化集成与交付需求。
用到的软件或工具
- JRE :Java Runtime Environment(下载链接:Java SE Runtime Environment 8)
- Jenkins:(下载链接:http://mirrors.jenkins.io/war-stable/latest/jenkins.war)
- Python :Python2.7版本(https://www.python.org/ftp/python/2.7.14/python-2.7.14.msi)
- 7z:压缩package工具(下载链接:http://www.7-zip.org/)
环境搭建
- Python运行环境配置:下载并安装Python,将安装后python.exe所在的目录附加到PATH环境变量中,我的电脑->右键属性->高级系统设置->高级->环境变量,PATH中新增C:Python27(Python所在目录)。
- Java运行环境配置:按照对应操作系统下载并安装jre,如果未自动配置Java环境变量,手动配置方法同Python。
- 7z环境配置:下载安装好7z,环境变量 PATH中新增C:Program Files7-Zip(Python所在目录)条目。
- Jenkins运行及配置:下载 jenkins.war,进入所在目录运行java -jar jenkins.war ,然后在浏览器中打开http://localhost:8080,复制以上密码,进行jenkins初次设置。
- 配置环境:把刚刚复制的password粘贴到Administrator password,安装好必备的plugin,创建一个初始Admin User,Jenkins 环境就配置完成了。
如果遇到“该Jenkins实例似乎已离线”
可以参考以下方式解决:
打开一个新的tab,输入网址http://localhost:8080/pluginManager/advanced。 将最下面的“Update Site”中Jenjins默认地址http://updates.jenkins.io/update-center.json改为其他国内备用地址:
- https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
- http://mirror.esuni.jp/jenkins/updates/update-center.json
最后在浏览器输入http://localhost:8080/restart ,再启动就可以正常下载插件了。
创建Job
在Jenkins主页下可以点击New Item 创建一个新的Job,Jekins提供了多种模板,选择第一个Freestyle project 。Item Name建议最好与你的项目相同。Job 配置有General,源码管理,构建触发器,构建环境,构建,以及构建后操作几个部分。
打开Jenkins主页左侧系统管理,选择系统设置,在主目录下方一行点击高级按钮,显示出工作空间根目录,更改到你的Workspace中:E:You Project Name${ITEM_FULLNAME}
编写Build脚本
构建脚本可以是Python也可以是Windows的批处理命令或者其他语言编写的脚本,整个过程主要是通过在Jenkins中配置好的参数,调用脚本最终脚本调用对应的编译工具进行打包,如果是Unity项目最终会调用ProjectBuild.cs进行对应平台的打包操作。如果是Unreal项目则会调用Unreal Engine的打包工具进行打包。例如新建一个UnityBuild.bat的Unity构建文件:
UnityBuild.bat 内容如下REM UNITY程序的路径
SET UNITY_PATH="D:Program Files (x86)Unity2019.2.0f1EditorUnity.exe"REM 游戏程序路径
SET PROJECT_PATH="E:JenkinsworkspaceAutoBuild"REM 在Unity中构建apk
%UNITY_PATH% -projectPath %PROJECT_PATH% -quit -batchmode -executeMethod ProjectBuild.BuildForAndroid %1 -logFile build.logecho "Build生成完毕"
PAUSE
配置Jenkins job
jenkins job 配置官方有详细的文档,在Jenkins主页选择创建好的job,左边进入Configure
- General:勾选 “参数化构建过程”。添加参数 Choice Parameter, 填写Name为Configuration,Choices填Development和Shipping两个选项换行隔开,Description 添加一些描述语言。添加参数 String Parameter,填写Name为 Engine_Root,默认值为引擎目录,我的是“D:Program Files (x86)Unity2019.2.0f1Editor” 。再次添加Choice Parameter,填写Name为Platform,Choices填写Win64和Win32。
- 源码管理:以Git为例,Repository URL填写远程地址,Credentials点击Add添加git账户密码,其他选项按照需求填写。如果填写正确,每次build前会自动获取最新版本,选择None则跳过这一步。
- 构建触发器:Jenkins 提供了多种自动检查代码,自动构建的功能,这里比如设置项目每天1点构建,Build periodically 中填写:H 1 * * *
- 构建环境:这个模块主要做构建的一些相关设置以及一些Plugin提供的功能,勾选了Add timestamps to the Console Output 选项,会再build log 中增加时间戳。
- 构建:新增一个 Execute Windows Batch Command,命令行中填写:
UnityBuild.bat “D:Program Files (x86)Unity2019.2.0f1EditorUnity.exe” “%WORKSPACE%”
Build
配置完成保存,然后左边选择 Build with Parameters,可以看到配置中添加的参数列表,点击开始构建执行打包操作。同时还可以打开Console Output 查看日志,以及打开变更记录查看此次打包变更内容。打包后可以在配置好的release_path 目录下看到压缩后的版本。
参考文献
- Jenkins+Unity踩坑日记(详细下载安装手册):https://blog.csdn.net/alph258/article/details/86075956
- Jenkins集成unity一键打安卓包:https://zhuanlan.zhihu.com/p/87964476