隨着工作的要求,devops作爲今年工作的一個重點,由此也引發了自己對於devops相關的工具和技術的學習和實踐。基於上述背景,這個系列將逐步的介紹SVN的安裝和配置、jenkins安裝和配置、reviewboard、findbugs、checkstyle、sonar、testng、mockito等。【每個合格的程序員都是耐操的】
上一節說了如何通過jenkins進行構建任務集成,現在說一下如何集成findbugs,對java class類進行靜態檢查。
一、目標
findbugs是對代碼進行靜態檢查,發現代碼中的可能存在的缺陷和不規範的地方,減少隱患,當然findbugs是無法檢查代碼邏輯的,代碼邏輯的檢查,應該屬於測試範疇。
下面說一下本次實踐的目標:
1、在jenkins裏面集成 findbugs
2、通過findbugs檢查示例代碼
3、瞭解規則含義
4、查找規則是否啓用的方法
5、自定義規則的編碼方法(簡單瞭解)
二、findbugs的安裝
在安裝之前,簡單說明一下環境,和上一節一樣,在linux的jenkins上進行findbugs的安裝。
首先從jenkins,系統管理進入管理插件界面
我們安裝中間的Findbugs Plug-in
安裝好了後,在“構建”這裏,Goals 項目 填入: findbugs:findbugs 這裏填入後,maven在構件項目的時候,會帶入這個參數
如果構建的時候,會報出如下問題,說明可能安裝沒有完全:
回到jenkins系統首頁,會發現,如果安裝不完整,會有提示
這裏的提示是說,少裝了一個包,重新進入到插件安裝界面,搜索Static Analysis,安裝這個插件,就解決analysis-core V1.86 包沒有安裝的問題。
需要說明的是,如果網絡安裝失敗,確定是網絡原因的話,可以從插件的高級功能裏面,選取本地安裝包,上載到jenkins裏。在上述處理後,jenkins進行任務集成,發現構件失敗
這裏主要是pom.xml還沒有修改,可以按下面內容修改
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.newland</groupId>
<artifactId>StudyKafkaMavenTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>kafka-demo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.10</artifactId>
<version>0.8.2.0</version>
</dependency>
</dependencies>
<build>
<defaultGoal>compile</defaultGoal>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<findbugsXmlOutput>true</findbugsXmlOutput>
<findbugsXmlWithMessages>true</findbugsXmlWithMessages>
<xmlOutput>true</xmlOutput>
</configuration>
</plugin>
</plugins>
</build>
</project>
如果發現構建成功,但是findbugs 沒有動作, 修改配置,在“構建”這裏,選中“Publish FindBugs analysis results”
這裏results 可以爲空,default的會生成如 findbugsXml.xml 和 findBugs.xml 。 這個時候,我們可以繼續看一下任務的面板
上圖中, 出現FindBugs Warnings 了,可以點開查看裏面的內容,下面列出案例中的具體情況
修改文件後,我們重新構建,現在可以看到,解決了問題後,findbugs 不在顯示bug列表
三、findbugs的規則
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的規則配置
findbugs的規則比較多,可以進行裁剪配置,這是通過配置 exclude xml 來實現的,在pom.xml 下,增加 exlcude.xml 配置
在pom.xml 平級的目錄,建立一個規則例外文件 findbugs-exclude.xml, 具體內容如下
<FindBugsFilter>
<Match>
<!--
<Bug pattern="URF_UNREAD_FIELD,UUF_UNUSED_FIELD,DLS_DEAD_LOCAL_STORE,UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD,RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE,URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD,RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE"/>
-->
<Bug pattern="DM_DEFAULT_ENCODING"></Bug>
<Bug pattern="DLS_DEAD_LOCAL_STORE"/>
<!--
<Bug pattern="UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD"/>
<Bug pattern="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE"/>
-->
</Match>
</FindBugsFilter>
就是要把你排除檢查的規則,寫進入,注意,如果/Match 節點裏面內容不配置,那就是全部都不納入檢查。
同樣,可以設置include文件
在pom.xml 中設置:
<configuration>
<excludeFilterFile>findbugs-exclude.xml</excludeFilterFile>
<includeFilterFile>findbugs-include.xml</includeFilterFile>
</configuration>
在上面的案例裏面, DM_DEFAULT_ENCODING,就是掃出來的內容,可以配置後,進行規則排除,下面圖中,bugs趨勢圖中的回落就是做實驗的效果
五、自定義規則
最後簡單介紹一下自定義規則的開發流程:
1、首先下載findbugs 源碼包
2、開發自己的規則,編譯
3、修改findbugs裏面的規則文件findbugs-plugin.jar中message.xml,findbugs.xml,z加入二進制的class 文件
4、打包成功後,在可運行版本的findbugs中替換原來的/lib/findbugs.jar