背景
最近關注程式碼質量管理工具,用過了阿里的開發者規範外掛後,又看了下 Sonar ,弄明白這個工具的使用流程花費了小半天的時間,這裡整理下其中的盲點。說來也奇怪,搜尋到的 IDEA 整合 Sonar 的文章也不少,就是沒有一篇能教會我這個初次接觸 Sonar 的人。還得靠自己連蒙帶猜地各種嘗試,才搞明白整個過程。
相關的模組及關係Sonar :該工具的統稱SonarLint:IDEA 的 Sonar 外掛SonarQube:一個 Web 應用,服務端,統一管理 Sonar 掃描結果、掃描規則配置sonar-maven-plugin:Sonar 客戶端,從 SonarQube 伺服器獲取掃描規則,並上傳掃描結果到 SonarQube 平臺外掛安裝外掛的安裝比較簡單,這個基本上不會有問題,在外掛倉庫中搜索 “SonarLint” 外掛,找到外掛後點擊安裝即可。本機已經安裝過了,結果如下:
可能是我本機使用的 IDEA 版本【2016.3.1】比較老,所以外掛安裝完成後,只有在某個檔案編輯頁面右鍵才有 “Analyze with SonarLint” 操作,而在工程上右鍵,網上都說選單位於 Analyze 中:
我的 IDEA 中找不到這個操作,但是選中某個資料夾後,可以透過快捷鍵【Ctrl+Shif+S】對該目錄進行掃描,透過進度條可以知道它掃描的是整個目錄:
在單個檔案中,右鍵有掃描操作:
注意點:外掛安裝成功後,可以直接進行掃描,雖然當前版本的 IDEA 工程右鍵沒有這個操作,但是快捷鍵可以用,說明外掛安裝成功。
SonarQube 啟動SonarQube 是 Sonar 的 Web 管理應用,非解壓版的,下載地址 。
由於這是一個 Web 應用,需要用到資料庫,需要建立一個數據庫,名稱沒有限制,需要修改配置檔案中的資料庫連線資訊。操作過程:
本地資料庫用 MySQL ,建立一個名為 sonar 的資料庫解壓 SonarQube ,定位到配置檔案目錄 E:\software\sonarqube-7.6\conf修改 sonar.properties 檔案,在 28 行新增如下配置:sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=falsesonar.jdbc.username=rootsonar.jdbc.password=123456sonar.sorceEncoding=UTF-8sonar.login=adminsonar.password=admin
進入 bin 目錄找到跟自己主機一致的目錄 E:\software\sonarqube-7.6\bin\windows-x86-64執行 StartSonar.bat 啟動 SonarQube注意點:StartSonar.bat 會啟動一個 DOS 視窗執行,首次啟動時耗時較長。此外,關閉 DOS 介面時,後臺對應的 Java 程序不會結束。
SonarQube 建立工程SonarQube 啟動後,訪問 http://localhost:9000 進入其登入介面,輸入 sonar.properties 中配置的帳號和密碼後進入主介面:
注意點:如果外掛配置認證方式為 Token ,那麼這裡需要記錄該專案的 Token 資訊。
外掛配置IDEA 中需要配置 SonarQube 的訪問地址和工程,配置方法為:
1.開啟外掛通用配置介面
3.下一步配置認證資訊
認證方式有兩種,Token 和密碼,Token 即前面建立專案時生成的 Token 資訊。這裡選擇密碼方式,輸入 SonarQube 訪問密碼:
4.SonarLint 專案配置
至此,IDEA 外掛 SonarLint 和 SonarQube 關聯配置完成。
maven-sonar 外掛maven-sonar 外掛,本質是一個 sonar-runner 掃描工具,也是一個客戶端。根據 官方 maven-sonar 外掛配置教程 完成 Maven setting.xml 配置。
1.新增 maven-sonar 外掛
在 pluginGroups 節點下,新增一個子節點:
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
2.新增 sonar 的 profile
在 profiles 節點下新增一個子節點,配置 sonar 外掛的主機 URL:
在待掃描工程的 pom.xml 檔案中,新增 build 外掛,配置 maven-sonar 外掛版本:
<plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>3.6.0.1398</version> </plugin>
maven 執行掃描命令
直接執行 maven 生命週期中的各種方法,都不能完成 soanr 程式碼掃描及結果上傳。官方是透過執行mvn sonar:sonar 命令完成的,所以想到的辦法是在 IDEA 的 termianl 控制介面執行該命令,測試它的確能完成掃描結果的上傳:
執行成功結果為:
maven-sonar 外掛使用的注意點:不能對 SVN 伺服器端版本較低的 SVN 專案進行掃描,否則會執行失敗。錯誤資訊如下:
Error when executing blame for file src/main/java/com/xxxx/SpringContextUtil.java: svn: E200007: Retrieval of mergeinfo unsupported by svn:url
網上找的解決辦法不生效,所以只能對本地非 SVN 專案進行程式碼掃描。
掃描結果檢視mvn sonar:sonar 命令執行完成後,訪問 SonarCube 主頁能檢視最新的掃描結果:
Issues 選單下,選擇 All 而不是 My Issues ,貌似它可以對掃描到的 Issues 進行分配,這裡能看到所有的問題。Project 選單下,呈現各個專案的,這裡使用命令執行後,自動建立了一個與工程應用名相同的專案:
啟示錄反覆執行掃描後,發現 SonarLint 外掛的功能跟 maven-sonar 外掛是一樣的。理論上來講,透過 SonarLint 功能,即對某個功能執行 Analyze with SonarLint 與在終端執行 mvn sonar:sonar 命令效果應該一樣才對。
maven 的 setting.xml 中只配置了 SonarQube 的 host.url ,並沒有指定專案名稱,所以執行完成 mvn sonar:sonar 命令後,在 Web 頁面會自動建立一個與掃描工程名稱一樣的專案。
而前面對外掛配置的 SonarQube Server 和 project 指定是針對 Analyze with SonarLint 的,手動執行該操作後,理論上應該在對應的專案中看到掃描結果的。可惜,我這個 IDEA 版本下沒有完成掃描結果的上傳。