SonarQube靜態代碼分析實戰

Sonar是一個用於代碼質量管理的開源平臺,用於管理源代碼的質量,可以從七個維度檢測代碼質量,可以通過使用插件機制與 eclipse 和 JIRA 等其他外部工具集成,從而實現了對代碼的質量的全面自動化分析和管理。支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等二十幾種編程語言的代碼質量管理與檢測。
官網:https://www.sonarqube.org
sonarQube可以從如下幾個方面分析代碼中的問題:
1.複雜度分佈
文件、類、方法等,如果複雜度過高將難以改變,這會使得開發人員難以理解它們
2.代碼重複
sonar可以展示源碼中重複嚴重的地方
3.單元測試覆蓋率
sonar可以很方便地統計並展示單元測試覆蓋率
4.代碼標準
sonar可以通過PMD,CheckStyle,Findbugs等代碼規則檢測工具規範代碼編寫
5.代碼註釋
沒有註釋將使代碼可讀性變差,特別是當不可避免地出現人員變動時,程序的可讀性將大幅下降而過多的註釋又會使得開發人員將精力過多地花費在閱讀註釋上,亦違背初衷
6.潛在的bug
sonar可以通過PMD,CheckStyle,Findbugs等等代碼規則檢測工具檢測出潛在的bug
7.糟糕的設計
通過sonar可以找出循環,展示包與包、類與類之間的相互依賴關係;可以檢測自定義的架構規則;通過sonar可以管理第三方的jar包;可以利用LCOM4檢測單個任務規則的應用情況;檢測耦合度

1.配置數據

新建數據庫和訪問用戶(最低MySQL版本5.6)

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.安裝sonarqube

下載最新版本sonarqube,這裏下載的是sonarqube-6.3(jdk要求1.8)
1.配置mysql數據庫

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://10.1.199.168:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
# 連接池根據自己實際情況配置
sonar.jdbc.maxActive=30
sonar.jdbc.maxIdle=5
sonar.jdbc.minIdle=2
sonar.jdbc.maxWait=5000
sonar.jdbc.minEvictableIdleTimeMillis=600000
sonar.jdbc.timeBetweenEvictionRunsMillis=30000

2.web server配置

#jvm配置
sonar.web.javaOpts=-Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError
#綁定主機ip配置
sonar.web.host=0.0.0.0
#訪問端口配置
sonar.web.port=9000
#連接配置
sonar.web.http.maxThreads=50
sonar.web.http.minThreads=5
sonar.web.http.acceptCount=25
#session超時配置,單位分鐘,不能多於3個月
sonar.web.sessionTimeoutInMinutes=4320
#也可以配置sso

3.計算引擎配置
任務處理

#jvm配置
sonar.ce.javaOpts=-Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError
#worker個數,需要考慮資源的消耗
sonar.ce.workerCount=1

4.Elasticsearch配置
用於信息檢索

#jvm
sonar.search.javaOpts=-Xmx1G -Xms256m -Xss256k -Djna.nosys=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly XX:+HeapDumpOnOutOfMemoryError
#http port and host
sonar.search.port=9001
sonar.search.host=127.0.0.1

還是有就是一些日誌和數據目錄配置,jvm需要根據自己的內存情況調整。
5.啓動服務
sonarqube-6.3/bin/linux-x86-64/sonar.sh start
通過9000端口訪問:http://192.168.145.134:9000,登錄默認用戶密碼: admin/admin
注意:配置max file descriptors

vi  /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536

6.漢化
進入Administration模塊,System->Update Center切換到Available,搜索Chinese Pack,安裝(需要從下載漢化jar)即可漢化。如果直接無法安裝,可以下載下來放在extensions/plugins目錄下重啓即可
web主頁

3.代碼分析

當使用 SonarQube對某一個項目進行代碼質量管理時,通常可以採用三種不同的方法來發起代碼分析,分別爲 Analyzing with SonarQube Runner,Analyzing with SonarQube Ant Task 和 Analyzing with Maven 方法。這三種方法的主要區別是 , 它們分別適用於不同架構和組織形式的項目,並且其相應的配置文件的寫法也不盡相同。下面主要說一下Analyzing with SonarQube Runner和Analyzing with Maven

1.Analyzing with SonarQube Runner

該方法適用於所有不同架構的項目,包括沒有使用任何源代碼管理工具的項目形式,以及使用各種不同代碼管理工具(SVN、Git、ClearCase 等)和編譯工具(ant,maven)的項目形式,它都能夠適用。
下載工具並配置:https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
下載安裝後,將bin配置到系統的環境變量裏去。
1.配置sonar-scanner

#----- Default SonarQube server
sonar.host.url=http://192.168.145.134:9000
#----- Default source code encoding
sonar.sourceEncoding=UTF-8

2.在項目工程下新建sonar-project.properties配置文件

# must be unique in a given SonarQube instance
sonar.projectKey=demo:project
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=testDemo
sonar.projectVersion=1.0
# project description 
sonar.projectDescription=test demo
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# Since SonarQube 4.2, this property is optional if sonar.modules is set. 
# If not set, SonarQube starts looking for source code from the directory containing 
# the sonar-project.properties file. multiple comma separated
sonar.sources=.
sonar.language=java
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
#additional parameters
sonar.my.property=zhutw

切換到項目主目錄下命令行運行:sonar-runner,即可完成代碼掃描
如果項目包含多個模塊,則該配置文件應如下圖所示配置:
這裏寫圖片描述

2.Analyzing with Maven

通過mvn sonar:sonar分析代碼將結果提交到數據庫中,SonarQube查詢展示。
安裝並配置 Maven,配置文件爲 setting.xml,添加數據配置

<profiles>
    <profile>
        <id>sonar</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <sonar.jdbc.url><sonar.jdbc.url>jdbc:mysql://10.1.199.168:3306/sonar?useUnicode=true&amp;characterEncoding=utf8</sonar.jdbc.url></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://192.168.145.134:9000</sonar.host.url> 
    <!-- Sonar服務器訪問地址 -->
        </properties>
  </profiles>
  <activeProfiles>  
    <activeProfile>sonar</activeProfile>
  </activeProfiles>

在當前maven項目目錄下運行mvn sonar:sonar,完成即可在SonarQube web頁面查看結果:
這裏寫圖片描述
注:
1.可以在項目pom.xml顯式指定sonar插件的版本以及MySQL的驅動版本

<plugin>
     <groupId>org.codehaus.sonar</groupId>
    <artifactId>sonar-maven-plugin</artifactId>       
    <version>5.1</version>
</plugin>
----------
<build>
    <extensions>
        <extension>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-Java</artifactId>
            <version>5.1.24</version>
        </extension>
    </extensions>
</build>

2.也可以顯式的將sonar綁定到Maven生命週期中,指定Maven的site聲明週期時,則會自動調用sonar.sonar 命令

<plugin>
    <groupId>org.codehaus.sonar</groupId>
    <artifactId>sonar-maven-plugin</artifactId>
    <version>5.1</version>
    <executions>
        <execution>
            <id>sonar</id>
            <phase>site</phase>
            <goals>
                <goal>sonar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

注意sonar:sonar必須單獨執行。如果把sonar:sonar和其他target混在一起,比如mvn clean install sonar:sonar,可能導致不可預期的問題。

4.集成Jenkins

1.安裝Jenkins插件SonarQube Scanner for Jenkins
2.配置SonarQube
打開系統管理->系統設置
這裏寫圖片描述
打開系統管理->Global Tool Configuration
配置好jdk,maven,配置SonarQube Scanner
這裏寫圖片描述
3.新建工程配置
這裏寫圖片描述
這裏寫圖片描述
注:
也可以使用上面的maven分析的方式進行集成。除此之外Analyzing with SonarQube Scanner for MSBuild插件分析,用法和SonarQube Scanner類似。
參考文檔:
1.SonarQube 3.6 代碼質量管理實戰
2.SonarQube中監測循環、包耦合度情況

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章