目录
京东持续集成实践
1、持续集成简介
2、持续集成实践
3、集成环境的部署及自动化测试
3.1、搭建J-auto系统
3.2、J-auto系统使用
4、持续集成数据分析
持续集成不仅仅是一项项目实践,而是多项项目实践的总和。在尝试这些实践时,不可避免要遇到一个问题:为什么要持续集成?如果不能很好地理解为什么,持续集成可能会进入误区,不能带来期望的效果。
质量、进度和成本是软件项目关注的三大要素,它们互相依赖、互相制约。以前软件生命周期模型是程序员负责编写不同的模块,在项目完成之前,一次性的把各个模块集成在一起,再进行测试。使用该种方式会为项目引入很多的未知因素和巨大风险--开发工程师往往发现越来越多的Bug 等待他们去修复、许多严重问题不能在前期及时发现修正、需求频繁变更导致项目后期时间严重不足等等,这些风险很有可能会威胁到项目的成功。随着对产品的发布要求越来越高、越来越频繁,以前老的方式已经越来越不能满足要求。持续集成允许代码分批提交,代码提交后立即测试,测试在开发过程中一直存在,直至开发完完毕,避免代码积累很多后集成,造成代码质量低下。可以有效地解决项目过程中的许多问题,快速、及时发现系统错误,有效地确保系统质量,减小项目的风险,使得团队从容面对各种各样的变化。在项目过程中持续集成更能及时呈现各种分析报告,让项目中各种角色了解项目的真实状况,从而为正确选择提供了数据基础。
随着京东业务爆炸式增长,需求迅速增加,这对应用系统及时且保证质量交付产生了极大的挑战。此时如果没有良好的管理和高效的工具来帮助测试,整个测试团队必会处于混乱的状态,导致无法在短时间内保质保量地完成应用系统的测试任务,那么整个测试团队命运必然是被淘汰。在此背景下,交易质量部提出一套高效可行的解决方案——京东持续集成JCI (JD Continuous Integration)。从而节约了时间成本,提高了应用系统质量,增强了项目的可见性,使研发工程师与测试工程师之间的协作更完美。持续集成闭环系统环节如图25-1所示:
持续集成方案如图25-2所示:
京东持续集成包含子系统:
测试环境部署是一个重复且费时的工作。随着需求增加,测试环境部署及应用系统测试的成本显著增加。为了减少工作成本提高效率,经过测试工程师们积极探索,成功地引入自动化部署及自动化测试。
自动部署及自动化测试方案整体流程图如下:
流程图解释说明如下:
①通过京东J-one系统提交测试时,J-one会产生提测的JMQ消息:
②J-auto系统接受并解析JMQ消息,获得提测的详细信息,如:应用名称、开发工程师、测试工程师、被测代码分支、安装介质下载地址等等;
③获取应用于任务映射关系,关系包含:应用名称、部署任务名称、自动化测试任务名称、部署目标主机ip、任务是否启用等信息;
④调用主任务,主任务负责在京东云下载安装介质、分发安装介质及部署脚本、调用部署子任务;
⑤执行部署,部署任务根据映射关系信息,执行部署脚本。部署完成后,发送部署结果反馈。如果成功部署则启动自动化测试,否则回滚环境;
⑥自动化测试任务,从Source系统获取测试相关测试脚本,运行测试脚本并反馈测试结果等信息。
J-auto系统包含两部分,Jenkins任务调度模块及Jenkins模块。搭建步骤如下:
安装JDK:
在应用服务器上的指定目录下新建目录,如:/xx/xx/java。将安装包剪切到java下,并解压。命令如下:
mv ./jdk-7u80-linux-x64.tar.gz /xx/xx/java/jdk-7u80-linux-x64.tar.gz cd /xx/xx/java/ tar –xvf jdk-7u80-linux-x64.tar.gz |
配置JAVA_HOME环境变量,命令是
Export JAVA_HOME=/xx/xx/java/jdk1.7.0_80 |
安装tomcat:
在应用服务器上的指定目录下新建目录,如:/xx/xx/tomcat。将安装包剪切到tomcat下,并解压。命令如下:
mv ./apache-tomcat-7.0.30.tar.gz /xx/xx/tomcat/apache-tomcat-7.0.30.tar.gz cd /xx/xx/tomcat/ tar –xvf apache-tomcat-7.0.30.tar.gz |
将Jenkins任务调度模块部署到tomcat 容器中。
安装jenkins:
将安装包剪切到/xx/xx/tomcat/apache-tomcat-7.0.30/webapps/jenkins下并解压。
命令如下:
mv ./ jenkins.war /xx/xx/tomcat/apache-tomcat-7.0.30/webapps/jenkins/jenkins.war cd /xx/xx/tomcat/apache-tomcat-7.0.30/webapps/jenkins/ jar –xvf jenkins.war |
启动jenkins,在tomcat的根目录下,执行
cd ./bin ./startup.sh |
jenkins全局配置
访问jenkins系统,注册用户并登录后,点击左侧的【系统管理】菜单,再点击【系统设置】,界面如下:
图25-4 Jenkins系统设置
图注:
角色权限配置,首先,点击【系统管理】,在点击【Configure Global Security】,启用及配置安全策略,如下图25-5所示:
图25-5 配置安全策略
图注:
其次配置角色权限,如图25-6所示:
图注:
最后,为用户分配角色。点击【系统管理】,点击【Manage and Assign Roles】,点击【Assign Roles】,界面如图25-7:
图注:
配置机器节点
点击页面左侧【系统管理】,点击右侧页面的【管理节点】,点击左侧的【新建节点】,节点信息编辑界面如下:
配置完成后,链接节点。
Jenkins主任务配置
首先创建任务时,选择【构建一个自由风格的软件项目】,如图25-9所示
配置【General】信息,如图25-10:
配置【构建环境】,如图25-11,介绍如下:
配置【构建】,如图25-12所示,介绍如下:
增加构建步骤时,选择【Execute shell】,编写脚本。
配置【构建后操作】,如图25-13所示,介绍如下:
点击【增加构建后操作步骤】,选择【Editable Email Notification】,设置构建后的邮件通知策略。
J-auto系统搭建完成后,下面就是应用J-auto系统进行自动部署和自动化测试了。首先,需要在Jenkins中新建一个自动化测试任务,与主任务不同,在创建任务时选择【构建一个maven项目】,如下图所示:
【源码管理】配置中,①处配置测试脚本源码地址及鉴权账号和密码;②处设置测试脚本的分支名称。
【Build】环节设置
①配置Maven的.pom文件
然后新建一个自动部署任务,其与主任务配置类似。需要注意此任务存在shell脚本调用shell脚本的情况,【构建】环节编写shell脚本时,需要加BUILD_ID=[DoNotKillMe]。防止外层脚本运行完成,但是内层脚本仍在运行时,内层shell脚本被终止,如图25-17所示。
另外【构建后操作】除了发送反馈邮件配置,增加【Trigger parameterized build on other projects】步骤,用来关联上一步建立的自动化测试任务,启动自动化测试任务进行测试。
映射关系配置,是整个系统运行起来的关键环节。指明了那个应用系统部署在那台机器及应用部署的目录、应用的域名等信息,链接提测到自动部署自动化测试环节,如图6-19所示。
此时研发通过J-one系统提交测试,J-auto接受提测的JMQ消息,就可以触发后续的自动部署、自动化测试、及各环节反馈,如图25-20。
持续集成过程中,我们可以从编译、部署、测试等环节中拿到许多相关数据。通过对这些数据分析和数据挖掘,可以帮助我们后续质量评估分析、质量趋势分析、质量可回溯分析等,有效地规范项目流程,发出项目风险预警。下面单从应用缺陷方面进行分析。
应用缺陷数据分析,是持续集成数据分析中一部分,顾名思义就是对测试过程中发现的各种缺陷的汇总分析。既然是数据分析就得有数据模型,应用缺陷数据分析的模型如下:
指标 |
指标说明 |
所属项目 |
被测应用归属的项目 |
所属模块 |
产生缺陷的功能模块 |
发现阶段 |
发现缺陷的时间,如:需求评审、设计评审、编码开发、单元测试、功能测试等 |
研发工程师 |
编写相关模块及解决该问题的人员 |
缺陷级别 |
缺陷的严重性,如:建议、轻微、一般、严重等 |
表25-1 缺陷数据分析模型
通过构造缺陷在软件生命周期的各环节的属性进行分析,从不同维度得到各类缺陷的缺陷个数和缺陷比例,积累得到各类缺陷的基准值,用于评估测试活动,指导测试改进和整个生命周期流程的改进。比如,按模块进行单维度分析,可以得出各个功能模块的缺陷密度,从而了解各个功能模块的质量状况;还有按发现阶段分类分析,按模块加验证程度分类分析等等;
再有通过已有项目历史数据进行缺陷趋势分析,缺陷趋势可以通过每日新建bug、每日关闭bug、累计未解决的bug,累计关闭bug、bug总数等指标进性分析,通过缺陷增长和减少的趋势,了解测试的效率和开发修复bug的效率、测试瓶颈等。可以通过每日新建bug趋势来了解测试的效率,正常来说提测中前期每日新增bug指标应该逐渐增加并达到一个峰值,然后呈下降趋势,最后趋向于0。符合这个趋势说明测试效率和测试质量较高,且开发修复bug新引入bug的概率是比较小的。每日关闭bug指标反映了研发工程师的处理响应速度。每日关闭bug数大说明研发修复bug效率高。如果新建的bug数越来越小,但是关闭的bug数量一直小于累计未解决的bug数,则说明研发同学效率低,是项目的瓶颈。bug总数曲线和累计关闭bug数应该大体一致并且最后重合。
文末备注:
此文书写实践是一期摸索实践,写了很久没有时间发布分享给大家,最近才有时间整体出来,这并不是最佳实践,只是记录实践探索,希望能给大家带来思路和借鉴,我的二次摸索实践在进行中,希望后续有机会能给大家分享最佳实践;