配置sonar和jenkins進行程式碼審查

iTech發表於2016-02-16

轉自:  http://www.cnblogs.com/gao241/p/3190701.html, 版權歸原作者所有。

 

本文以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';
GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
FLUSH PRIVILEGES;

2)編輯${SONAR_HOME}/conf/sonar.properties配置資料庫:

複製程式碼
sonar.jdbc.username:                       sonar
sonar.jdbc.password:                       sonar
sonar.jdbc.url:                            jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true

# Optional properties
sonar.jdbc.driverClassName:                com.mysql.jdbc.Driver
複製程式碼

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...

(可參考http://jira.codehaus.org/browse/SONAR-3910)

解決方法:將 extensions\plugins\ 目錄下的jar包全部刪除,重新加入本地語言包後,重新打包部署即可。

3、安裝、配置Sonar

Sonar的執行需要 JDK 1.5+ , 從 http://www.sonarqube.org/downloads/ 下載sonar zip檔案,本文以3.6版本為例。

建立執行sonar的CentOS賬戶sonar,並設定賬戶密碼:

# useradd sonar
# passwd sonar

使用sonar賬戶登入CentOS。

Sonar預設整合了jetty容器,可以直接啟動提供服務,也可以通過指令碼構建為war包,部署在tomcat容器中。

1)直接啟動

編輯.bash_profile,新增環境變數SONAR_HOME

$ vi $HOME/.bash_profile

修改成如下內容:

PATH=$PATH:$HOME/bin
SONAR_HOME=$HOME/sonar

export PATH SONAR_HOME

使環境變數生效

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
#
# rc file for SonarQube
#
# chkconfig: 345 96 10
# description: SonarQube system (www.sonarsource.org)
#
### BEGIN INIT INFO
# Provides: sonar
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: SonarQube system (www.sonarsource.org)
# Description: SonarQube system (www.sonarsource.org)
### END INIT INFO

/usr/bin/sonar $*
複製程式碼

新增啟動服務

# ln -s $SONAR_HOME/bin/linux-x86-64/sonar.sh /usr/bin/sonar
# chmod 755 /etc/init.d/sonar
# chkconfig --add sonar

5、配置外掛

a)外掛介紹

Sonar支援多種外掛,外掛的下載地址為:http://docs.codehaus.org/display/SONAR/Plugin+Library

將下載後的外掛上傳到${SONAR_HOME}extensions\plugins目錄下,重新啟動sonar。

sonar預設整合了Java Ecosystem外掛,該外掛是一組外掛的合集

  • Java [sonar-java-plugin]:java原始碼解析,計算指標等
  • Squid [sonar-squid-java-plugin]:檢查違反Sonar定義規則的程式碼
  • Checkstyle [sonar-checkstyle-plugin]:使用CheckStyle檢查違反統一程式碼編寫風格的程式碼
  • FindBugs [sonar-findbugs-plugin]:使用FindBugs檢查違反規則的缺陷程式碼
  • PMD [sonar-pmd-plugin]:使用pmd檢查違反規則的程式碼
  • Surefire [sonar-surefire-plugin]:使用Surefire執行單元測試
  • Cobertura [sonar-cobertura-plugin]:使用Cobertura獲取程式碼覆蓋率
  • JaCoCo [sonar-jacoco-plugin]:使用JaCOCO獲取程式碼覆蓋率

下面列出了一些常用的外掛:

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>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.codehaus.sonar</groupId>
                        <artifactId>sonar-maven-plugin</artifactId>
                        <version>3.5.1</version>
                    </plugin>
                </plugins>
            </build>
        </project> 
複製程式碼

f. 可以顯式的將sonar繫結到Maven生命週期中,如下: 

複製程式碼
        <plugin>  
            <groupId>org.codehaus.sonar</groupId>
            <artifactId>sonar-maven-plugin</artifactId>
            <version>3.5.1</version>
            <executions>
                <execution>
                    <id>sonar</id>
                    <phase>site</phase>
                    <goals>
                    <goal>sonar</goal>
                    </goals>
                </execution>
            </executions>
      </plugin>
複製程式碼

此時,指定Maven的site宣告週期時,則會自動呼叫sonar.sonar 命令.

2、直接與Jenkins整合

在jenkins的外掛管理中選擇安裝sonar jenkins plugin,該外掛可以使專案每次構建都呼叫sonar進行程式碼度量。

進入配置頁面對sonar外掛進行配置,如下圖:

配置構建專案,增加Post Build Action:

 

應用程式構建時就會自動觸發Sonar對程式碼的檢查

相關文章