持續集成之代碼質量管理———Sonar

Sonar是一個用於代碼質量管理的開放平臺,通過插件機制,Sonar可以集成不同的測試工具、代碼分析工具以及持續集成工具。與持續集成工具(如Hudson/Jenkins等)不同,Sonar並不是簡單地把不同代碼檢查結果(例如:FindBugs、PMD等)直接顯示在web UI界面上,而是通過不同的插件對這些結果再加工處理,通過量化的方式度量代碼質量的變化,從而可以方便地對不同規模和種類的工程進行代碼質量管理。

在對其他工具的支持方面,Sonar 不僅提供了對 IDE 的支持,可以在 Eclipse 和 IntelliJ IDEA 這些工具裏聯機查看結果;同時 Sonar 還對大量的持續集成工具提供了接口支持,可以很方便地在持續集成中使用 Sonar。

此外,Sonar 的插件還可以對 Java 以外的其他編程語言提供支持,對國際化以及報告文檔化也有較好的支持。

Sonar 的功能就是來檢查代碼是否有 BUG。除了檢查代碼是否有 bug 還有其他的功能,比如說:你的代碼註釋率是多少,代碼有一些建議,編寫語法的建議。所以稱之爲質量管理。

一、部署Sonar

接下來的配置是基於博文部署Jenkins+Gitlab實現持續集成的環境進行部署
所有的源碼包及插件都可以在此鏈接(提取碼: t976)下載

[root@jenkins ~]# unzip sonarqube-5.6.zip 
[root@jenkins ~]# mv sonarqube-5.6/ /usr/local/sonarqube
[root@jenkins ~]# ln -s /usr/local/sonarqube/bin/linux-x86-64/sonar.sh /usr/local/bin/

二、安裝MySQL

sonar需要使用到數據庫,這裏我使用MySQL數據庫,如果環境中存在數據庫,則無需部署,只需要創建相應的庫及賬號即可

#採用RPM包的方式部署MySQL
[root@jenkins ~]# mkdir mysql
[root@jenkins ~]# cd mysql/
[root@jenkins mysql]# rz
[root@jenkins mysql]# ls            # 確定有如下幾個包
mysql-community-client-5.7.25-1.el7.x86_64.rpm 
mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm
mysql-community-common-5.7.25-1.el7.x86_64.rpm  
mysql-community-server-5.7.25-1.el7.x86_64.rpm
mysql-community-libs-5.7.25-1.el7.x86_64.rpm
[root@jenkins mysql]# yum -y localinstall mysql-community-*       # 安裝MySQL
[root@jenkins mysql]# systemctl start mysqld         # 啓動
[root@jenkins mysql]# netstat -anput | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      11411/mysqld        
[root@jenkins mysql]# grep password /var/log/mysqld.log        # 在MySQL日誌中查看登陸密碼 
2020-03-19T17:29:37.381630Z 1 [Note] A temporary password is generated for root@localhost: DfkgCtPsu5:4
#上面末尾就是MySQL的默認root密碼
[root@jenkins mysql]# mysql -u root -p'DfkgCtPsu5:4'
mysql> alter user 'root'@'localhost' identified by '[email protected]';
mysql> create database sonar character set utf8 collate utf8_general_ci;
mysql> grant all on sonar.* to 'sonar'@'%' identified by '[email protected]';
mysql> grant all on sonar.* to 'sonar'@'localhost' identified by '[email protected]';
mysql> flush privileges;

三、配置Sonar

[root@jenkins mysql]# cd /usr/local/sonarqube/conf/
[root@jenkins conf]# sed -i 's/#sonar.jdbc.username=/sonar.jdbc.username=sonar/g' sonar.properties 
#定義連接數據庫的用戶
[root@jenkins conf]# sed -i 's/#sonar.jdbc.password=/[email protected]/g' sonar.properties
#指定數據庫用戶的密碼
[root@jenkins conf]# echo 'sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance' >> sonar.properties 
#用來定義連接數據庫的地址及端口
[root@jenkins conf]# sed -i 's/#sonar.web.port=9000/sonar.web.port=9000/g' sonar.properties
#配置sonar支持中文頁面及支持PHP
[root@jenkins conf]# cd /usr/local/sonarqube/extensions/plugins/
[root@jenkins plugins]# cp ~/sonar-l10n-zh-plugin-1.11.jar ./
[root@jenkins plugins]# cp ~/sonar-php-plugin-2.9-RC1.jar ./
[root@jenkins plugins]# sonar.sh start            #啓動sonar,給它點初始化的時間
[root@jenkins conf]# tail -2 /usr/local/sonarqube/logs/sonar.log              #查看sonar日誌
2020.03.20 02:00:29 INFO  ce[o.s.ce.app.CeServer] Compute Engine is up
2020.03.20 02:00:29 INFO  app[o.s.p.m.Monitor] Process[ce] is up
#當出現上面兩行以“up”結尾的則表示sonar啓動正常。
[root@jenkins conf]# netstat -anput | grep 9000
tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN      52610/java   

client訪問sonar的web界面:
持續集成之代碼質量管理———Sonar

四、配置代碼掃描功能

#配置代碼掃描
[root@jenkins ~]# unzip sonar-scanner-cli-3.3.0.1492-linux.zip 
[root@jenkins ~]# mv sonar-scanner-3.3.0.1492-linux/ /usr/local/sonar-scanner
[root@jenkins ~]# ln -s /usr/local/sonar-scanner/bin/sonar-scanner /usr/local/bin/
[root@jenkins ~]# ln -s /usr/local/sonar-scanner/bin/sonar-scanner /usr/bin/
[root@jenkins ~]# cd /usr/local/sonar-scanner/conf/
[root@jenkins conf]# egrep -v '^#|^$' sonar-scanner.properties            # 修改配置文件至如下
sonar.host.url=http://localhost:9000
sonar.sourceEncoding=UTF-8
#以下是從sonar的主配置文件中複製:/usr/local/sonarqube/conf/sonar.properties中複製過來的,用於連接數據庫
sonar.jdbc.username=sonar
[email protected]
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance

五、測試代碼掃描功能

[root@jenkins ~]# unzip testalyzer-master.zip 
[root@jenkins ~]# cd testalyzer-master/projects/languages/php/php-sonar-runner-unit-tests/
[root@jenkins php-sonar-runner-unit-tests]# cat sonar-project.properties 
#看一下下面的文件中都包含了些什麼
sonar.projectKey=org.sonarqube:php-ut-sq-scanner     #自定義祕鑰,如果祕鑰一樣,就會自動覆蓋之前的測試結果
sonar.projectName=PHP :: PHPUnit :: SonarQube Scanner        #web界面顯示的名稱
sonar.projectVersion=1.0      #版本
sonar.sources=src        #軟件包存放路徑
sonar.tests=tests       #測試路徑
sonar.language=php        #要測試的語言
sonar.sourceEncoding=UTF-8          #編碼格式
#測試PHP代碼
[root@jenkins php-sonar-runner-unit-tests]# pwd           # 確定當前路徑
/root/testalyzer-master/projects/languages/php/php-sonar-runner-unit-tests
[root@jenkins php-sonar-runner-unit-tests]# sonar-scanner 
 #測試js代碼
[root@jenkins php-sonar-runner-unit-tests]# cd ../../javascript/javascript-sonar-runner
[root@jenkins javascript-sonar-runner]# sonar-scanner 

當執行完成對js及PHP的測試後,即可在sonar的web界面看到如下內容:
持續集成之代碼質量管理———Sonar
點擊進入後可以看到詳細信息:
持續集成之代碼質量管理———Sonar

六、配置Jenkins開啓Sonar

登錄到Jenkins的web界面,需要安裝插件,有在線安裝及離線安裝兩種方式,我這裏選擇離線安裝,可以自行進行在線安裝的方式
1、依次點擊:系統管理===>>插件管理===>>高級,然後下拉頁面:
下載我提供的插件,按照以下順序依次添加,若是在線安裝,依次搜索“SonarQube Scanner”、“Gerrit Trigger”、"Sonar Gerrit Plugin"進行安裝即可:
持續集成之代碼質量管理———Sonar
2、依次點擊:系統管理===>>系統設置,然後配置如下:
持續集成之代碼質量管理———Sonar
持續集成之代碼質量管理———Sonar
切記要點保存
3、依次點擊:系統管理===>>全局工具配置,然後單擊如下:
持續集成之代碼質量管理———Sonar
持續集成之代碼質量管理———Sonar
4、進入構建的項目,然後點擊進入,如下:
持續集成之代碼質量管理———Sonar
持續集成之代碼質量管理———Sonar
持續集成之代碼質量管理———Sonar
在終端複製一下代碼:

[root@jenkins /]# cd ~/testalyzer-master/projects/languages/php/php-sonar-runner-unit-tests/
[root@jenkins php-sonar-runner-unit-tests]# egrep -v '^#|^$' sonar-project.properties 
#複製如下代碼
sonar.projectKey=org.sonarqube:php-ut-sq-scanner
sonar.projectName=PHP :: PHPUnit :: SonarQube Scanner
sonar.projectVersion=1.0
sonar.sources=src
sonar.tests=tests
sonar.language=php
sonar.sourceEncoding=UTF-8
sonar.php.coverage.reportPath=reports/phpunit.coverage.xml
sonar.php.tests.reportPath=reports/phpunit.xml

5、然後在圖中粘貼複製的代碼(爲了方便區分測試結果,建議修改“sonar.projectKey”的值):
持續集成之代碼質量管理———Sonar
6、回到終端,向gitlab提交代碼,即可實現自動sonar掃描

[root@jenkins php-sonar-runner-unit-tests]# pwd
/root/testalyzer-master/projects/languages/php/php-sonar-runner-unit-tests
[root@jenkins php-sonar-runner-unit-tests]# cp -r * ~/test1/
#將測試代碼複製到本地git庫(如果沒有本地git庫,可以再次克隆一下)
[root@jenkins php-sonar-runner-unit-tests]# cd ~/test1/           # 進入到本地git庫
[root@jenkins test1]# rm -rf sonar-project.properties              #刪除這個文件,不需要使用它來給我們指定要測試的代碼了
#因爲我們在剛纔的web界面已經將其配置文件寫在了web界面。優先使用web界面配置的檢測代碼。
#不刪除這個文件也行
#然後提交到遠端的gitlab庫
[root@jenkins test1]# git add *
[root@jenkins test1]# git commit -m "test sonar"
[root@jenkins test1]# git push origin master

當提交到遠端gitlab庫後,即可看到sonar的web界面已經進行了代碼掃描,並且顯示出了掃描結果,如下:
持續集成之代碼質量管理———Sonar
7、配置Jenkins郵件報警
開始配置郵件報警:
在Jenkins的web界面依次點擊:系統管理===>>系統設置,然後在下面輸入系統管理員的郵箱地址並保存:
持續集成之代碼質量管理———Sonar
再次點擊:系統管理===>>系統設置
持續集成之代碼質量管理———Sonar
配置項目,如下:
持續集成之代碼質量管理———Sonar
持續集成之代碼質量管理———Sonar
持續集成之代碼質量管理———Sonar
持續集成之代碼質量管理———Sonar
在此點擊項目>>配置
持續集成之代碼質量管理———Sonar
持續集成之代碼質量管理———Sonar
持續集成之代碼質量管理———Sonar
持續集成之代碼質量管理———Sonar
至此,郵箱報警就配置完成了,此時,可以在控制檯關閉gitlab或者手動構建代碼,測試是否可以收到報警郵件。
持續集成之代碼質量管理———Sonar

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