本文以CentOS操作系統為例介紹Sonar的安裝配置,以及如何與Jenkins進行集成,通過pmd-cpd、checkstyle、findbugs等工具對代碼進行持續審查。
一、安裝配置sonar
1、Sonar介紹
Sonar是一個用於代碼質量管理的開源平台,用於管理Java源代碼的質量。通過插件機制,Sonar 可以集成不同的測試工具,代碼分析工具,以及持續集成工具,比如pmd-cpd、checkstyle、findbugs、Jenkins。通過不同的插件對這些結果進行再加工處理,通過量化的方式度量代碼質量的變化,從而可以方便地對不同規模和種類的工程進行代碼質量管理。
同時 Sonar 還對大量的持續集成工具提供了接口支持,可以很方便地在持續集成中使用 Sonar。
此外,Sonar 的插件還可以對 Java 以外的其他編程語言提供支持,對國際化以及報告文檔化也有良好的支持。
2、配置數據庫
Apache Derby 是Sonar自帶並且默認安裝使用的數據庫,此外Sonar對如下數據庫提供支持:MySQL 5.x, Oracle 10g XE, Postgresql, MS SqlServer等,本文以mysql為例介紹如何配置數據庫:
1)創建數據庫
在mysql中執行如下腳本創建數據庫及mysql用戶
CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; |
CREATE USER 'sonar' IDENTIFIED BY 'sonar'; |
2)編輯${SONAR_HOME}/conf/sonar.properties配置數據庫:
sonar.jdbc.username: sonar |
3)配置DB驅動包
如果使用Oracle數據庫,必須手動復制驅動類到${SONAR_HOME}/extensions/jdbc-driver/oracle/目錄下。其它支持的數據庫默認提供了驅動,http://docs.codehaus.org/display/SONAR/Analysis+Parameters 列舉了一些常用的配置及默認值.
4)常見錯誤及解決方法
添加語言包后,啟動報錯分析:
下載安裝 sonar-l10n-zh-plugin-1.4.jar 語言包(http://docs.codehaus.org/display/SONAR/Chinese+Pack),重新打包部署后,后台報錯如下:
Error in Sonar.log : 2012.10.25 14:39:15 INFO org.sonar.INFO Register rules [squid/java]...2012.10.25 14:39:15 ERROR o.s.s.p.Platform The following rule (repository: squid) must have a description: Rule[id=<null>,name=<null>, key=ParsingError,configKey=ParsingError,plugin=squid,enabled=true,severity=MAJOR, cardinality=SINGLE]org.sonar.api.utils.SonarException: The following rule (repository: squid) must have a description: Rule[id=<null>,name=<null>,key=ParsingError,configKey=ParsingError, plugin=squid,enabled=true,severity=MAJOR,cardinality=SINGLE]at org.sonar.server.startup.RegisterRules.validateRule(RegisterRules.java:131) ~[classes/:na]at org.sonar.server.startup.RegisterRules.registerRepository(RegisterRules.java:103) ~[classes/:na]at... |
解決方法:將 extensions\plugins\ 目錄下的jar包全部刪除,重新加入本地語言包后,重新打包部署即可。
3、安裝、配置Sonar
Sonar的運行需要 JDK 1.5+ , 從 http://www.sonarqube.org/downloads/ 下載sonar zip文件,本文以3.6版本為例。
創建運行sonar的CentOS賬戶sonar,並設置賬戶密碼:
# useradd sonar |
使用sonar賬戶登錄CentOS。
Sonar默認集成了jetty容器,可以直接啟動提供服務,也可以通過腳本構建為war包,部署在tomcat容器中。
1)直接啟動
編輯.bash_profile,添加環境變量SONAR_HOME
$ vi $HOME/.bash_profile |
修改成如下內容:
PATH=$PATH:$HOME/bin |
使環境變量生效
Source $HOME/.bash_profile |
運行如下命令啟動sonar,其它操作系統sonar均提供了啟動腳本
$ ${SONAR_HOME}/bin/linux-x86-64/sonar.sh start |
在瀏覽器中訪問: http://localhost:9000/ ,運行界面如下:
Sonar默認的端口是”9000”、默認的上下文路徑是”/”、默認的網絡接口是”0.0.0.0”,默認的管理員帳號和密碼為:admin/admin,這些參數都可以在配置文件中修改:
$ vi ${SONAR_HOME}/conf/sonar.properties |
2)作為Web項目,部署到Tomcat等應用服務器中
a. 確保conf/sonar.properties、conf/wrapper.conf未被修改使用過
b. 執行如下命令生成war包,將生成的sonar.war部署到應用服務器中
$ ${SONAR_HOME}/war/build-war.sh |
c. 啟動Tomcat, 通過 http://localhost:8080/sonar 訪問.
Tomcat安裝配置參見:CenOS系統中安裝Tomcat7並設置為自啟動服務
4、配置為自啟動服務
使用root賬戶或者開啟sudo權限操作。
創建自啟動腳本文件/etc/init.d/sonar
# vi /etc/init.d/sonar |
添加如下內容
#!/bin/sh |
添加啟動服務
# ln -s $SONAR_HOME/bin/linux-x86-64/sonar.sh /usr/bin/sonar |
5、配置插件
a)插件介紹
Sonar支持多種插件,插件的下載地址為:http://docs.codehaus.org/display/SONAR/Plugin+Library
將下載后的插件上傳到${SONAR_HOME}extensions\plugins目錄下,重新啟動sonar。
sonar默認集成了Java Ecosystem插件,該插件是一組插件的合集
1)Java [sonar-java-plugin]:java源代碼解析,計算指標等
2)Squid [sonar-squid-java-plugin]:檢查違反Sonar定義規則的代碼
3)Checkstyle [sonar-checkstyle-plugin]:使用CheckStyle檢查違反統一代碼編寫風格的代碼
4)FindBugs [sonar-findbugs-plugin]:使用FindBugs檢查違反規則的缺陷代碼
5)PMD [sonar-pmd-plugin]:使用pmd檢查違反規則的代碼
6)Surefire [sonar-surefire-plugin]:使用Surefire執行單元測試
7)Cobertura [sonar-cobertura-plugin]:使用Cobertura獲取代碼覆蓋率
8)JaCoCo [sonar-jacoco-plugin]:使用JaCOCO獲取代碼覆蓋率
下面列出了一些常用的插件:
1)JavaScript代碼檢查:http://docs.codehaus.org/display/SONAR/JavaScript+Plugin
2)python代碼檢查:http://docs.codehaus.org/display/SONAR/Python+Plugin
3)Web頁面檢查(HTML、JSP、JSF、Ruby、PHP等):http://docs.codehaus.org/display/SONAR/Web+Plugin
4)xml文件檢查:http://docs.codehaus.org/display/SONAR/XML+Plugin
5)scm源碼庫統計分析:http://docs.codehaus.org/display/SONAR/SCM+Stats+Plugin
6)文件度量:http://docs.codehaus.org/display/SONAR/Tab+Metrics+Plugin
7)中文語言包:http://docs.codehaus.org/display/SONAR/Chinese+Pack
8)時間表顯示度量結果:http://docs.codehaus.org/display/SONAR/Timeline+Plugin
9)度量結果演進圖:http://docs.codehaus.org/display/SONAR/Motion+Chart+Plugin
b)插件配置示例(本段內容來自http://www.ibm.com/developerworks/cn/java/j-lo-sonar/)
Sonar 的主要特色是對不同工具產生的檢查結果進行再加工處理,Sonar 還向用戶提供了對數據進行個性化處理的方法。
本節以 Technical Debt 插件為例說明如何通過設置參數影響最后的報告結果。首先了解一下這個插件中的“技術債務”的概念,這個概念最早是在 1992 年由 Ward Cunningham 在他的論文“The WyCash Portfolio Management System”中提出的,之后被軟件工程界接受並推廣,《重構》的作者 Martin Fowler 也在其 網站上對技術債務有所介紹。其實原理可以理解為“出來混早晚要還的”,當前不規范的代碼,會對以后產品修改的成本造成影響。
Soanr 的 Technical Debt 插件提供了默認的計算公式,通過對其中的權重參數進行配置,可以適應不同公司和項目對技術債務的計算。
以上的各項數據指標,可以根據自己公司和項目的不同情況進行設置,如圖所示:
例如默認參數下同一個項目的技術債務指標如下:
修改了參數后的結果為:
可見將 Average time to cover complexity of one (in hours) 從 0.2 修改為 0.01 后,Coverage 的權重變小了,從而達到忽略單元測試覆蓋率的作用。不同的公司和項目可以根據需要調整各自的參數,參數的調優和策略不在本文的討論范圍之內。
通過以上的示例可以看出,Sonar 使用不同類型的圖表顯示給用戶代碼質量的結果,並且這些圖表不是簡單地對單元測試覆蓋率或者靜態檢測工具的結果進行顯示,而是根據軟件工程理論進行了二次加工后的結果,更加科學和直觀。
c)更新中心
以管理員用戶登錄Sonar,進入配置->系統,選擇更新中心,如圖:
其中Available Plugins選項卡提供了可以選擇安裝的插件,System Updates可以在線更新Sonar。
下載插件需要注意其中有些插件是需要購買才能使用的,其License類型為Commercial。
二、與jenkins集成
1、通過Maven進行集成
修改maven的主配置文件(${MAVEN_HOME}/conf/settings.xml文件或者 ~/.m2/settings.xml文件),在其中增加訪問Sonar數據庫及Sonar服務地址,添加如下配置:
<profile> <id>sonar</id> <properties> <sonar.jdbc.url>jdbc:mysql://localhost:3306/sonar</sonar.jdbc.url> <sonar.jdbc.driver>com.mysql.jdbc.Driver</sonar.jdbc.driver> <sonar.jdbc.username>sonar</sonar.jdbc.username> <sonar.jdbc.password>sonar</sonar.jdbc.password> <sonar.host.url>http://localhost:9000</sonar.host.url> <!-- Sonar服務器訪問地址 --> </properties> </profile> <activeProfiles> <activeProfile>sonar</activeProfile> </activeProfiles> |
此處注意sonar.host.url地址應根據sonar部署情況修改
同樣,為了避免內存溢出,推薦增加內存堆棧的大小。設置MAVEN_OPTS環境變量:
set MAVEN_OPTS=”-Xmx512m -XX:MaxPermSize=256m” |
使用Sonar
a. 運行Sonar服務器;
b. 通過 mvn sonar:sonar 將代碼注入到Sonar中進行分析處理,並將處理結果以XML的形式保存在數據庫中;
c. 通過瀏覽器訪問,顯示分析結果;
d. 持續運行Maven構建,會迭代顯示分析結果;
e. 可以顯式指定sonar插件的版本,如下:
<project> |
f. 可以顯式的將sonar綁定到Maven生命周期中,如下:
<plugin> |
此時,指定Maven的site聲明周期時,則會自動調用sonar.sonar 命令.
2、直接與Jenkins集成
在jenkins的插件管理中選擇安裝sonar jenkins plugin,該插件可以使項目每次構建都調用sonar進行代碼度量。
進入配置頁面對sonar插件進行配置,如下圖:
配置構建項目,增加Post Build Action:
應用程序構建時就會自動觸發Sonar對代碼的檢查