Jenkins+Junit+Ant+Mercurial(hg)+Cobertura+Findbugs (搭建持续集成环境)


名词说明:

Jenkin :是一个开源项目,提供了一种易于使用的持续集成系统

Junit : java的测试框架

Ant : 基于java的构建工具

Mercurial :是一个跨平台的分布式版本控制软件

Cobertura :一种开源工具,它通过检测来测量测试覆盖率

FindBugs :是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题

 

一.安装环境

Linux系统

二.安装准备

1.jenkins.war(最新稳定版本包下载地址:http://mirrors.jenkins-ci.org/war-stable/latest/jenkins.war)

2. apache-ant-1.9.1-bin.tar.gz cobertura-2.0.3-bin.tar.gz findbugs-2.0.2.tar.gz
下载地址:
1).ant[http://mirror.sdunix.com/apache//ant/binaries/apache-ant-1.9.2-bin.tar.gz]
2).cobertura[https://sourceforge.net/projects/cobertura/files/latest/download?source=files]
3).findbugs[http://prdownloads.sourceforge.net/findbugs/findbugs-2.0.2.tar.gz?download]
3. mercurial
1).可以下载安装包安装
2). rat、centos系统也可直接使用yum install 命令安装,下面使用命令安装。   JENKINS_HOME 的目录:conf用于存放jenkins的配置文件

三.安装过程

1.jenkins

在linux设置JENKINS_HOME路径

例如:在当前用户目录(/home/jouken)下修改【.bash_profile

在最后添加:export JENKINS_HOME=/home/jouken/commoninstall/jenkins/conf[A4]

2.ant+cobertura+findbugs

    apache-ant-1.9.1-bin.tar.gz解压/home/jouken/commoninstall/文件夹;

       cobertura-2.0.3-bin.tar.gz解压/home/jouken/commoninstall/文件夹;

       findbugs-2.0.2.tar.gz解压/home/jouken/commoninstall/文件夹;

为PATH添加ant的bin路径,使ant命令能够全局使用。

 在当前用户目录(/home/jouken)下修改【.bash_profile

添加:

export ANT_HOME=/home/jouken/commoninstall/apache-ant-1.9.1

export PATH=$PATH:$ANT_HOME/bin

3.Mercurial

1)[安装]用root用户执行yum install mercurial,安装过程如果遇到判断则选择[y]即可.

2)[查找配置文件]使用rpm -ql mercurial | grep sample.hgrc 命令查找sample.hgrc文件路径

3)[复制配置文件]将simple.hgrc文件复制到当前用户目录(/home/jouken),改名为.hgrc

cp -rf /usr/share/doc/mercurial-1.4/sample.hgrc/home/jouken/.hgrc

4)[编辑配置文件]

vim .hgrc

找到# username = Joe User <j.user@example.com>

并在下一行添加你的hg邮箱地址,例如下:

username = "jouken<jouken@126.com>"

4.配置jenkins

1)进入到jenkins.war放置的目录,执行命令:java -jar jenkins.war

2)用浏览器访问:http://localhost:8080

3)为jenkins安装mercurial插件

3.1)系统管理->管理插件->可选插件->搜索:Mercurial Plugin->勾选[Mercurial Plugin]->点击[Download now and install after restart]按钮即可完成安装。

3.2)查看[已安装]如下:(如果没有显示则手动重新启动jenkins即可)

 

4)设置全局hg的用户名和密码

4.1)系统管理->Manage Credentials->Add Credentials[选择”Username with password”]->依次输入Username、password、Description的数值->点击[Save]按钮保存即可.

5)安装emil插件

5.1)系统管理->管理插件->可选插件->搜索:Email Ext Recipients Column Plugin

->勾选[Email Ext Recipients Column Plugin]->点击[Download now and install after restart]按钮即可完成安装。

5.2)查看[已安装]如下:(如果没有显示则手动重新启动jenkins即可)

 

6)设置全局email邮箱账号

 6.1)配置邮件

系统管理->系统设置->邮件通知->输入[SMTP服务器、用户默认邮箱后缀],点击[高级]输入

[勾选(使用SMTP认证)、用户名、密码、勾选(使用SSL协议)、SMTP端口Reply-To Address字符集]。

输入以上信息,可以通过勾选[通过发送测试邮件测试配置]选项、输入收件箱邮箱号->点击[Testconfiguration]按钮测试,当看到”Email was successfully sent”提示信息时,说明邮件配置成功。

 

6.2)设置默认收件箱信息

系统管理->系统设置->Extended E-mail Notification->填写Default Recipients[默认收件邮箱]。 (其他选项可以根据自己的情况和帮助信息填写)

 

四.项目实战

1.新建项目

点击[新job]->输入[任务名称]、选择[构建一个自由风格的软件项目]->点击[OK]

2.配置详细信息

1)填写[project名称、描述、勾选(丢弃旧的构建)、等]
2)
[源码管理]项,选择(Mercurial)单选项->填写[Repository URL]、[Credentials]项选择之前创建的hg账户. (其他选项可以根据自己的情况和帮助信息填写),示例如下:


 

3)[构建触发器]中包含1.在其他项目构建完成后才执行构建 2. 定期构建(详见帮助信息)


 

4)[构建]此项是执行测试命令的入口,可执行windows系统批处理命令、shell命令、执行ant命令等.

如下图显示[ant -f ci-unittest-build.xml]执行测试ant脚本和[zip -f unittest-report.zip report]将report目录下的测试报告文件打成zip包。



 5)[构建后操作]可配置邮件信息和附件,发送邮件到指定的用户邮箱。(详见帮助信息)


 

3.测试脚本的编写

 例子ant脚本[ci-unittest-build.xml]文件如下:

<?xml version="1.0" encoding="UTF-8"?>

<project name="ci.test.examples"default="findbugs"basedir=".">

       <!--源代码目录-->

       <propertyname="src.dir"location="src"/>

       <!--存放class目录-->

       <propertyname="classes.dir"location="classes"/>

       <!--cobertura解压目录-->

       <propertyname="cobertura.dir"location="../.."/>

       <!--findbugs解压目录-->

       <propertyname="findbugs.dir"location="../../../findbugs-2.0.2/"/>

    <!--instrumented后生成文件的存放目录-->

       <propertyname="instrumented.dir"location="instrumented"/>

       <!--报告存放目录-->

    <propertyname="reports.dir"location="reports"/>

       <!--junit-xml测试结果存放目录-->

       <propertyname="reports.xml.dir"location="${reports.dir}/junit-xml"/>

    <!--junit-html测试报告存放目录-->

       <property      name="reports.html.dir" location="${reports.dir}/junit-html"/>

       <!--cobertura-html测试报告存放目录-->

<propertyname="coverage.html.dir" location="${reports.dir}/cobertura-html"/>

    <!--findbugs-html测试报告存放目录-->

<propertyname="findbugs.html.dir" location="${reports.dir}/findbugs-html"/>

<!--定义cobertura-classpath-->

       <pathid="cobertura.classpath">

             <filesetdir="${cobertura.dir}">

                   <includename="cobertura*.jar"/>

                   <includename="lib/**/*.jar"/>

             </fileset>

       </path>

      <!--定义findbugs-classpath-->

       <pathid="findbugs.classpath">

             <filesetdir="${findbugs.dir}">

                   <includename="**/*.jar"/>

                   <includename="lib/findbugs-ant.jar"/>

             </fileset>

       </path>

       <!--以tasks.properties文件信息创建task。(tasks.properties位于cobertura-2.0.3.jar中)-->

       <taskdefclasspathref="cobertura.classpath"  resource="tasks.properties"/>

       <!--创建目录-->

       <targetname="init">

            <mkdirdir="${classes.dir}"/>
             
<mkdirdir="${instrumented.dir}"/>
             
<mkdirdir="${reports.xml.dir}"/>
             
<mkdirdir="${reports.html.dir}"/>
             
<mkdirdir="${coverage.html.dir}"/>
             
<mkdirdir="${findbugs.html.dir}"/>

       </target>

       <targetname="compile"depends="init"><!--编译源文件-->

             <javacsrcdir="${src.dir}"destdir="${classes.dir}"debug="on"

                           source="1.6"includeantruntime="on">

                   <classpathrefid="cobertura.classpath"/>

             </javac>

       </target>

       <!--构建instrument class文件-->

       <targetname="instrument"depends="init,compile">

             <!--删除旧的"测试覆盖率"文件和旧的"instrumentation"测量文件.-->

             <deletefile="cobertura.ser"/>

             <deletedir="${instrumented.dir}"/>
            <!--构建(Instrument)项目class文件,并将其构建后的文件写入${instrumented.dir}目录中-->

             <cobertura-instrumenttodir="${instrumented.dir}">

                   <!--忽略参照log4j的代码行-->

                   <ignoreregex="org.apache.log4j.*"/>

                     <filesetdir="${classes.dir}">

                         <!--构建(Instrument)*.class文件但不构建*Test.class文件-->

                         <includename="**/*.class"/>

                         <excludename="**/*Test.class"/>

                   </fileset>

             </cobertura-instrument>

       </target>

      

        <!-- 生成测试覆盖率报告(期间会进行JUnit测试) --> 

       <targetname="test"depends="init,compile">

             <!--

                   printsummary表示是否打印基本信息,haltonerror表示测试出现错误是否中止,

                  haltonfailure表示测试失败是否中止,fork必须启用,可设置为"on,true,yes"等

             --> 

              <junitdir="${basedir}"printsummary="on" haltοnerrοr="off"haltonfailure="off"fork="on">

                    <!--
                             Note the classpath order: instrumented classes are before the

                         original (uninstrumented) classes. This is important.

                   -->

                   <classpathlocation="${instrumented.dir}"/>

                   <classpathlocation="${classes.dir}"/>

                   <!--引用instrumented classes的依赖jar包-->

                   <classpathrefid="cobertura.classpath"/>

                   <!--
                         
同时运行多个测试用例,todir用来存放测试的输出结果,如果不指定<formatter/>是不会输出结果到todir中的                         -->

                   <formattertype="plain"usefile="off"/>

                   <formattertype="xml"/>

                   <testname="${testcase}" todir="${reports.xml.dir}"if="testcase"/>

                   <!--执行测试输出xml格式的测试结果-->

                   <batchtesttodir="${reports.xml.dir}"unless="testcase">

                         <filesetdir="${src.dir}">

                               <includename="**/*Test.java"/>

                         </fileset>

                   </batchtest>

             </junit>

             <!--根据上面的测试结果生成html格式的测试报告-->

             <junitreporttodir="${reports.xml.dir}">

                   <filesetdir="${reports.xml.dir}">

                         <includename="TEST-*.xml"/>

                   </fileset>

                   <reportformat="frames"todir="${reports.html.dir}"/>

             </junitreport>

       </target>

<!--执行coverage-->

       <targetname="coverage-check">

             <cobertura-checkbranchrate="34"totallinerate="100"/>

       </target>

      <targetname="alternate-coverage-report">

             <!--生成html格式的测试覆盖率报告-->

             <cobertura-reportdestdir="${coverage.html.dir}">

                   <filesetdir="${src.dir}">

                         <includename="**/*.java"/>

                   </fileset>

             </cobertura-report>

       </target>

<targetname="coverage"depends="compile,instrument,test,alternate-coverage-report"/>

<!--执行findbugs-->

       <!-- 
            taskdef作用是,创建与target名字相同的task,在task被调用时,相应的taskdef中的方法会被执行者
        -->
<taskdef name=
"findbugs"classpathref="findbugs.classpath"
                                classname=
"edu.umd.cs.findbugs.anttask.FindBugsTask"/>

<targetname="findbugs"depends="coverage">

             <!--生成html格式的findbugs报告-->

             <findbugshome="${findbugs.dir}"output="html"

                      outputFile="${findbugs.html.dir}/findbugs.html">

                   <auxClasspathrefid="findbugs.classpath"/>

                   <sourcePathpath="${src.dir}"/>

                   <classlocation="${classes.dir}"/>

             </findbugs>                                                                              

       </target>

</project>

4.构建项目

进入到该项目界面-点击[立即构建]即可


 




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值