随着工作的要求,devops作为今年工作的一个重点,由此也引发了自己对于devops相关的工具和技术的学习和实践。基于上述背景,这个系列将逐步的介绍SVN的安装和配置、jenkins安装和配置、reviewboard、findbugs、checkstyle、sonar、testng、mockito等。【每个合格的程序员都是耐操的】
上一节说了如何通过jenkins进行构建任务集成,现在说一下如何集成findbugs,对java class类进行静态检查。
findbugs是对代码进行静态检查,发现代码中的可能存在的缺陷和不规范的地方,减少隐患,当然findbugs是无法检查代码逻辑的,代码逻辑的检查,应该属于测试范畴。
下面说一下本次实践的目标:
1、在jenkins里面集成 findbugs
2、通过findbugs检查示例代码
3、了解规则含义
4、查找规则是否启用的方法
5、自定义规则的编码方法(简单了解)
在安装之前,简单说明一下环境,和上一节一样,在linux的jenkins上进行findbugs的安装。
首先从jenkins,系统管理进入管理插件界面
我们安装中间的Findbugs Plug-in
安装好了后,在“构建”这里,Goals 项目 填入: findbugs:findbugs 这里填入后,maven在构件项目的时候,会带入这个参数
如果构建的时候,会报出如下问题,说明可能安装没有完全:
回到jenkins系统首页,会发现,如果安装不完整,会有提示
这里的提示是说,少装了一个包,重新进入到插件安装界面,搜索Static Analysis,安装这个插件,就解决analysis-core V1.86 包没有安装的问题。
需要说明的是,如果网络安装失败,确定是网络原因的话,可以从插件的高级功能里面,选取本地安装包,上载到jenkins里。在上述处理后,jenkins进行任务集成,发现构件失败
这里主要是pom.xml还没有修改,可以按下面内容修改
4.0.0
com.newland
StudyKafkaMavenTest
0.0.1-SNAPSHOT
kafka-demo
http://maven.apache.org
UTF-8
org.apache.kafka
kafka_2.10
0.8.2.0
compile
org.codehaus.mojo
findbugs-maven-plugin
3.0.1
true
true
true
如果发现构建成功,但是findbugs 没有动作, 修改配置,在“构建”这里,选中“Publish FindBugs analysis results”
这里results 可以为空,default的会生成如 findbugsXml.xml 和 findBugs.xml 。 这个时候,我们可以继续看一下任务的面板
上图中, 出现FindBugs Warnings 了,可以点开查看里面的内容,下面列出案例中的具体情况
修改文件后,我们重新构建,现在可以看到,解决了问题后,findbugs 不在显示bug列表
findbugs定义了很多规则,下面具一些具体了例子, 如下面这些
Security 关于代码安全性防护
1.Dm: Hardcoded constant database password (DMI_CONSTANT_DB_PASSWORD)
代码中创建DB的密码时采用了写死的密码。
2.Dm: Empty database password (DMI_EMPTY_DB_PASSWORD)
创建数据库连接时没有为数据库设置密码,这会使数据库没有必要的保护。
3.HRS: HTTP cookie formed from untrusted input (HRS_REQUEST_PARAMETER_TO_COOKIE)
此代码使用不受信任的HTTP参数构造一个HTTP Cookie。
4.HRS: HTTP Response splitting vulnerability (HRS_REQUEST_PARAMETER_TO_HTTP_HEADER)
在代码中直接把一个HTTP的参数写入一个HTTP头文件中,它为HTTP的响应暴露了漏洞。
5.SQL: Nonconstant string passed to execute method on an SQL statement (SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE)
该方法以字符串的形式来调用SQLstatement的execute方法,它似乎是动态生成SQL语句的方法。这会更容易受到SQL注入攻击。
6.XSS: JSP reflected cross site scripting vulnerability (XSS_REQUEST_PARAMETER_TO_JSP_WRITER)
在代码中在JSP输出中直接写入一个HTTP参数,这会造成一个跨站点的脚本漏洞。
在上面的例子中,可以看到 每个规则,都用DMI_CONSTANT_DB_PASSWORD 这样的方式来表示。由于规则众多,实际使用时,需要根据自己的要求进行裁剪
findbugs的规则比较多,可以进行裁剪配置,这是通过配置 exclude xml 来实现的,在pom.xml 下,增加 exlcude.xml 配置
在pom.xml 平级的目录,建立一个规则例外文件 findbugs-exclude.xml, 具体内容如下
就是要把你排除检查的规则,写进入,注意,如果/Match 节点里面内容不配置,那就是全部都不纳入检查。
同样,可以设置include文件
在pom.xml 中设置:
findbugs-exclude.xml
findbugs-include.xml
在上面的案例里面, DM_DEFAULT_ENCODING,就是扫出来的内容,可以配置后,进行规则排除,下面图中,bugs趋势图中的回落就是做实验的效果
最后简单介绍一下自定义规则的开发流程:
1、首先下载findbugs 源码包
2、开发自己的规则,编译
3、修改findbugs里面的规则文件findbugs-plugin.jar中message.xml,findbugs.xml,z加入二进制的class 文件
4、打包成功后,在可运行版本的findbugs中替换原来的/lib/findbugs.jar