持续集成之Jenkins初探

1.持续集成

1.1持续集成的定义

持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

1.2持续集成的价值

持续集成的核心价值在于:

  • 1.持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量;
  • 2.持续集成保障了每个时间点上团队成员提交的代码是能成功集成的。换言之,任何时间点都能第一时间发现软件的集成问题,使任意时间发布可部署的软件成为了可能;
  • 3.持续集成还能利于软件本身的发展趋势,这点在需求不明确或是频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同时建立团队对开发产品的信心。

1.3持续集成的原则

业界普遍认同的持续集成的原则包括:

    1. 需要版本控制软件保障团队成员提交的代码不会导致集成失败。常用的版本控制软件有 IBM Rational ClearCase、CVS、Subversion 等;
    1. 开发人员必须及时向版本控制库中提交代码,也必须经常性地从版本控制库中更新代码到本地;
    1. 需要有专门的集成服务器来执行集成构建。根据项目的具体实际,集成构建可以被软件的修改来直接触发,也可以定时启动,如每半个小时构建一次;
  • 4.必须保证构建的成功。如果构建失败,修复构建过程中的错误是优先级最高的工作。一旦修复,需要手动启动一次构建。

1.4持续集成系统的组成

由此可见,一个完整的构建系统必须包括:

  • 一个自动构建过程,包括自动编译、分发、部署和测试等。
  • 一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库。
  • 一个持续集成服务器。本文中介绍的 Jenkins 就是一个配置简单和使用方便的持续集成服务器。

2.Jenkins介绍

2.1文字介绍

Jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译、打包、分发部署。jenkins可以很好的支持各种语言(比如:JavaScript、java, c#, php等)的项目构建,也完全兼容grunt、ant、maven、gradle等多种第三方构建工具,同时跟svn、git能无缝集成,也支持直接与知名源代码托管网站,比如github、bitbucket直接集成。

2.2工作流程图

从图片上看,其实Jenkins就是一个将以前人工打包、上传、发布操作通过各种插件等集成到可视化的web页面上一个工具。
2.1 从git等仓库中拉取代码(拉取后的代码可以在Jenkins的工作空间中找到)
2.2 Jenkins调用第三方插件 如Shell 运行指定命令
2.3 调用服务器上已经安装的打包插件如grunt将代码打包。
2.4 使用SSH命令将打包好的代码上传到发布服务器上 
2.5 使用SSH命令将上传好的代码发布到代码服务器

2.3 Jenkins 安装和启动

安装Jenkins:

    1. 本人安装的是jenkins-2.60.1.msi安装版,也可自行选择安装Jenkins其他版本;
      Jenkins下载地址
    1. 双击jenkins.msi启动安装,安装目录选择D:\Progrom Files\Jenkins,然后启动成功。
    1. Jenkins服务默认端口为8080,如与其他服务冲突,可在..\Jenkins\jenkins.xml中修改默认端口,如我这里修改为--httpPort=7033;


    1. Jenkins服务默认是自动启动的,如果想修改为手动启动,请自行管理->服务,找到Jenkins服务,修改为手动启动即可。

2.4Jenkins添加项目和具体配置

2.4.1安装插件

Jenkins的很多功能都需要依赖于现有的插件,比如git仓库下代码拉取、SSH命令的运行。Jenkins第一次启动的时候会推荐你安装默认的插件,建议将推荐的插件都安装。
下面我以安装Multiple SCMs Plugin 这个插件为例, Multiple SCMs Plugin 这个插件可以让你的项目拉取多个仓库代码。 比如你的发布项目需要将多个仓库下代码进行打包。
安装截图:

安装完成后截图:

2.4.2Jenkins具体配置

一.还是先从截图看具体的配置界面然后一一解析具体功能

General 通用配置,可以添加项目名称、项目描述。和构建过程中使用的参数。

参数化构建过程这个选项比较重要,它主要是让你可以根据自己的配置参数,去拉取指定分支代码或者运行不同的shell脚本来达到比如发布到不同的服务器上的逻辑,打包逻辑化。

二、源代码管理

配置git仓库地址。
${branch_project} 指定的就是你从仓库中拉取指定分支的代码,这个可以在前面的构建化使用参数中配置。
Mutiple SCMs 是Jenkins的一个插件,主要解决一次发布需要拉取多个仓库代码,比如你想从拉取A项目并且在A项目的子文件夹asset/src/h5中拉取B项目的代码放于文件夹asset/src/h5中。就要使用这个插件。
而Additional Behaviours 项的配置是解决拉取两个项目同时,B项目必须放到到A项目的asset/src/h5中。

三、构建触发器
根据你自己的情况去选择,比如你可以配置当git每次提交时就去打包。

四、构建触发器
根据你自己的情况去选择,比如是否配置每次build时去清空工作空间。

五、构建
增加构建步骤添加你的具体操作,一般是选择运行shell 脚本, 我是使用的grunt命令打包的所以我的shell 脚本中会有grunt 的相关命令, 具体shell脚本需要根据你的业务去扩展。

export PATH=/usr/local/bin:/path/to/node:/path/to/node_bin:/path/to/phantomjs:/path/to/jscoverage:$PATH;

加上这段shell脚本是配置mac机上的Path路径的,有时候你运行shell脚本时会报找不到相应命令时加上这段估计能解决你的问题
六、构建后操作
当你的构建成功后你有时你需要把打包生成的zip包保留并且提供下载

点击保存之后一个构建项目已经创建成功。

3.Jenkins+ANT+Jmeter 接口测试的实践

3.1 Jemeter安装

  1. 解压apache-jmeter-3.0.zip到D:\soft目录下。
  1. Jmeter插件的安装。解压JMeterPlugins-Extras-1.40.zip、JMeterPlugins-Standard-1.4.0.zip,将对应ext目录下的文件拷贝到D:\soft\apache-jmeter-3.0\lib\ext目录下;
  1. 配置Jemeter环境变量:
  1. 设置环境变量,新建系统变量在变量名中输入:JMETER_HOME,变量值中输入:D:\soft\apache-jmeter-3.0,点击确定即可。
  2. 在环境变量CLASSPATH中添加%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-1.2.jar;
    在环境变量Path中添加%JMETER_HOME%\bin
  3. 检验是否配置成功 运行cmd 输入 jmeter -v (jmeter和 -v 之间有空格)
    若如图所示 显示版本信息 则说明安装和配置成功。

3.2 Ant安装

  1. 解压apache-ant-1.9.3-bin.zip到D:\soft\apache-ant-1.9.3-bin目录下;
  1. 配置Ant环境变量

1) 新建以下环境变量:
ANT_HOME:D:\soft\apache-ant-1.9.3-bin,此为你的ANT安装路径;
设置完成后,点击"确认"来保存。

2) 在环境变量PATH的最后面添加一下内容:
;%ANT_HOME%\bin 注意前面的分号,如果PATH中最后没有分号";"的话要加上,有的话就可去除。

3) 进入cmd命令窗口,在CMD窗口中输入ant -version,敲击回城键,会显示出你安装的ANT版本,如果成功显示,说明你的配置应该是成功了.

  1. 本地调试使用ant构建运行Jmeter,并且生成jtl、Html报告;

1) jmeter默认保存的是.csv格式的文件,所以我们先要设置一下bin/jmeter.properties文件内容,修改jmeter.properties文件 jmeter.save.saveservice.output_format=xml;

2) 将apache-jmeter-3.0\extras\ant-jmeter-1.1.1.jar拷贝到apache-ant-1.9.7\lib目录下;

3) 在\apache-jmeter-3.0\extras目录下打开CMD,运行"ant.bat -file build.xml -Dtest=Test" . 查看\apache-jmeter-3.0\extras目录下是否出现Test.jtl、Test.html文件,若有,则构建成功。注意:Test.jmx是默认存在的Sample脚本文件。
若构建失败,请分析cmd打印的日志消息,定位问题;

  1. build文件推荐设置:
<?xml version="1.0" encoding="GB2312"?>  
<project name="JmeterTest" default="all" basedir=".">  
    <tstamp>
        <format property="time" pattern="yyyyMMddhhmm" />
    </tstamp>
    <!-- 需要改成自己本地的 Jmeter 目录-->    
    <property name="jmeter.home" value="D:\soft\apache-jmeter-3.0" />  
    <!-- 生成的报告的title名-->    
    <property name="report.title" value="MINI_OA接口测试报告" />  
    <!-- jmeter生成jtl格式的结果报告的路径 ".\"表示当前路径-->   
    <property name="jmeter.result.jtl.dir" value="D:\soft\apache-jmeter-3.0\jmeterTest\resultLog\jtl" />  
    <!-- jmeter生成html格式的结果报告的路径 ".\"标识当前路径-->  
    <property name="jmeter.result.html.dir" value="D:\soft\apache-jmeter-3.0\jmeterTest\resultLog\html" />  
    <!-- 生成的报告的前缀-->    
    <property name="ReportName" value="MINI_OA接口测试报告" />  
    <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}.jtl" />  
    <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}.html" />  


  
    <target name="all">  
        <antcall target="test" />  
        <antcall target="report" />  
    </target>  
      
    <target name="test">  
        <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />  
        <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">  
            <!-- 声明要运行的脚本路径和文件名 ".\"标识当前路径 "*.jmx"执行全部jmeter脚本-->  
            <testplans dir="D:\soft\apache-jmeter-3.0\jmeterTest\script" includes="*.jmx" />  
              
            <property name="jmeter.save.saveservice.output_format" value="xml"/>  
        </jmeter>  
    </target>  
          
    <path id="xslt.classpath">  
        <fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/>  
        <fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/>  
    </path>  
  
  
    <target name="report">  
        <tstamp> <format property="report.datestamp" pattern="yyyy/MM/dd HH:mm" /></tstamp>  
        <xslt   
              classpathref="xslt.classpath"  
              force="true"  
              in="${jmeter.result.jtlName}"  
              out="${jmeter.result.htmlName}"  
              style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl">  
              <param name="dateReport" expression="${report.datestamp}"/>  
              <param name="titleReport" expression="${report.title}:${report.datestamp}"/>  
  
       </xslt>  
  
                 
        <copy todir="${jmeter.result.html.dir}">  
            <fileset dir="${jmeter.home}/extras">  
                <include name="collapse.png" />  
                <include name="expand.png" />  
            </fileset>  
        </copy>  
    </target>  
  
</project>  

3.4 Jenkins配置测试项目

  1. 新建测试项目(接口测试) :
    在Jenkins首页左边 点击新建 -> 选择"构建一个自由风格的软件项目",输入Item名称(中英文不限,建议使用英文) –> 点击OK,进入你新建的测试项目的配置页面;
  1. 项目配置步骤1:
    a、描述:用于编写该项目的介绍(请忽略);
    b、丢弃旧的构建:这里勾选上,为了避免多余的构建日志、临时文件占磁盘空间,需要定期的清除过期文件。例如这里选择保存3天之内的构建文件,最大保存N个构建项目的文件;
    具体设置如下图所示:
  1. 项目配置步骤2:
    1) 配置工作空间:
    点击高级项目选项右侧的高级 -> 勾选使用自定义的工作空间;
    目录填写你的Jmeter安装目录\extras即可。说明:比如上面步骤中,大家的jmeter安装目录为D:\soft\apache-jmeter-3.0,则此处填写D:\soft\apache-jmeter-3.0\jmeterTest;


    工作空间

(说明:设置工作目录主要是ant构建时用到了该目录下的build.xml文件,以及的的jmx脚本文件、jtl文件、html文件存放在此处; 准确的来说,此工作目录与jmeter没有任何关系,只是初学为了避免干扰,这里直接将工作空间与jmeter直接联系在了一起。)

  1. 项目配置步骤3:

1.)源码管理,这里不涉及,选择none;

2.)构建触发器:选择此项目构建的触发条件,例如本项目的是为了实现接口的定时监控,于是选择Build periodically(定期构建)。
注意:关于定期构建参数的说明:"* * * * *",总共有5个参数,分别代表分(0-59)、时(0-23)、天(1-31)、月(1-12)、周(0-7,0和7表示星期天);

3.)构建 -> 增加构建操作 -> Execute Windows batch command ;
此处编写删除jtl文件的命令(因为Jmeter运行jmx脚本文件,生成jtl报告文件。如果存在同名的jtl文件,并不会覆盖,而是追加,所以每次构建运行jmeter脚本文件之前需要删除jtl文件):

del "D:\soft\apache-jmeter-3.0\jmeterTest\resultLog\jtl\MINI_OA接口测试报告.jtl"

项目配置步骤4:

Invoke Ant配置
Ant Version 选择之前在jenkins设置的ant;
Properties 填写”ReportName=MINI_OA接口测试报告“,此处为你的jmeter 文件名字(不带.jmx)。
说明:此处”ReportName=MINI_OA接口测试报告“的原因,可以查看工作目录extras下的build.xml文件中有这样的一段代码: <property name="ReportName" value="MINI_OA接口测试报告" />

项目配置步骤5:

新增构建后操作Archive the artifacts,add a New report(JMeter),

填写用于存档的文件"**/+++.html",这里+++与你的jmx文件名一致;

填写Report files: **/---.jtl,这里---与你的jmx文件名一致;

新增构建后操作E-mail Notification

新增构建后操作Editable Email Notification,如图

然后选择 -> Advanced Settings... ,出现Triggers,这里我们可以根据需要增加Triggers。例如本人增加了Failure – Still(持续失败)的情况下邮件报警;
Recipient List :收件人的邮箱,用";"间隔
SubJect:邮件标题
Content: 邮件内容,可以按照HTML格式编写。
如图所示

到这里整套环境就搭建完成了,可以自行构建测试是否达到预期;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容