前幾天因部門要求且建議自研代碼掃描規則,故研究了幾天sonarqube的規則jar包結構,總結下。
截圖是一個xml代碼掃描規則的內部結構:如圖所示,箭頭指向的地方,就是規則所在之處!
再展開checks看看:箭頭指向的地方,就是我自定義的規則,用於檢查pom文件
因為注釋中出現了公司的名字,暫時馬賽克掉。
截圖中信息量不少,故截了一部分來解釋:
1. @Rule(key = DependencyCheck.RULE_KEY)
這是用於sonar規則的注解, 注解的實現來自org.sonar.check.Rule + org.sonar.check.RuleProperty,sonar平台也為自定義規則提供了支持。
RULE_KEY, 就是規則ID, 用於區分規則的唯一ID.
2. 特別提一下XmlFile, 這是sonar提供的對Xml定義的工具類,要如何開始掃描,就是從scanFile進入。同樣的,對於java/JS/py等常用的文件后綴,sonar也會提供類似的工具類,如果沒有,自定義也是一個好辦法。
3. scanFile的內部,就是規則的實現方法了。
一般邏輯是:逐行掃描每行代碼並檢查,如果符合規則,放過,如果不符合規則,就在該行的第幾列報告發現問題,及對應規則是什么,然后執行reportIssue的方法。reportIssue()——這個方法來自於sonar提供的sonarXmlCheck的基類,並且已有實現方法:
該方法 如下:
只要實現好這幾個,在CheckList中增加自己的規則類,一個規則就寫好了~ PS, sonar提供的規則sample中要求寫好單元測試,因此這一步也不能漏,單元測試由於在打包時可跳過,故暫時不再介紹。
不過,寫一個規則,需要哪些依賴,sonar提供的工具類從哪來?
<artifactId>XXX-xml-plugin</artifactId>
<packaging>sonar-plugin</packaging>
注意看packaging, 定義了打包形式,對這一類型的支持是由sonar的plugin實現的:
其他的,想到了再寫吧,done~