目錄
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 在進行代碼質量管理時,會從以下的七個緯度對項目代碼質量進行分析。
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(默認)進行登錄,並安裝漢化包
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”,你會看到以下日誌:
接着,重新登錄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文件夾下。
4.3.2 接着,在項目根目錄下運行命令 sonar-scanner,如果看到以下結果證明已經覆蓋率已經可以在SonarQube上查閱。
5、結束語
下一篇會繼續補充如何通過SonarLint整合到IntelliJ IDEA,並同時如何整合到Jenkins實現自動化測試。