代碼質量管理平臺SonarQube安裝、配置及集成Jacoco方案

目錄

1、SonarQube簡介

1.1 介紹

1.2 使用範圍

1.3 工作原理

1.4 擴展性

2、SonarQube安裝、配置

2.1 前置條件

2.2 配置工作

3、Sonar Scanner安裝、配置

3.1 配置工作

3.2 運行

4、Jacoco、maven與SonarQube的集成

4.1 前置條件

4.2 配置工作

4.3 運行

5、結束語


1、SonarQube簡介

1.1 介紹

       SonarQube是一個用於代碼質量管理的開源平臺,用於管理源代碼的質量。同時  SonarQube 還對大量的持續集成工具提供了接口支持,可以很方便地在持續集成中使用  SonarQube。此外, SonarQube 的插件還可以對 Java 以外的其他編程語言提供支持,對國際化以及報告文檔化也有良好的支持。

       官方網址:https://www.sonarqube.org/

1.2 使用範圍

       通過插件形式,可以支持包括java,C#,C/C++、PL/SQL、Cobol、JavaScrip、Groovy、Ruby等二十五種編程語言的代碼質量管理與檢測,針對不同的編程語言其所提供的分析方式也有所不同: 對於所有支持的編程語言,SonarQube 都提供源了代碼的靜態分析功能; 對於某些特定的編程語言,SonarQube 提供了對編譯後代碼的靜態分析功能。

       SonarQube支持多種客戶端集成方式,包括但不限於scanner客戶端、ant、gradle、maven、jenkins、idea插件等。比較常用的爲gradle和maven。

1.3 工作原理

      SonarQube 並不是簡單地將各種質量或覆蓋率檢測工具的結果(例如 CheckStyle、JACOCO 等)直接展現給客戶,而是通過不同的插件算法來對結果進行再加工,並最終以量化的方式來衡量代碼質量,從而方便地對不同規模和種類的工程進行相應的代碼質量管理,以便進行有針對性的代碼修復或重構。

      SonarQube 在進行代碼質量管理時,會從以下的七個緯度對項目代碼質量進行分析。

SonarQube 7Rules

1.4 擴展性

       Sonar實際上是一個Web系統,展現了靜態代碼掃描的結果,結果是可以自定義的,而真正實現代碼掃描的是Sonar Scanner這個工具,另外同時支持多種語言的原理是它的擴展性,通過插件實現的,也就是Java Jar架包,可以在Sonar平臺上在線安裝或者離線安裝。


2、SonarQube安裝、配置

2.1 前置條件

2.1.1 已安裝JDK1.8環境

2.1.2 已安裝Maven(用於後期與SonarQube、Jacoco的集成)

2.1.3 已安裝MySQL數據庫(Sonar默認的數據庫是自帶H2數據庫,是很小的嵌入式數據庫引擎,這裏的配置我換成了MySQL,爲了方便通過數據庫客戶端進行數據查詢)

2.2 配置工作

2.2.1 下載SonarQube,地址爲http://www.sonarqube.org/downloads/

2.2.2 配置數據庫(下面的SQL是指定了schema爲sonar,password爲sonar,其中第四條SQL是localhost是因爲MySQL安裝在本地)

mysql -u root -p

mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; 
mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
mysql> FLUSH PRIVILEGES;

2.2.3 安裝SonarQube

I. 將下載的sonar-3.7.zip包解壓至Windows某個路徑,如D:\Tools\sonar(如是其他OS,請選擇對應路徑,如Linux的/usr/local/等)。

II. 修改sonar.properties

在<install_directory>/conf/sonar.properties文件中,配置數據庫設置(默認已經提供了各類數據庫的支持這裏使用mysql,因此取消mysql模塊的註釋),同時因爲端口衝突而改成端口爲11000。

# User credentials.
# Permissions to create tables, indices and triggers must be granted to JDBC user.
# The schema must be created first.
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar

#----- Embedded Database (default)
# H2 embedded database server listening port, defaults to 9092
#sonar.embeddedDatabase.port=9092

#----- MySQL 5.6 or greater
# Only InnoDB storage engine is supported (not myISAM).
# Only the bundled driver is supported. It can not be changed.
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

# TCP port for incoming HTTP connections. Default value is 9000.
#sonar.web.port=9000
sonar.web.port=11000

III. 在<install_directory>/bin/目錄下,運行/windows-x86-64/StartSonar.bat (因爲本demo是在win10 64位安裝的,如果是Linux的話,運行 nohup bash sonar.sh start &

IV.訪問http://localhost:11000,如果不是本機就輸入http://[remote IP]:11000,如果你看到下圖所示即證明配置成功。

2.2.4 用admin/admin(默認)進行登錄,並安裝漢化包

Chinese pack installation
Chinese pack restart
Chinese pack restart confirm
Well done!

 


3、Sonar Scanner安裝、配置

3.1 配置工作

3.1.1 下載Sonar Scanner,地址爲https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

3.1.2  將下載的sonar-scanner-cli-3.3.0.1492-windows.zip包解壓至Windows某個路徑,如D:\Tools\sonar(如是其他OS,請選擇對應路徑,如Linux的/usr/local/等)

3.1.3 修改環境變量

新增變量:SONAR_SCANNER_HOME = D:\Tools\sonar\sonar-scanner-3.3.0

修改Path變量:增添%SONAR_SCANNER_HOME%\bin\

3.1.4 安裝Sonar Scanner

I. 將下載的sonar-3.7.zip包解壓至Windows某個路徑,如D:\Tools\sonar(如是其他OS,請選擇對應路徑,如Linux的/usr/local/等)。

II. 修改sonnar-scanner.properties

在<install_directory>/conf/sonar-scanner.properties文件中,設置SonarQube服務器。

#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here

#----- Default SonarQube server
sonar.host.url=http://localhost:11000

III. 到你想檢測的工程根目錄下新建文件sonar-project.properties,文件內容如下👇,文件中的參數配置,參考Sonar Analysis Parameters這篇文章。

#這裏的配置轉自https://www.jianshu.com/p/e384595d0b14,並進行部分調整,如加進JACOCO參數

# 指定SonarQube instance必須是唯一的
sonar.projectKey=Guns
# 設置SonarQube UI顯示的名稱 
# PS:有人會問這裏的名稱是否可以是中文名稱,我在網上搜索了好多資料都說是不可以的(至少我看到的資
#料都是)後來自己嘗試了一下,答案是可以寫成中文的,但是要換一種方式,比如你想把項目名稱命名爲“測
#試”,那麼在這裏就要寫成“\u6d4b\u8bd5”,那麼下面這個參數就應該這樣寫“sonar.projectName= 
#\u6d4b\u8bd5”,說白了就是將中文轉成Unicode
sonar.projectName=Guns
sonar.projectVersion=1.0
sonar.language=java
# 指定src和classes文件夾位置,當然也可以是全路徑,如果是當前工程根目錄下用“.”表示也可以,比如“sonar.sources=.”
sonar.sources=src/main
sonar.test=src/test
sonar.java.binaries=target
# 下面的這兩個參數作用是相同的,因爲有時我們需要指定某個文件夾或者忽略某個文件夾
# sonar.inclusions=src1/**,src3/**
# sonar.exclusions=src2/**,src4/**
# 源碼編碼,默認是系統編碼
sonar.sourceEncoding=UTF-8
# Set jacoco Configuration
# 指定代碼覆蓋率工具
sonar.core.codeCoveragePlugin=jacoco
# 指定exec二進制文件存放路徑
#sonar.jacoco.reportPaths=[yourPath/]jacoco.exec
#本demo之前設置的exec文件是在工程根目錄下的target/coverage-reports下:
sonar.jacoco.reportPaths=target/coverage-reports/jacoco-unit.exec
# 以下屬性可選擇性加,當然也可以不加
sonar.dynamicAnalysis=reuseReports
sonar.jacoco.reportMissing.force.zero=false

3.2 運行

在命令行模式下,在工程的根目錄下鍵入命令“sonar-scanner”,你會看到以下日誌:

運行sonar-scanner

接着,重新登錄SonarQube平臺,檢測的結果已經在平臺上展現出來

       從上圖你可以看出來,連單元測試覆蓋率的統計也生成出來了,主要原因爲在該maven項目之前已經集成了Jacoco插件(具體Maven與Jacoco的集成請參考我的另外一篇文章)。


4、Jacoco、maven與SonarQube的集成

4.1 前置條件

4.1.1 該項目爲maven項目,並且Jacoco已經通過POM文件集成到項目中,具體步驟請參考我的另外一篇文章。

4.1.2 該集成方案其實還是首先通過maven package 命令去生成對應的覆蓋率報告,然後通過sonar scanner直接使用該覆蓋率報告並通過一定算法加工並展示到SonarQube的界面上去。

4.2 配置工作

4.2.1 在項目根目錄的sonar-project.properties文件中,增添以下配置內容:

# 指定代碼覆蓋率工具
sonar.core.codeCoveragePlugin=jacoco
# 指定exec二進制文件存放路徑
#sonar.jacoco.reportPaths=[Your path]/jacoco.exec
#本demo之前設置的exec文件是在工程根目錄下的target/coverage-reports下:
sonar.jacoco.reportPaths=target/coverage-reports/jacoco-unit.exec
# 以下屬性可選擇性加,當然也可以不加
sonar.dynamicAnalysis=reuseReports
sonar.jacoco.reportMissing.force.zero=false

4.2.2 在SoarQube登錄admin,並通過在【配置-應用市場】下找到Jacoco插件並安裝和重啓。

4.3 運行

4.3.1 在項目根目錄下,運行 mvn package,當build成功的時候Jacoco的結果就會產生在target/site/jacoco文件夾下。

maven package

4.3.2 接着,在項目根目錄下運行命令 sonar-scanner,如果看到以下結果證明已經覆蓋率已經可以在SonarQube上查閱。

sonar scanner

 


5、結束語

下一篇會繼續補充如何通過SonarLint整合到IntelliJ IDEA,並同時如何整合到Jenkins實現自動化測試。

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