名词说明:
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.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 <[email protected]>
并在下一行添加你的hg邮箱地址,例如下:
username = "jouken<[email protected]>"
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" haltonerror="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.构建项目
进入到该项目界面-点击[立即构建]即可