文章目錄
一、Sonar是什麼
1、Sonar簡介
Sonar是一個用於代碼質量管理的開源平臺,用於管理源代碼的質量,可以從七個維度檢測代碼質量
通過插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十幾種編程語言的代碼質量管理與檢測
Sonar是從七個維度檢測代碼質量,而作爲開發人員至少需要處理前5中代碼質量問題。
2、爲什麼要選擇sonarQube
到目前爲止
沒有哪個CI工具可以提供良好的鑽取功能。
沒有CI插件可以將所有的軟件質量的度量數據整合到一起。
沒有CI插件提供管理視角。
沒有設計/架構問題相關的CI插件
沒有CI工具或插件提供整體項目質量的儀表盤。
但是sonarQube都有,而且相比於阿里編碼規約這種市面上常見類似軟件,能提供但不限如下優點:
- 更加優秀的圖形化界面,基本上通過界面就可以對自己項目的代碼狀況一目瞭然
- 可以查詢出其它軟件難以定位到的問題
a 可能導致空指針異常的問題 (對象在進行使用前沒有加空的判斷)
b 可能導致內存泄漏的問題, 在try catch 塊裏面,直接使用e.printStackTrace()將堆棧 信息打印到內存的
c 可能導致的漏洞,成員變量使用public定義的
d 流等未關閉或者是非正常關閉都能夠檢測出來
…
3、代碼質量問題
- 沒有代碼標準,不遵循代碼標準
sonar可以通過PMD,CheckStyle,Findbugs等等代碼規則檢測工具規範代碼編寫。 - 潛在的bug,潛在的缺陷
sonar可以通過PMD,CheckStyle,Findbugs等等代碼規則檢測工具檢測出潛在的bug。 - 糟糕的複雜度分佈
文件、類、方法等,如果複雜度過高將難以改變,這會使得開發人員難以理解它們,且如果沒有自動化的單元測試,對於程序中的任何組件的改變都將可能導致需要全面的迴歸測試。 - 重複
顯然程序中包含大量複製粘貼的代碼是質量低下的,sonar可以展示源碼中重複嚴重的地方。 - 沒有足夠的或者過多的註釋
沒有註釋將使代碼可讀性變差,特別是當不可避免地出現人員變動時,程序的可讀性將大幅下降,而過多的註釋又會使得開發人員將精力過多地花費在閱讀註釋上。 - 缺乏單元測試
sonar可以很方便地統計並展示單元測試覆蓋率。 - 糟糕的設計(原文Spaghetti Design,意大利麪式設計)
通過sonar可以找出循環,展示包與包、類與類之間的相互依賴關係;
可以檢測自定義的架構規則;
通過sonar可以管理第三方的jar包;
可以利用LCOM4檢測單個任務規則的應用情況;
檢測耦合;
注意:
PMD,CheckStyle,Findbugs這些工具都叫靜態代碼分析工具。什麼是靜態代碼分析?靜態代碼分析是指無需運行被測代碼,僅通過分析或檢查源程序的語法、結構、接口等來檢查程序的正確性,找出代碼隱藏的錯誤或缺陷,如參數不匹配,有歧義的嵌套語句,錯誤的遞歸,非法計算,空指針引用等。
4、Sonar組成
sonarqube系統是一個代碼質量檢測工具 由以下四個組件組成
- 一個sonarqube服務器,包含三個子進程(web服務(界面管理),搜索服務,計算引擎服務(寫入數據庫))。
- 一個sonarqube數據庫,配置sonarqube服務 。
- 多個sonarqube插件,位於解壓目錄extensions\plugins目錄 。
- 一個或者多個sonarqube scanners用於分析特定的項目,相當於客戶端。
5、代碼規則檢測工具
5.1、Checkstyle
Checkstyle是一個開源工具,可以幫助實施編碼標準和最佳實踐,特別注重編碼慣例。
雖然Checkstyle涵蓋了一些靜態代碼分析功能(與PMD和Findbug的方式大致相同),但是我們將主要在Checkstyle檢測和執行編碼編寫規範。
5.2、PMD
PMD是一種靜態代碼分析工具,能夠自動檢測範圍很廣的潛在缺陷和不安全或非優化的代碼(不良做法)。 而其他工具(如Checkstyle)可以檢查編碼約定(規範)和標準,PMD更側重於缺陷檢測(確保遵循良好做法)。 它附帶了豐富且高度可配置的規則集,可以輕鬆地配置給定項目應使用哪些特定規則。
例如:
捕捉異常而不做任何事情
死循環代碼
太多複雜的方法
直接使用實現而不是接口
實現或重寫了hashcode()沒有實現或重寫equals(Object object)方法
返回對可變對象的引用可能會對外暴露內部實現
5.3、Findbug
Findbug是Java的另一個靜態分析工具,在某些方面類似於Checkstyle和PMD,但是具有不同的重點。
Findbug不關心格式化或編碼標準,它的目標是檢測潛在的錯誤和性能問題。它很擅長做這類檢查。可以檢測到許多常見但難以發現的錯誤。
Findbug能夠以比較高的精度檢測出與PMD或Checkstyle不同的問題。 因此,它可以是一個有用的補充。
6、Sonar工作流程
通過客戶端插件分析源代碼,sonar客戶端可以採用IDE插件、Sonar-Scanner插件、Ant插件和Maven插件方式,並通過各種不同的分析機制對項目源代碼進行分析和掃描,並把分析掃描後的結果上傳到sonar的數據庫,通過sonar web界面對分析結果進行管理。
二、Sonar安裝配置
1、Sonar安裝前準備
環境要求:Centos7, jdk8,mysql 5.6-5.7, sonarqube-6.7.6(LTS)。請先確保linux已經安裝了jdk8,並且已經配置好了環境變量。
注意:Sonar是基於Java開發的,因此運行Sonar自然需要JDK。
1.1、MySQL環境準備
CentOS中默認安裝有MariaDB,這個是MySQL的分支,但爲了需要,還是要在系統中安裝MySQL,而且安裝完成之後可以直接覆蓋掉MariaDB。步驟如下(複製指令時要把#去掉):
1.1.1、下載YUM源
# wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
如果在服務器上下載太慢,可以先在本地電腦用迅雷等下載完之後再上傳到服務器上會快點。
1.1.2、安裝mysql源
# yum localinstall mysql57-community-release-el7-8.noarch.rpm
1.1.3、檢查mysql源是否安裝成功
# yum repolist enabled | grep "mysql.*-community.*"
1.1.4、安裝MySQL
# yum install mysql-community-server
1.1.5、啓動Mysql服務
# systemctl start mysqld
根據自己需求是否設置開機自啓動
# systemctl enable mysqld
# systemctl daemon-reload
1.1.6、修改root本地登錄密碼
mysql安裝完成之後,在/var/log/mysqld.log文件中給root生成了一個默認密碼。通過下面的方式找到root默認密碼,然後登錄mysql進行修改:
# grep 'temporary password' /var/log/mysqld.log
# mysql -uroot –p
# ALTER USER 'root'@'localhost' IDENTIFIED BY '123';
注意:
mysql5.7默認安裝了密碼安全檢查插件(validate_password),默認密碼檢查策略要求密碼必須包含:大小寫字母、數字和特殊符號,並且長度不能少於8位。修改策略之後再執行修改密碼:
set global validate_password_policy=0;
set global validate_password_policy=LOW;
1.1.7、確認mysql是InnoDB存儲引擎
Sonar要求mysql必須是InnoDB存儲引擎,所以爲了保險一點,我們先確認MySQL是不是InnoDB引擎。
查看mysql目前是什麼存儲引擎:
mysql -u root –p #先登錄mysql
show engines; #查看mysql目前提供的存儲引擎
如果不是InnoDB,設置爲InnoDB,修改配置文件/etc/my.cnf
vim /etc/my.cnf
修改default-storage-engine
[mysqld]
default-storage-engine=INNODB
重啓mysql數據庫,再次登錄查看默認存儲引擎設置是否生效
# service mysqld restart
1.1.8、設置MySQL參數
- 設置innodb_buffer_pool_size,參數值設置儘可能大一些,這個參數主要是緩存InnoDB表的索引,數據,插入數據時的緩衝默認值:128M,我們這裏設置爲256M
- 設置mysql的查詢緩存quert_cache_size的開關爲1,然後設置最少15M,重啓mysql數據庫
# vi /etc/my.cnf
[mysqld]
innodb_buffer_pool_size = 256M
query_cache_type=1
query_cache_size=32M
# service mysqld restart
查看緩存是否生效
show variables like '%query_cache%';
2、Sonar安裝
2.1、創建數據庫
在mysql中新建一個sonarQube數據庫(UTF-8編碼),數據庫名字可以自己取,後面在配置文件中配置好對應的名字就好了。
2.2、下載sonarQuba安裝包
在一個Linux合適的目錄下,執行以下linux命令下載:
# wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-6.7.6.zip
也可以在自己的本地電腦用迅雷下載好後再上傳。
2.3、下載好後解壓安裝並更名
# unzip sonarqube-6.7.6.zip
# mv sonarqube-6.7.6 sonarQube
之前介紹組成的時候說sonarqube是sonar的服務端,相當於一個web服務器,用來發布應用,在線瀏覽、配置分析等。怎麼樣?有沒有很面熟的感覺?是不是有點像tomcat呢?
下面是sonarqube個文件目錄的信息:
- bin:sonarqube運行命令文件夾
- conf:sonarqube配置文件夾
- data:嵌入式數據庫的數據(H2數據庫引擎),建議只用於測試和演示
- elasticsearch:搜索引擎
- extensions:sonarqube的插件等存放文件夾
- lib:sonarqube存放的運行庫文件夾(jar)
- logs:sonarqube日誌文件夾
- temp:sonarqube臨時文件夾
- web:sonarqube系統UI界面文件夾
2.4、修改配置
進入conf目錄,修改sonar.properties文件:
# cd sonarQube/conf/
# vim sonar.properties
配置Mysql數據用戶名
sonar.jdbc.username=root
sonar.jdbc.password=5462837zhu
配置mysql數據庫
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarQube?useUnicode=true&characterEncodixxxx
設置sonar服務
sonar.web.host=0.0.0.0
sonar.web.context=/sonarQube
sonar.web.port=9000
2.5、啓動sonarQube web service
進入bin目錄下的linux-x86-64文件夾:
啓動服務:
sh sonar.sh start
第一次啓動會自動在數據庫生成所需的表,可進入數據庫查看下
2.6、用瀏覽器訪問
瀏覽器中輸入:http://192.168.1.149:9000/sonarQube
2.7、登錄漢化
帳號密碼默認都爲:admin,登錄後分別點擊如下1、2、3三個框,搜索Chinese pack,然後點擊安裝
安裝完成後,要重啓sonarQube才能生效:
sh sonar.sh restart
3、需要注意的坑
由於6.6版本加入了elasticsearch,不能以root用戶啓動,因爲安全問題elasticsearch 不讓用root用戶直接運行,所以要創建新用戶,用新用戶啓動,注意修改你自己的用戶名和目錄
//創建esuser用戶
//目錄組和用戶都是esuser
//sonarqube文件設置777 //編寫配置文件
# useradd esuser
# chown -R esuser.esuser sonar6.7.6
# chmod 777 -R sonarqube-6.7.5
# vi sonar6.7.6/sonarQube/elasticsearch/config/elasticsearch.yml
//開啓端口和指定服務
network.host: 192.168.1.149(請填寫自己服務器的ip)
http.port: 9200
如果啓動中出現錯誤:如:
max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
解決65536:切換到root用戶,進入limits.d目錄下修改配置文件。
vim /etc/security/limits.conf
添加如下內容:
- soft nofile 65536
- hard nofile 131072
- soft nproc 2048
- hard nproc 4096
解決262144:切換到root用戶修改配置sysctl.conf
vim /etc/sysctl.conf
添加下面配置:
vm.max_map_count=655360
並執行命令:
sysctl –p
三、Sonar Scanner使用
1、從官網下載scanner對應的版本後直接解壓 :https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
2、通過編輯xxxx/conf/sonar-scanner.properties更新全局設置以指向SonarQube服務器 :
sonar.host.url=http://112.74.106.121:9000/sonarQube
3、將xxxx/bin設置到環境變量PATH中。
4、在命令行輸入 sonar-scanner –h
,驗證安裝結果
5、在需要分析的項目根目錄中創建配置文件:sonar-project.properties(項目名字和路徑根據實際情況修改)
# 當前項目實例的唯一表示
sonar.projectKey=kafka
# 顯示在sonarqube 界面上的項目名稱
sonar.projectName=kafka
sonar.projectVersion=1.0
# 相對於當前配置文件目錄 下的源代碼目錄 不管什麼平臺路徑分隔符只能有 / 不能使用\
sonar.sources=src/main/java
# 源代碼的字符集
sonar.sourceEncoding=UTF-8
6、從需要分析的項目根目錄運行命令 sonar-scanner
以啓動分析,出現執行EXECUTION SUCCESS表示成功
7、登錄sonarQube Web查看結果
點擊問題,查看並處理具體的問題。
四、簡介SonarQube Web使用
1、質量閥
SonarQube Web管理者通過配置和設置以下參數值對項目源代碼進行:
複雜度、覆蓋率、文檔、重複、問題、可維護性、可靠性、安全性、大小等約束和規範。
2、配置
系統:系統信息
應用市場:下載,更新,卸載插件
項目:創建、編輯、修改、刪除(批量)SonarQube項目,查看分析記錄
權限:新建用戶組,用戶,角色,設置角色到項目,以及提供一些默認的角色模版
配置:Java:配置檢查的java源文件及靜態代碼檢查規範檢查
SCM:配置軟件控制器。上文已經提到的配置項。比如:svn、git等等
設置數據庫清理,界面等等
3、質量配置
查看目前支持的語言插件,查看插件配置的規則,新建規則配置項
4、代碼規則
查看各個語言提供的規則,分配規則到配置項等
5、問題
查看每個項目分析出來的問題,查看問題等
6、項目
查看各個項目的問題總數等