目录
1、SonarQube简介
1.1 介绍
SonarQube是一个用于代码质量管理的开源平台,用于管理源代码的质量。同时 SonarQube 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 SonarQube。此外, SonarQube 的插件还可以对 Java 以外的其他编程语言提供支持,对国际化以及报告文档化也有良好的支持。
官方网址:https://www.sonarqube.org/
1.2 使用范围
通过插件形式,可以支持包括java,C#,C/C++、PL/SQL、Cobol、JavaScrip、Groovy、Ruby等二十五种编程语言的代码质量管理与检测,针对不同的编程语言其所提供的分析方式也有所不同: 对于所有支持的编程语言,SonarQube 都提供源了代码的静态分析功能; 对于某些特定的编程语言,SonarQube 提供了对编译后代码的静态分析功能。
SonarQube支持多种客户端集成方式,包括但不限于scanner客户端、ant、gradle、maven、jenkins、idea插件等。比较常用的为gradle和maven。
1.3 工作原理
SonarQube 并不是简单地将各种质量或覆盖率检测工具的结果(例如 CheckStyle、JACOCO 等)直接展现给客户,而是通过不同的插件算法来对结果进行再加工,并最终以量化的方式来衡量代码质量,从而方便地对不同规模和种类的工程进行相应的代码质量管理,以便进行有针对性的代码修复或重构。
SonarQube 在进行代码质量管理时,会从以下的七个纬度对项目代码质量进行分析。

1.4 扩展性
Sonar实际上是一个Web系统,展现了静态代码扫描的结果,结果是可以自定义的,而真正实现代码扫描的是Sonar Scanner这个工具,另外同时支持多种语言的原理是它的扩展性,通过插件实现的,也就是Java Jar架包,可以在Sonar平台上在线安装或者离线安装。
2、SonarQube安装、配置
2.1 前置条件
2.1.1 已安装JDK1.8环境
2.1.2 已安装Maven(用于后期与SonarQube、Jacoco的集成)
2.1.3 已安装MySQL数据库(Sonar默认的数据库是自带H2数据库,是很小的嵌入式数据库引擎,这里的配置我换成了MySQL,为了方便通过数据库客户端进行数据查询)
2.2 配置工作
2.2.1 下载SonarQube,地址为http://www.sonarqube.org/downloads/
2.2.2 配置数据库(下面的SQL是指定了schema为sonar,password为sonar,其中第四条SQL是localhost是因为MySQL安装在本地)
mysql -u root -p
mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
mysql> FLUSH PRIVILEGES;
2.2.3 安装SonarQube
I. 将下载的sonar-3.7.zip包解压至Windows某个路径,如D:\Tools\sonar(如是其他OS,请选择对应路径,如Linux的/usr/local/等)。
II. 修改sonar.properties
在<install_directory>/conf/sonar.properties文件中,配置数据库设置(默认已经提供了各类数据库的支持这里使用mysql,因此取消mysql模块的注释),同时因为端口冲突而改成端口为11000。
# User credentials.
# Permissions to create tables, indices and triggers must be granted to JDBC user.
# The schema must be created first.
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
#----- Embedded Database (default)
# H2 embedded database server listening port, defaults to 9092
#sonar.embeddedDatabase.port=9092
#----- MySQL 5.6 or greater
# Only InnoDB storage engine is supported (not myISAM).
# Only the bundled driver is supported. It can not be changed.
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
# TCP port for incoming HTTP connections. Default value is 9000.
#sonar.web.port=9000
sonar.web.port=11000
III. 在<install_directory>/bin/目录下,运行/windows-x86-64/StartSonar.bat (因为本demo是在win10 64位安装的,如果是Linux的话,运行 nohup bash sonar.sh start &)
IV.访问http://localhost:11000,如果不是本机就输入http://[remote IP]:11000,如果你看到下图所示即证明配置成功。
2.2.4 用admin/admin(默认)进行登录,并安装汉化包




3、Sonar Scanner安装、配置
3.1 配置工作
3.1.1 下载Sonar Scanner,地址为https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
3.1.2 将下载的sonar-scanner-cli-3.3.0.1492-windows.zip包解压至Windows某个路径,如D:\Tools\sonar(如是其他OS,请选择对应路径,如Linux的/usr/local/等)
3.1.3 修改环境变量
新增变量:SONAR_SCANNER_HOME = D:\Tools\sonar\sonar-scanner-3.3.0
修改Path变量:增添%SONAR_SCANNER_HOME%\bin\
3.1.4 安装Sonar Scanner
I. 将下载的sonar-3.7.zip包解压至Windows某个路径,如D:\Tools\sonar(如是其他OS,请选择对应路径,如Linux的/usr/local/等)。
II. 修改sonnar-scanner.properties
在<install_directory>/conf/sonar-scanner.properties文件中,设置SonarQube服务器。
#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here
#----- Default SonarQube server
sonar.host.url=http://localhost:11000
III. 到你想检测的工程根目录下新建文件sonar-project.properties,文件内容如下?,文件中的参数配置,参考Sonar Analysis Parameters这篇文章。
#这里的配置转自https://www.jianshu.com/p/e384595d0b14,并进行部分调整,如加进JACOCO参数
# 指定SonarQube instance必须是唯一的
sonar.projectKey=Guns
# 设置SonarQube UI显示的名称
# PS:有人会问这里的名称是否可以是中文名称,我在网上搜索了好多资料都说是不可以的(至少我看到的资
#料都是)后来自己尝试了一下,答案是可以写成中文的,但是要换一种方式,比如你想把项目名称命名为“测
#试”,那么在这里就要写成“\u6d4b\u8bd5”,那么下面这个参数就应该这样写“sonar.projectName=
#\u6d4b\u8bd5”,说白了就是将中文转成Unicode
sonar.projectName=Guns
sonar.projectVersion=1.0
sonar.language=java
# 指定src和classes文件夹位置,当然也可以是全路径,如果是当前工程根目录下用“.”表示也可以,比如“sonar.sources=.”
sonar.sources=src/main
sonar.test=src/test
sonar.java.binaries=target
# 下面的这两个参数作用是相同的,因为有时我们需要指定某个文件夹或者忽略某个文件夹
# sonar.inclusions=src1/**,src3/**
# sonar.exclusions=src2/**,src4/**
# 源码编码,默认是系统编码
sonar.sourceEncoding=UTF-8
# Set jacoco Configuration
# 指定代码覆盖率工具
sonar.core.codeCoveragePlugin=jacoco
# 指定exec二进制文件存放路径
#sonar.jacoco.reportPaths=[yourPath/]jacoco.exec
#本demo之前设置的exec文件是在工程根目录下的target/coverage-reports下:
sonar.jacoco.reportPaths=target/coverage-reports/jacoco-unit.exec
# 以下属性可选择性加,当然也可以不加
sonar.dynamicAnalysis=reuseReports
sonar.jacoco.reportMissing.force.zero=false
3.2 运行
在命令行模式下,在工程的根目录下键入命令“sonar-scanner”,你会看到以下日志:

接着,重新登录SonarQube平台,检测的结果已经在平台上展现出来
从上图你可以看出来,连单元测试覆盖率的统计也生成出来了,主要原因为在该maven项目之前已经集成了Jacoco插件(具体Maven与Jacoco的集成请参考我的另外一篇文章)。
4、Jacoco、maven与SonarQube的集成
4.1 前置条件
4.1.1 该项目为maven项目,并且Jacoco已经通过POM文件集成到项目中,具体步骤请参考我的另外一篇文章。
4.1.2 该集成方案其实还是首先通过maven package 命令去生成对应的覆盖率报告,然后通过sonar scanner直接使用该覆盖率报告并通过一定算法加工并展示到SonarQube的界面上去。
4.2 配置工作
4.2.1 在项目根目录的sonar-project.properties文件中,增添以下配置内容:
# 指定代码覆盖率工具
sonar.core.codeCoveragePlugin=jacoco
# 指定exec二进制文件存放路径
#sonar.jacoco.reportPaths=[Your path]/jacoco.exec
#本demo之前设置的exec文件是在工程根目录下的target/coverage-reports下:
sonar.jacoco.reportPaths=target/coverage-reports/jacoco-unit.exec
# 以下属性可选择性加,当然也可以不加
sonar.dynamicAnalysis=reuseReports
sonar.jacoco.reportMissing.force.zero=false
4.2.2 在SoarQube登录admin,并通过在【配置-应用市场】下找到Jacoco插件并安装和重启。
4.3 运行
4.3.1 在项目根目录下,运行 mvn package,当build成功的时候Jacoco的结果就会产生在target/site/jacoco文件夹下。

4.3.2 接着,在项目根目录下运行命令 sonar-scanner,如果看到以下结果证明已经覆盖率已经可以在SonarQube上查阅。

5、结束语
下一篇会继续补充如何通过SonarLint整合到IntelliJ IDEA,并同时如何整合到Jenkins实现自动化测试。