SonarQube
一,簡介
Sonar 是一個很優秀的代碼分析工具,可以幫助程序員們發現很多潛在的問題和BUG。
Sonar可以從以下七個維度檢測代碼質量。
1. 不遵循代碼標準
sonar可以通過PMD,CheckStyle,Findbugs等等代碼規則檢測工具規範代碼編寫。
2. 潛在的缺陷
sonar可以通過PMD,CheckStyle,Findbugs等等代碼規則檢測工具檢測出潛在的缺陷。
3. 糟糕的複雜度分佈
文件、類、方法等,如果複雜度過高將難以改變,這會使得開發人員 難以理解它們, 且如果沒有自動化的單元測試,對於程序中的任何組件的改變都將可能導致需要全面的迴歸測試。
4. 重複
顯然程序中包含大量複製粘貼的代碼是質量低下的,sonar可以展示 源碼中重複嚴重的地方。
5. 註釋不足或者過多
沒有註釋將使代碼可讀性變差,特別是當不可避免地出現人員變動 時,程序的可讀性將大幅下降 而過多的註釋又會使得開發人員將精力過多地花費在閱讀註釋上,亦違背初衷。
6. 缺乏單元測試
sonar可以很方便地統計並展示單元測試覆蓋率。
7. 糟糕的設計
通過sonar可以找出循環,展示包與包、類與類之間的相互依賴關係,可以檢測自定義的架構規則 通過sonar可以管理第三方的jar包
需要用到的軟件有:SonarQube,Sonar-scanner。
SonarQube爲代碼檢查的server,並提供可視化界面;
Sonar-scanner爲client。用於收集檢查數據並且發送到server中。也就是傳統的C/S關係:
二,架構介紹
SonarQube平臺主要由4個組件組成:
(1). SonarQube服務器:
主要包括web服務器,基於ElasticSearch的搜索服務器,計算引擎服務器。
其中,web服務器,是供開發人員瀏覽查看代碼分析結果,進行相應的配置等。
計算引擎服務器主要是處理代碼分析報表並將其存儲在數據庫。
(2). SonarQube 數據庫:
存儲配置信息和代碼分析報表。
(3). 多個Soanr插件:包括分析各種語言的插件。
(4). 多個Sonar Scanner,主要運行在開發人員的代碼端,可以單獨部署,也可以集成在Maven,Gradle等。
用戶:admin 密碼:admin |
三,安裝
版本分析:
最新版本是8.3.1(202004發佈) 已整合CI / CD
但是環境依賴比較高:要求 Java 11 且不支持mysql 管理配置元數據
綜合考量,功能最大化,依賴Java 8,且支持mysql管理元數據的最後版本
故選擇版本 7.8 (20190619日發佈)
安裝過程
- 安裝Java jdk 1.8 (安裝過程省略)
- 安裝mysql 5.6.3 (安裝過程省略)
- 安裝maven 3.5.2 (安裝過程省略)
- 安裝sonarqube
<1>https://www.sonarqube.org/downloads/下載文件 解壓安裝文件
(1)unzip sonarqube-7.8.zip
(2)在mysql中創建相關用戶和密碼
create database sonar_db ;
create user 'sonar_ntd'@'%' identified by 'ntd123';
grant all privileges on sonar_db.* to "sonar_ntd"@'%';
grant all privileges on sonar_db.* to 'sonar_ntd'@'localhost' identified by 'ntd123';
grant all privileges on sonar_db.* to 'sonar_ntd'@'master01' identified by 'ntd123';
<2>,修改配置文件 sonarqube-7.8/conf/sonar.properties
#web端口號 默認9000
sonar.web.port=9009
#元數據保存到mysql
sonar.jdbc.url=jdbc:mysql://1.2.2.7:3306/sonar_db?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.jdbc.username=sonar_ntd
sonar.jdbc.password=ntd123
sonar.sorceEncoding=UTF-8
sonar.login=admin
sonar.password=admin
#
sonar.search.javaAdditionalOpts=-Dbootstrap.system_call_filter=false
<3>安裝中文插件https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases下載 7.8 對應版本中文插件 sonar-l10n-zh-plugin-1.28.jar
放入 sonarqube-7.8/extensions/plugins 目錄
<4>啓動服務
/sonarqube-7.8/bin/linux-x86-64/sonar.sh start
<5>安裝掃描器(用於除Java,c++外的,比如 python php 等等其他語言)
https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/下載
解壓 sonar-scanner-cli-4.2.0.1873-linux.zip
修改配置文件sonar-scanner-4.2.0.1873-linux/conf
sonar.host.url=http://1.2.2.7:9009
並加入環境變量
export SONAR_SCANNER_HOME=/home/software/sonar-scanner-4.2.0.1873-linux
export PATH=$PATH:$SONAR_SCANNER_HOME/bin
source ~/.bashrc
四,整合maven的兩種使用方式
1.直接命令行控制(以Java maven 項目爲例)
創建一個項目
<1>,選擇創建新項目,設置項目的創建標誌以及顯示信息;點擊完設置以後,會有頁面創建令牌和配置當前項目的信息(自動生成)
窗體頂端
Analyze "sonarQubeTest": 323220150f0f09643e87ae705fa249c24f8db01f |
窗體底端
此令牌用於執行分析時認證時使用,如果這個令牌存在問題,可以隨時在你的用戶賬號下取消這個令牌。
<2>,分析你的項目(自動生成maven 命令)
選擇語言: Java
選擇構建框架:maven
會自動生成一下命令
mvn sonar:sonar \ -Dsonar.projectKey=sonarQubeTest \ -Dsonar.host.url=http://master01:9009 \ -Dsonar.login=323220150f0f09643e87ae705fa249c24f8db01f
|
其中-Dsonar.projectKey表示的是項目的標識,-Dsonar.host.url表示的是sonar的 地址,-Dsonar.login=323220150f0f09643e87ae705fa249c24f8db01f設置的sonar的令牌信息
<3>,到項目目錄執行maven 命令(上一步生成的)
Cd 項目目錄,執行以下命令
mvn sonar:sonar \ -Dsonar.projectKey=sonarQubeTest \ -Dsonar.host.url=http://master01:9009 \ -Dsonar.login=323220150f0f09643e87ae705fa249c24f8db01f \ -Dsonar.java.binaries=target/sonar
|
注意:以上命令增加一行 -Dsonar.java.binaries=target/sonar 是指定sonar.java.binaries 項目的文件夾。否則會報錯Please provide compiled classes of your project with sonar.java.binaries property
2.全局配置maven
<1>. 在Maven的全局配置文件: $MAVEN_PATH/conf/settings.xml (也可能是.m2/settings.xml )中添加如下內容:
<<settings> <pluginGroups> <pluginGroup>org.sonarsource.scanner.maven</pluginGroup> </pluginGroups> <profiles> <profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <sonar.host.url> http://1.2.2.7:9009 </sonar.host.url> </properties> </profile> </profiles> </settings>
|
<2> .到Maven項目的根目錄執行如下命令,即可使用SonarQube分析項目:
mvn sonar:sonar -Dsonar.java.binaries=target/sonar |
五,其他語言scala ,python,php 或者一個項目使用多種語言時通過以下方式使用sonar-scanner
<1>在項目目錄增加sonar-project.properties配置文件
sonar.projectKey=my:project sonar.projectName=My project sonar.projectVersion=1.0 sonar.projectDescription=test_project_description sonar.sources=. sonar.sourceEncoding=UTF-8 sonar.java.binaries=./target/sonar |
sonar.projectKey在給定的SonarQube實例中必須是唯一的
sonar.projectName和sonar.projectVersion這是SonarQube用戶界面中顯示的名稱和版本。在SonarQube 6.1之前是強制性的。
sonar.projectDescription 項目描述
sonar.sources 是源代碼目錄
sonar.sourceEncoding源代碼的編碼。默認爲默認系統編碼
sonar.java.binaries分析的classes文件路徑
<2>在項目目錄執行一下命令
sonar-scanner |
sonar-project.properties 各項參數說明
強制參數 服務器
項目配置
可選參數 項目身份
認證方式 如果“任何人”僞組沒有執行分析的權限,則需要向用戶提供具有“執行分析”權限的憑據才能在其下運行分析。
網頁服務
項目配置
重複項
分析記錄
|
六,idea結合sonarLint進行的代碼分析
idea結合sonar的話,可以下載sonarLint插件,操作步驟如下:
- 進入idea ,進入插件安裝,在插件市場中搜索sonarLint,點擊進行安裝後重啓idea;
- 配置sonarLint插件,設置settings中,查找到other settings,然後選擇sonarLint General Setting ,在右側的輸入
- 接下來輸入要連接的服務器的登錄信息,如輸入token或者是使用賬號和密碼的方式
- 配置當前的項目和sonar的關係,點擊進入設置settings->other settings->SonarLint Project Settings
- Bind to Server 選擇剛纔配置的服務器信息。SonarQube project的選擇可以點擊Search in list查看sonar倉庫中配置的項目信息,完成選擇以後點擊ok即可
- 代碼分析,可以查看到當前的窗口中多了一個SonarLint的窗口(如無此窗口,可以點擊view菜單進行查找),在其中選擇report,點擊文件夾圖標,會彈窗提示,點擊process之後即可進行項目分析。
- 單元測試數,單元測試覆蓋率指標生成使用方法。
總體思路:使用mvn生成測試報告,使用 sonar-scanner 將測試報告傳到 SonarQube服務
<1> Java maven 項目
1,maven Java項目,pom文件增加以下依賴
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.7.8</version> <executions> <execution> <goals> <goal>prepare-agent</goal> <goal>report</goal> </goals> </execution> </executions> </plugin> |
- 項目中增加對應方法的單元測試方法
採用junit測試
<dependency> |
舉例
略
3,執行以下maven命令
mvn test org.jacoco:jacoco-maven-plugin:prepare-agent sonar:sonar |
<2> scala maven 項目
- maven 項目,pom文件增加以下依賴
<plugin>
|
- 項目中增加對應方法的單元測試方法
採用junit測試
<dependency> |
舉例
略
- 執行以下命令
- 在項目所在目錄,執行以下命令,生成測試報告
Mvn test |
- 在項目所在目錄,增加以下配置文件sonar-project.properties
sonar.projectKey=scalatest:scalatest01 sonar.projectName=scalatest01 sonar.projectVersion=1.0 sonar.sources=. sonar.sourceEncoding=UTF-8 sonar.projectDescription=123456789beizhu sonar.links.homepage=www.baidu.com sonar.scala.coverage.reportPaths=./target/site/jacoco/jacoco.xml |
備註:主要增加配置項sonar.scala.coverage.reportPaths=./target/site/jacoco/jacoco.xml
指定測試xml報告所在目錄
- 在項目所在目錄,執行以下命令
sonar-scanner |
備註:本次掃描會把 mvn test命令在項目目錄下target目錄生成的 css,html,xml等代碼全部當成項目代碼參與掃描。