之前jenkins里面介绍用findbugs主要是采用maven方式,但是很多情况下,工程项目采用的ant进行编译和打包的,通过jenkins ant findbugs结合的方式也是可以进行持续集成的。 jenkins 的特点就是能将这些工具方便的集成起来,为了与工程本身的耦合减少,所以思路是 ant 编译工程 与ant 调用findbugs 通过jenkins分2步进行,这样方便灵活性更高。
这里介绍一下ant 的安装和配置
一、目标和环境
准备在centos6.5 上安装ant ,配合jenkins 使用,安装环境如下: 192.168.136.144 centos 6.5
通过jenkins 调用 ant 和findbugs 进行工程的jar包或者class 检查
二、ant 的安装和配置
1、下载ant
去ant 官网下载所需要的ant 包,URL为:http://ant.apache.org/bindownload.cgi
因为是在centos上安装,所以选择的包是:
2、部署和配置
将下载的包上传到目标服务器,使用tar 进行解压:
tar -vxf apache-ant-1.10.1-bin.tar.gz
解压后的目录:/home/nmc/dev/apache-ant-1.10.1 有些同学喜欢放到 /opt 目录下,有些喜欢放到 /usr 目录,放哪里看个人喜好。 我是放到 /usr/ant ,所以执行:
mv /home/nmc/dev/apache-ant-1.10.1 /usr/ant
下一步进行配置:
vi /etc/profile
在这个配置文件中,进行如下配置:
export ANT_HOME=/usr/ant
export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH
保存后,退出文件编辑,然后执行:
source /etc/profile
执行这句命令的目的是不启动,立刻生效
最后,验证一下ant 命令是否成功,我们可以执行一下ant ,如果提示没有build.xml 说明ant 本身已经安装配置好了,也可以用ant -version 来查看是否能正确返回版本信息。
[root@cwqsolo apache-ant-1.10.1]# ant
Buildfile: build.xml does not exist!
Build failed
[root@cwqsolo apache-ant-1.10.1]# ant -version
Apache Ant(TM) version 1.10.1 compiled on February 2 2017
三、findbugs的安装和配置
由于findbugs 3.0 需要java 1.7配合,考虑到我们实际工作中,工程项目众多,存在java 1.6 ,1.7, 1.8 并存的情况,所以就采用findbugs 2.0.2(后续证明这是个错误选择,因为2.0.2对1.8 不支持,权衡利弊,所以最后所有工程都需要是用java 1.7 及以上版本。)
1、下载fingbugs
通过下面URL: https://sourceforge.net/projects/findbugs/files/findbugs/2.0.2/ 选择 findbugs-2.0.2.tar.gz 下载,下载传到centos服务器144上,并解压
2、部署
将解压后的目录,通过mv的方式 放置到你想要的目录,本例中为 : /home/nmc/dev/devops/findbugs
其实findbugs目录下,只需要留有lib 目录,其他目录和文件都可以删除(特指在用ant 调用的情况),另外,还需要有一个ant 调用的build 文件,本例子中findbugsbuild.xml
<?xml version="1.0" ?>
<project name="check" default="default" basedir=".">
<property name="src.dir" value="${basedir}/src" />
<property name="class.dir" value="${basedir}/WebRoot/WEB-INF/classes" />
<property name="dist.dir" value="${basedir}/dist" />
<property name="findbugs.dir" value="/home/nmc/dev/devops/findbugs"/>
<path id="findbugs.path">
<fileset dir="${findbugs.dir}">
<include name="**/*.jar" />
</fileset>
</path>
<!-- =================================================================== -->
<!-- Findbugs build -->
<!-- =================================================================== -->
<taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask" classpathref="findbugs.path" />
<target name="findbugs" >
<mkdir dir="${basedir}/findbugs" />
<findbugs home="${findbugs.dir}" output="xml" outputFile="${basedir}/findbugs/findbugs_errors.xml">
<sourcePath path="${src.dir}" />
<class location="${class.di\r}" />
</findbugs>
</target>
<target name="default" depends="findbugs">
</target>
</project>
findbugs 目录情况如下:[root@cwqsolo findbugs]# ls
findbugsBuid.xml lib
[root@cwqsolo findbugs]#
3、手工验证findbugs正常工作
进入测试检查的工程,拷贝findbugsBuid.xml
到工程目录,执行 ant -file findbugsBuid.xml
[root@cwqsolo cwq_testproject1]# ant -f findbugsBuid.xml
Buildfile: /home/nmc/dev/devops/jenkins/workspace/cwq_testproject1/findbugsBuid.xml
findbugs:
[findbugs] Executing findbugs FindBugsTask from ant task
[findbugs] Running FindBugs...
[findbugs] The following classes needed for analysis were missing:
[findbugs] kafka.consumer.ConsumerConfig
[findbugs] kafka.javaapi.consumer.ConsumerConnector
[findbugs] kafka.consumer.KafkaStream
[findbugs] kafka.consumer.ConsumerIterator
[findbugs] kafka.message.MessageAndMetadata
[findbugs] kafka.consumer.Consumer
[findbugs] kafka.producer.ProducerConfig
[findbugs] kafka.producer.KeyedMessage
[findbugs] kafka.javaapi.producer.Producer
[findbugs] kafka.serializer.StringEncoder
[findbugs] Warnings generated: 1
[findbugs] Missing classes: 9
[findbugs] Calculating exit code...
[findbugs] Setting 'missing class' flag (2)
[findbugs] Setting 'bugs found' flag (1)
[findbugs] Exit code set to: 3
[findbugs] Java Result: 3
[findbugs] Classes needed for analysis were missing
[findbugs] Output saved to /home/nmc/dev/devops/jenkins/workspace/cwq_testproject1/findbugs/findbugs_errors.xml
default:
BUILD SUCCESSFUL
Total time: 4 seconds
[root@cwqsolo cwq_testproject1]#
执行后,出现BUILD SUCCESSFUL 就表示成功了。
四、jenkins中配置
jenkins 中构件工程这块就不细说了,只描述一下工程构件基本配置后,如何加入findbugs
1、 添加构建
在原来的构建ant build 动作里面添加一个 拷贝动作,目的是在ant 编译工程后,拷贝代码走查的配置文件,到本工程中
在这个构件动作下,新增一个ant 构建动作,某种程度上,jenkins 就是一个提供界面进行各种动作串联的工具。
然后,在构建后的动作里面,发布一下findbugs的结果(事先要在jenkins中安装findbugs插件,具体看前面的资料)
这些配置好后,就可以保存,进行构建了。
注意findbugs的趋势图,需要构建2次后才会出来,如果一切顺利,大家看到构建趋势图和findbugs的链接,点击链接可以查看具体的bugs项
五:补充:
1、 findbugs 2.0.2报错
[findbugs] Unable to get XClass for java/lang/Class
[findbugs] java.lang.ArrayIndexOutOfBoundsException
[findbugs] Jul 27, 2017 8:17:35 PM edu.umd.cs.findbugs.TextUIBugReporter reportAnalysisError
[findbugs] SEVERE: Couldn't get class info for java/util/concurrent/ConcurrentMap
[findbugs] java.lang.ArrayIndexOutOfBoundsException: 28526
----解决:这个是因为工程是用java 1.8 编译的,选择findbugs 3.0 以上版本
2、 如果你的工程要求jdk 1.7 那么请把ant 降低到 1.9 我用1.9.3 没有问题,否则会出现 jdk版本错误,错误码:52