配置sonar、jenkins進行持續審查

本文以CentOS操做系統爲例介紹Sonar的安裝配置,以及如何與Jenkins進行集成,經過pmd-cpd、checkstyle、findbugs等工具對代碼進行持續審查。html

1、安裝配置sonar

一、Sonar介紹

Sonar是一個用於代碼質量管理的開源平臺,用於管理Java源代碼的質量。經過插件機制,Sonar 能夠集成不一樣的測試工具,代碼分析工具,以及持續集成工具,好比pmd-cpd、checkstyle、findbugs、Jenkins。經過不一樣的插件對這些結果進行再加工處理,經過量化的方式度量代碼質量的變化,從而能夠方便地對不一樣規模和種類的工程進行代碼質量管理。java

同時 Sonar 還對大量的持續集成工具提供了接口支持,能夠很方便地在持續集成中使用 Sonar。python

此外,Sonar 的插件還能夠對 Java 之外的其餘編程語言提供支持,對國際化以及報告文檔化也有良好的支持。mysql

二、配置數據庫linux

Apache Derby 是Sonar自帶而且默認安裝使用的數據庫,此外Sonar對以下數據庫提供支持:MySQL 5.x, Oracle 10g XE, Postgresql, MS SqlServer等,本文以mysql爲例介紹如何配置數據庫: sql

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配置數據庫:api

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包所有刪除,從新加入本地語言包後,從新打包部署便可。

三、安裝、配置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並設置爲自啓動服務 

四、配置爲自啓動服務

使用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

五、配置插件

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。

 

2、與jenkins集成

一、經過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 命令.

二、直接與Jenkins集成

在jenkins的插件管理中選擇安裝sonar jenkins plugin,該插件可使項目每次構建都調用sonar進行代碼度量。

進入配置頁面對sonar插件進行配置,以下圖:

配置構建項目,增長Post Build Action:

 

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

相關文章
相關標籤/搜索