一、Sonar 概述

Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具,代码分析性工具,以及持续集成工具。

与持续集成工具(例如 Hudson/Jenkins 等)不同,Sonar 并不是简单地把不同的代码检查工具结果(例如 FindBugs,PMD 等)直接显示在 Web 页面上,而是通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。

在对其他工具的支持方面,Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse 和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。

此外,Sonar 的插件还可以对 Java 以外的其他编程语言提供支持,对国际化以及报告文档化也有良好的支持。

Sonar 的功能就是来检查代码是否有 BUG。除了检查代码是否有 bug 还有其他的功能,比如说:你的代码注释率是多少,代码有一些建议,编写语法的建议。所以称之为质量管理。

Sonar 的相关下载和文档可以在下面的链接中找到:http://www.sonarqube.org/downloads/
需要注意最新版的 Sonar 需要至少 JDK 1.8 及以上版本。

二、部署Sonar

注意:接下来的配置需要基于博文Jenkins+Gitlab实现持续集成的环境进行部署的。

部署环境中所需的软件包及插件均可通过此链接进行下载。
关于Sonar所需的插件也可通过https://docs.sonarqube.org/display/PLUG 该网址进行下载!

[root@jenkins ~]# wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-5.6.zip
[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、Oracle、SQL server都是支持的,本次博文采用MySQL数据库。如果环境已经存在MySQL数据库,那么就无需再次部署了,创建相应的数据库及用户即可!

为了简单、快速的部署Mysql数据库,采用脚本的方式安装Mysql数据库,下载一键安装mysql

友情提示:sonar 好像不支持 mysql 5.5,建议安装mysql 5.6或更高的版本,提供的脚本安装的是mysql5.7的版本!

[root@jenkins ~]# ls mysql*
mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz  mysql.sh
[root@jenkins ~]# sh mysql.sh 
Starting MySQL.. SUCCESS! 
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@jenkins ~]# mysql -u root -p123               #脚本提供的root的密码是123
#登录mysql数据库
mysql> create database sonar character set utf8 collate utf8_general_ci;
mysql> grant all on sonar.* to 'sonar'@'%' identified by '123.com';
mysql> grant all on sonar.* to 'sonar'@'localhost' identified by '123.com';
mysql>  flush privileges; 

三、配置Sonar

[root@jenkins ~]# vim /usr/local/sonarqube/conf/sonar.properties
#编辑sonar的主配置文件
sonar.jdbc.username=sonar
sonar.jdbc.password=123.com                   #指定连接数据库使用的用户及密码
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerforman
#定义连接mysql数据库的地址及端口(默认存在去除注释即可)
sonar.web.host=0.0.0.0
sonar.web.port=9000                # 定义Sonar提供Web页面监听的IP地址和端口
#接下来配置sonar支持中文页面以及支持PHP语言
[root@jenkins ~]# cd /usr/local/sonarqube/extensions/plugins/    
[root@jenkins plugins]# ls *.jar            #确保这个目录下有这两个jar包
sonar-l10n-zh-plugin-1.11.jar  sonar-php-plugin-2.9-RC1.jar
[root@jenkins ~]# sonar.sh start                 #启动sonar
[root@jenkins ~]# tail -2 /usr/local/sonarqube/logs/sonar.log
2020.02.13 14:59:03 INFO  ce[o.s.ce.app.CeServer] Compute Engine is up
2020.02.13 14:59:03 INFO  app[o.s.p.m.Monitor] Process[ce] is up
#确保sonar的日志出现以上两行内容
[root@jenkins ~]# ss -lnt | grep 9000
LISTEN     0      25           *:9000                     *:*      
#确保sonar的端口已经在监听

访问sonar的web页面,如下:
使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警

四、配置Sonar实现代码扫描

[root@jenkins ~]# wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.3.0.1492-linux.zip
[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 ~]# vim /usr/local/sonar-scanner/conf/sonar-scanner.properties
sonar.host.url=http://localhost:9000
sonar.sourceEncoding=UTF-8
#以下是从sonar的主配置文件中复制:/usr/local/sonarqube/conf/sonar.properties中复制过来的,用于连接数据库
sonar.jdbc.username=sonar
sonar.jdbc.password=123.com
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          #编码格式
sonar.php.coverage.reportPath=reports/phpunit.coverage.xml
sonar.php.tests.reportPath=reports/phpunit.xml
#也就是说在项目里面必须有这个配置文件才可以进行扫描

#测试PHP代码
[root@jenkins php-sonar-runner-unit-tests]# pwd    #确定在当前路径
/usr/src/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 /root/testalyzer-master/projects/languages/javascript/javascript-sonar-runner
[root@jenkins javascript-sonar-runner]# sonar-scanner      #进行测试

当执行完成对js及PHP的测试后,即可在sonar的web界面看到如下内容:
使用 Sonar 进行代码质量管理及邮件报警
点击之后即可查看详细信息,如图:
使用 Sonar 进行代码质量管理及邮件报警

六、配置Jenkins开启Sonar

登录到Jenkins的web界面,需要安装插件,有在线安装及离线安装两种方式,我这里选择离线安装,可以自行进行在线安装的方式。

1)依次点击:系统管理——>插件管理——>高级,然后下拉页面:

下载所需插件按照“sonar”——>“gerrit-trigger”——>“sonar-gerrit”进行安装即可,在线安装顺序:“SonarQube Scanner”——>“Gerrit Trigger”——>"Sonar Gerrit Plugin"
如图:
使用 Sonar 进行代码质量管理及邮件报警

2)依次点击:系统管理——>系统设置,配置如下:

使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警

3)依次点击:系统管理——>全局工具配置,然后下拉页面:

使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警

4)进入上篇博文构建的项目中,如下:

使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警

为了便于区分,输入以下代码:

sonar.projectKey=web-demo
sonar.projectName=web-demo
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   

使用 Sonar 进行代码质量管理及邮件报警

5)回到终端,向gitlab提交代码,即可实现Sonar自动扫描

[root@jenkins ~]# cp -r testalyzer-master/projects/languages/php/php-sonar-runner-unit-tests/* test01/
[root@jenkins ~]# cd test01/
[root@jenkins test01]# git add .
[root@jenkins test01]# git commit -m "test sonar"
[root@jenkins test01]# git push origin master

如图:
使用 Sonar 进行代码质量管理及邮件报警
如果没有出现的话,建议上Jenkins页面查看是否构建成功!

七、配置Jenkins实现邮件报警

1)获取邮箱授权码

本次以QQ邮箱为例:
使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警

2)配置邮件报警:

在Jenkins的web界面依次点击:系统管理——>系统设置,然后下拉输入系统管理员的邮箱地址并保存:
使用 Sonar 进行代码质量管理及邮件报警
下拉列表,继续填写!
使用 Sonar 进行代码质量管理及邮件报警

3)配置项目

使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警
使用 Sonar 进行代码质量管理及邮件报警

4)测试

重启gitlab服务,重新构建项目,如下:

[root@jenkins ~]# gitlab-ctl restart

如图:
使用 Sonar 进行代码质量管理及邮件报警
收到的邮件如下:
使用 Sonar 进行代码质量管理及邮件报警

————————————本文到此为止,感谢阅读————————————