編寫SonarQube自定義Java和Xml規則

由於工做須要最近接觸到了SonarQube,須要根據項目自定義Java和Xml規則,因爲國內的資料實在是比較少,而且官網的資料全是英文的,看起來實在是頭疼,因此但願寫點資料可以幫助到其餘人。
官網地址:https://www.sonarqube.org
在此感謝hu_qingen (古月隨筆) 和 馮澍雨 提供的幫助html

基本思路

一、下載官方提供的規則插件包
二、根據需求編寫規則類
三、編譯打包
四、上傳自定義規則插件java

下載地址:
一、Java自定義規則插件:
https://github.com/SonarSourc...git

二、Xml自定義規則插件:
https://sonarsource.bintray.c...github

開發環境

JDK1.8以上
Mavean
Jenkinsjson

編寫方法

目前SonarQube自定義規則支持的方式有兩種: 編寫java類和編寫XPath表達式,這兩種方式都是基於AST(Abstract Syntax Tree抽象語法樹)語法結構來實現的。
一、Xpath方式
需求:
從Java代碼中查找是否存在 while {}這種語法結構 工具

表達式代碼:
//WhileStatement[not(Statement/Block)]單元測試

步驟:
將表達式代碼放入自定義規則插件中的Expression中學習

clipboard.png

這種方式須要藉助第三方工具來寫表達式,而且要對Xpath語法比較熟練,我以爲並非很強大,須要花必定的時間學習。測試

二、Java方式
需求:從Xml文件中查找,元素是否存在「zbc_test」這樣的內容
步驟:
① 建立自定義規則類
sonar-xml-plugin/src/main/java/org/sonar/plugins/checkspa

clipboard.png

② 根據規則需求編寫代碼

clipboard.png

③ 註冊新加入的規則

clipboard.png

④ 編寫規則描述及等級分類文件,名字要和規則類中的Key相同或者規則類名相同

sonar-xmlplugin/src/main/resources/org/sonar/l10n/xml/rules/xml/DbSchemalCheck.html

clipboard.png

sonar-xml-plugin/src/main/resources/org/sonar/l10n/xml/rules/xml/DbSchemalCheck.json

clipboard.png

編譯打包

Eclipse選擇要編譯打包的項目文件,使用Maven進行編譯,若是編譯時不須要進行單元測試,能夠跳過測試。

clipboard.png

編譯成功

clipboard.png

將編譯好的插件上傳至指定路徑:/sonarqube-6.3/extensions/plugins

clipboard.png

從新啓動SonarQube,進入菜單Administration—System - Update Center 查看自定義規則插件是否安裝成功

clipboard.png

clipboard.png

查看自定義規則

進入SonarQube - Rules 選擇XML能夠查看剛剛編寫的自定義規則:

clipboard.png

自定義規則的描述以下:
clipboard.png

測試自定義規則

兩種方法,編寫單元測試類和手工測試,須要根據規則的複雜程度進行選擇。
編寫Java單元測試類:
java-custom-rules/src/test/java/org/sonar/samples/java/checks/MyCustomSubscriptionRuleTest.java

clipboard.png

編寫Xml單元測試類:

sonar-xml-plugin/src/test/java/org/sonar/plugins/xml/checks/IllegalTabCheckTest.java

手工測試:

進入Jenkins,選擇要掃描的項目進行構建,構建完成後點擊右側的SonarQube藍色圖標,查看掃描結果

clipboard.png

選擇左側的選項,查看全部存在問題的文件和錯誤規則

clipboard.png

點擊文件名查看全部掃描出來的錯誤代碼及說明

clipboard.png

總結

剛開始覺得只要寫幾個表達式,就能夠很方便實現複雜的規則,可是摸索了幾天查了幾天的Google ,才知道仍是要下載官方的自定義規則插件,而後用Java編寫本身的規則類,饒了一大圈很累。我還下載了其餘的一些SonarQube插件,經過查看代碼發現,基本都遵照並實現了官方的Plugin接口

相關文章
相關標籤/搜索