自動化工具之Sonar

一、Sonar是什麼

1、Sonar簡介

Sonar是一個用於代碼質量管理的開源平臺,用於管理源代碼的質量,可以從七個維度檢測代碼質量

通過插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十幾種編程語言的代碼質量管理與檢測

Sonar是從七個維度檢測代碼質量,而作爲開發人員至少需要處理前5中代碼質量問題。

2、爲什麼要選擇sonarQube

到目前爲止
沒有哪個CI工具可以提供良好的鑽取功能。
沒有CI插件可以將所有的軟件質量的度量數據整合到一起。
沒有CI插件提供管理視角。
沒有設計/架構問題相關的CI插件
沒有CI工具或插件提供整體項目質量的儀表盤。

但是sonarQube都有,而且相比於阿里編碼規約這種市面上常見類似軟件,能提供但不限如下優點:

  1. 更加優秀的圖形化界面,基本上通過界面就可以對自己項目的代碼狀況一目瞭然
  2. 可以查詢出其它軟件難以定位到的問題
    a 可能導致空指針異常的問題 (對象在進行使用前沒有加空的判斷)
    b 可能導致內存泄漏的問題, 在try catch 塊裏面,直接使用e.printStackTrace()將堆棧 信息打印到內存的
    c 可能導致的漏洞,成員變量使用public定義的
    d 流等未關閉或者是非正常關閉都能夠檢測出來

3、代碼質量問題

  1. 沒有代碼標準,不遵循代碼標準
    sonar可以通過PMD,CheckStyle,Findbugs等等代碼規則檢測工具規範代碼編寫。
  2. 潛在的bug,潛在的缺陷
    sonar可以通過PMD,CheckStyle,Findbugs等等代碼規則檢測工具檢測出潛在的bug。
  3. 糟糕的複雜度分佈
    文件、類、方法等,如果複雜度過高將難以改變,這會使得開發人員難以理解它們,且如果沒有自動化的單元測試,對於程序中的任何組件的改變都將可能導致需要全面的迴歸測試。
  4. 重複
    顯然程序中包含大量複製粘貼的代碼是質量低下的,sonar可以展示源碼中重複嚴重的地方。
  5. 沒有足夠的或者過多的註釋
    沒有註釋將使代碼可讀性變差,特別是當不可避免地出現人員變動時,程序的可讀性將大幅下降,而過多的註釋又會使得開發人員將精力過多地花費在閱讀註釋上。
  6. 缺乏單元測試
    sonar可以很方便地統計並展示單元測試覆蓋率。
  7. 糟糕的設計(原文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參數

  1. 設置innodb_buffer_pool_size,參數值設置儘可能大一些,這個參數主要是緩存InnoDB表的索引,數據,插入數據時的緩衝默認值:128M,我們這裏設置爲256M
  2. 設置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、項目

查看各個項目的問題總數等

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