刘聪聪,杜 彬,任静媛
(陕西重型汽车有限公司汽车工程研究院,陕西 西安 710200)
在整个汽车行业的研发过程中,软件正越来越多地取代硬件,以降低系统的成本,获得更大的灵活性。这就意味着软件在整个行业中的比重将越来越大,软件代码的品质已经成为整个产品品质的重要衡量参数。那么在汽车行业软件开发过程中,开发工程师与测试工程师需要根据需求不断对软件代码迭代更新,相应的软件就需要进行全功能测试,由此产生了大量的重复工作,这样不仅效率低,而且会出现不可避免的人工操作失误。因此,有必要引入一个自动化可持续集成构建的系统来解决这些问题。该系统只需要工程师将相应的代码上传到指定位置,平台会根据配置自动调度工具自动化测试,保证迭代变更后的软件代码在最短的时间内发现问题并解决,提升了工作效率与软件代码品质,同时减少了后期维护成本。本文以汽车行业某软件开发过程为例,阐述基于Jenkins的可持续集成自动化构建平台的设计与实现。
本文所述可持续集成自动化构建系统根据V流程,将现有工具基于Jenkins进行资源整合,从检出代码、编译构建、运行测试、结果记录、邮件发送等都是自动完成的,不用人工操作,实现了软件闭环测试过程。基于Jenkins平台搭建的可持续集成自动化构建系统的工作流程如图1所示。
图1 可持续集成自动化构建系统的工作流程图
1)开发工程师根据需求变更代码并提交代码于SVN;测试工程师根据需求编写测试用例并提交于SVN;平台用户创建项目,配置平台信息并上传SVN。
2)根据用户新建项目调整创建Jenkins任务设置。
3)用户指定并创建Jenkins构建过程。
4)SVN指定路径变更/定时触发Jenkins构建。
5)自动调用工具链执行相应的测试过程。
6)测试结果邮件发送给相关人员。
整个过程执行一遍,工程师会接收到反馈邮件,并将发现的问题及时修改,若没问题,则代码保存在SVN供用户使用。之后会按照变更触发和定时触发进行多次回归测试,直到达到定义的相关标准为止。
Jenkins、SVN和执行工具可以部署在专门的服务器上,这样工程师在工作时不会受平台运行的影响。同时,平台执行时间可以设置,可以选择非工作时间执行,充分有效利用时间,提高效率。相比于传统的人工手动测试来说,这种模式下工程师只需要维护SVN中的代码版本的迭代和测试用例的更新,不需要在版本迭代时人工处理各个节点的代码更新、打包和运行操作,整个过程都交给Jenkins统一控制,节约人力成本,开发人员能够更好地聚焦在软件逻辑以及测试用例的开发。
对于规模较大的项目,可能需要多次变更与维护,代码提交比较频繁,测试项目较多,此时采用单节点测试压力较大,从而采用多节点部署,相当于增加Leader机制,即让master来担任Leader的角色,负责任务的调度与状态收集、节点的管理等,把具体的构建任务交由各节点完成。
如图2所示,master是主节点,负责整体的调度部署;Test1_A、Test_B、Test_C、Test_D为工具链节点,该节点轮询构建,不断进行回归测试。
图2 多节点列表
节点的配置如图3所示,以编译节点为例,其他节点类似。“Usage”设置为“User this node as possible”,即尽可能使用此节点,“Launch method”设置为“Keep this agent online as much as possible”,即通过连接到主节点启动代理。
图3 配置节点
创建任务,以编译一个子任务为例,如图4所示,通过设置任务的属性Restrict where this project can be run将任务与对应节点匹配,通过配置Source Code Management项来获取最新的源代码,如源代码使用SVN管理,这里选择“Subversion Modules”,如图5所示,在“Repository URL”录入SVN仓库地址。
图4 设置任务的属性
图5 配置源代码获取方式
通过配置“Build Triggers”项,实现如何进行触发构建。一般Jenkins的自动构建选择以下两种方式进行触发。一是采用Build periodically周期性构建,它使用cron语法,包含5个字段(MINUTE HOUR DOM MONTH DOW),H 5 * * *表示每天早上5点进行自动构建。二是对于像SVN要持续进行检测代码库是否存在更新及是否需要执行一次变更构建,则选择Poll SCM选项,例如将其设置为H */2 * * *,即每隔2h进行一次源码变更检查。如图6、图7所示。
图6 Build periodically设置
图7 Poll SCM设置
Jenkins提供了多种方式可进行Build配置,其中,可调用外部命令和脚本。本例中,选择执行windows批处理命令,根据项目要求编写相关命令,如图8所示,通过调用Jar包实现代码的预处理,再进行文件的拷贝与执行,以及实现文件的打包与存储。
图8 批处理命令举例
在完成Build配置后,选择“Post-build Actions”配置其他的选项,比如该子任务执行结果需要发布存储的SVN仓库配置和邮件反馈设置。邮件设置如图9所示,添加收件人邮箱即可,当构建失败、构建过程不稳定或恢复稳定时,将发送电子邮件。也可以添加指定的邮箱插件,例如网易邮箱等,指定发送/抄送用户、制式邮件模板等,使得邮件标准易读。
图9 邮件配置
至此便实现了Jenkins项目的配置。其中SVN、企业邮箱等均是安装的工具插件,成百上千的插件可以安装在Jenkins主机上集成不同的构建工具来适应用户的需求,增强Jenkins功能。
章节2.1和2.2描述了搭建自动化构建系统的部分操作及配置,对于复杂的项目配置项更多,拥有可以与Jenkins相关联的上位机能避免配置中的繁琐过程,只需在平台界面进行配置并提交于Jenkins即可,便于使用和维护。该上位机可使用JAVA语言开发,平台接口根据需求进行扩展。在程序主体框架搭建好的情况下,每次集成工具通过创建插件项目、添加主框架、添加扩展点、根据扩展点接口创建对应的类进行实现。实现方式与编程习惯有关,通常需要3个类,一是负责实现测试工具的集成页面,二是实现页面数据的保存和加载,三是负责实现测试工具的集成调用。
本文的实施环境由搭建Jenkins主节点和SVN的服务器1台和2台分别运行工具和开发测试的服务器组成。配置平台周期构建时间为早上5点,定时触发构建根据Jenkins监控SVN仓库的更新情况而定,每2min检测一次,如有变化则对最新的代码进行自动化构建。
图10为编译构建完成的截图,可以看出编译任务PrjTest_Compiler_OnTime每天上午5∶12进行构建;对于每天非周期构建时间,编译任务PrjTest_Compiler_Update 会根据Jenkins检测SVN的情况作出响应,如图10、11所示,3月19日除了5∶12周期性执行过,还在下午12∶3进行了执行,这样既保证了构建的完整性,又避免了不停回归测试引起的资源浪费。测试结果以邮件的形式进行反馈,如图12所示。
图10 周期编译构建截图
图11 事件触发编译构建截图
图12 测试结果邮件反馈截图
以实际某项目为例,分别采用手动测试和使用可持续集成平台测试,表1列举出该项目执行一遍两种方法的相关内容对比。
由表1可知,该项目4个测试项执行一遍至少需要3h,失误率在10%,自动化测试耗时只花费在平台的配置上,执行时间在非工作时间且失误率低。通过对比可知自动化测试所耗时间仅为人工测试的1/6。在多轮测试时,配置好的平台不需要额外耗时,平台会按照配置的时间执行即可,同一项目执行周期越长,越能体现自动化构建的优势。由此可知,自动化构建系统不仅能降低人工带来的失误率,且大大提高了工作效率。
表1 某项目手动测试与自动化测试效果对比
本文基于Jenkins设计实现了可持续集成自动化构建系统,并将其应用于实际项目中,与传统方法对比可知,可持续集成平台通过自动化构建、自动化测试以及自动化部署与反馈的方式实现软件的闭环测试,以插件式的方式集成工具使得测试过程更完整,再搭配变更/定时的触发方式轮询构建保证了开发系统中的问题能迅速被发现和修复,使得开发过程始终保持在一个稳定健康的状态。这样,既满足了敏捷开发的需要,又有效提高了开发效率。