SonarQube代码质量检查工具

Sonar (SonarQube)是一个开源平台,用于管理源代码的质量。 Sonar 不只是一个质量数据报告工具,更是代码质量管理平台。 支持java, C#, C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等等二十几种编程语言的代码质量管理与检测。 Sonar可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题。

  1. 不遵循代码标准 sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写。
  2. 潜在的缺陷 sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检 测出潜在的缺陷。
  3. 糟糕的复杂度分布 文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员 难以理解它们, 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。
  4. 重复 显然程序中包含大量复制粘贴的代码是质量低下的,sonar可以展示 源码中重复严重的地方。
  5. 注释不足或者过多 没有注释将使代码可读性变差,特别是当不可避免地出现人员变动 时,程序的可读性将大幅下降 而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。
  6. 缺乏单元测试 sonar可以很方便地统计并展示单元测试覆盖率。
  7. 糟糕的设计 通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则 通过sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况, 检测耦合。

通过以下介绍SonarQube的架构、安装、使用说明。

1、架构和集成工具

架构:

  1. SonarQube Server 包含3个主要服务进程 ①WebServer ②SearchServer 使用elastic search 做为搜索的工具ui ③ComputeEngineServer 分析并且保存到sonar数据库中
  2. SonarQube Database ① 配置实例项、插件安装等 ② 项目质量快照视图
  3. SonarQube Plugins 各种插件:如 语言插件、认证插件、编程语言检查插件等等
  4. SonarQube Scanners 分析项目的工具

使用一张更形象的图描述架构图

iOS 代码质量工具 代码质量检查工具_数据库

集成:

iOS 代码质量工具 代码质量检查工具_iOS 代码质量工具_02

SonarQube集成步骤如下:

  1. ① 在IDE中使用sonarlint运行本地分析(如果sonarqube 开启了访问权限 需要添加登录名称和密码变量) 具体参考:4.3 配置分析参数
  2. ② 开发者将代码提交到scm工具中
  3. ③ 持续集成工具自动触发检查代码执行SonarQube Scanner 运行sonarqube分析
  4. ④ 分析报告传递给sonarqube server进行加工处理
  5. ⑤ 进行处理分析、将数据保存到数据库中、将效果通过ui展示出来。
  6. ⑥ 开发者通过sonarqube ui查看自己的bug和技术债等。
  7. ⑦ 项目经理、运维经理、测试经理通过代码报表进行查看管理

名词解释SCM:

软件配置管理(Software Configuration Management,SCM)是一种标识、组织和控制修改的技术。软件配置管理应用于整个软件工程过程。
在软件建立时变更是不可避免的,而变更加剧了项目中软件开发者之间的混乱。SCM活动的目标就是为了标识变更、控制变更、确保变更正确实现并向其他有关人员报告变更。
从某种角度讲,SCM是一种标识组织和控制修改的技术,目的是使错误降为最小并最有效地提高生产效率。

百度百科介绍:SCM软件配置管理

部署架构:

部署原则上遵循以下规则点就可以:

  1. ①sonarqube server 、sonarqube database 、sonarqube scanner 最好不要部署在一台机器上。
  2. ②sonarqube server 、sonarqube database 、sonarqube scanner时间必须同步(时钟同步)
  3. ③sonarqube server 、 sonarqube database 在同一网络层下
  4. ④ SonarQube Scanners 和SonarQube Database没有直接的通信

2、环境要求

最重要的要求:

最新版本5.6+、6.x 要求 安装java Oracle JRE 8 onwards or OpenJDK 8 onwards

硬件要求:

能跑的动

支持平台:

  1. java环境 Oracle JRE 8 onwards or OpenJDK 8 onwards
  2. 数据库 mysql5.6+ 、 Oracle11g
  3. 浏览器 IE 11、其他主流浏览器

详细环境要求请参考:安装SonarQube环境要求

3、安装和升级

名词解释数据库schame、请参考:Schema (数据库中的Schema)

安装:

3.1 安装数据库

  1. ①创建schema对应oracle数据库用户名称、对应mysql数据库请创建数据库
  2. ②创建用户、授权① 创建、删除、修改对象的权限
  3. ③ 设置①中的charset 为 utf-8

3.2 安装SonarQube web server

  1. ① 检查配置项目如:jdk8+
  2. ② 下载二进制文件 https://www.sonarqube.org/downloads/ 并解压缩安装
  3. ③ 设置数据库配置项目 <install_directory>/conf/sonar.properties
    实例mysql数据库: sonar.jdbc.username=root sonar.jdbc.password=dbManager sonar.jdbc.url=jdbc:mysql://192.168.22.198:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
  4. ④ 如果使用oracle 数据库需要配置jdbc driver: <install_directory>/extensions/jdbc-driver/oracle.
  5. ⑤ 启动服务端
    可以在 <install_directory>/conf/sonar.properties 文件中修改端口和context 使用默认就可以。

修改如下配置即可修改默认值如: #sonar.web.host=0.0.0.0 #sonar.web.context= #sonar.web.port=9000

  1. ⑥ 优化调整

可以设置指定的jdk安装路径,<install_directory>/conf/wrapper.conf文件中修改。

如下配置项可以修改默认值:

wrapper.java.command=D:\Program Files\Java\jdk1.8.0_101\bin\java

升级:

启动成功后的效果图如下:

iOS 代码质量工具 代码质量检查工具_iOS 代码质量工具_03

以上截图我已经安装了汉化包和分析了两个项目的源码。

4.开始分析项目代码源代码

官网提供以下分析方法:

  1. SonarQube Scanner: Launch analysis of any language from the command line(通过命令行分析)
  2. SonarQube Scanner for MSBuild: Launch analysis of .Net projects(使用MSBuild分析)
  3. SonarQube Scanner for Ant: Launch analysis from Ant(通过Apache Ant编译工具分析)
  4. SonarQube Scanner for Maven: Launch analysis from Maven with minimal configuration(通过Maven插件集成分析)
  5. SonarQube Scanner for Gradle: Launch Gradle analysis(通过Gradle工具集成分析) SonarQube Scanner For Jenkins: Launch analysis from Jenkins(通过持续集成软件工具jenkins分析)

下文详细介绍 SonarQube Scanner for Maven使用说明。后续如有需要补充Jenkins结合使用。

4.1 SonarQube Scanner for Maven 3.2

要求:

  1. Maven 3.x
  2. Java 8
4.1.1 编辑maven 的setting.xml文件

位置 $MAVEN_HOME/conf or ~/.m2 找到对应的位置添加以下配置代码:

<settings>
					<pluginGroups>
						<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
					</pluginGroups>
					<profiles>
						<profile>
							<id>sonar</id>
							<activation>
								<activeByDefault>true</activeByDefault>
							</activation>
							<properties>
								<!-- Optional URL to server. Default value is http://localhost:9000 -->
								<sonar.host.url>
								  http://myserver:9000
								</sonar.host.url>
							</properties>
						</profile>
					 </profiles>
</settings>

其中sonar.host.ur 值就是 上文启动的sonar 服务器地址。

4.2 对你的maven项目进行分析

使用以下任意命令就可以对你的maven项目进行分析

  1. ①mvn clean verify sonar:sonar
  2. ②mvn clean install mvn sonar:sonar
  3. ③mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.2:sonar
4.3 配置分析参数

强制参数:

  1. Server sonar.host.url http://localhost:9000
  2. Project Configuration sonar.projectKey Maven <groupId>:<artifactId> sonar.sources Maven 默认的源码路径

可以配置的参数:

  1. Project identity sonar.projectName 项目名称 sonar.projectVersion 项目版本
  2. Authentication sonar.login 分析该项目的用户名称 sonar.password 分析该项目的用户密码
4.4 可能遇到的问题(QA):Insufficient privileges
Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.2:sonar (default-cli) on project rss: Insufficient privileges -> [Help 1]

在配置-权限-全局权限 进行修改 赋值

如果在SonarQube web端配置- > 权限 ;执行分析权限进行特殊授权如下:

iOS 代码质量工具 代码质量检查工具_集成测试_04

在使用maven执行分析项目时添加 以上sonar.login 、sonar.password 参数。

5. 程序员用户使用说明

SonarQube Web管理者通过配置和设置以下参数值对项目源代码进行:复杂度、覆盖率、文档、重复、问题、可维护性、可靠性、安全性、大小等约束和规范。sonar中的质量阈管理以下内容。

复杂度
					复杂度
					复杂度/类
					复杂度/文件
					复杂度/方法
				覆盖率
					分支覆盖
					集成测试的新分支覆盖
					新代码的分支覆盖率
					覆盖率
					新集成测试覆盖
					新覆盖率
					集成测试分支覆盖
					集成测试覆盖
					集成测试覆盖行
					集成测试未覆盖分支
					集成测试未覆盖行
					代码覆盖率
					集成测试的新行覆盖
					新代码覆盖率
					代码行
					集成测试的新行覆盖
					覆盖的新代码
					总体分支覆盖率
					总体新分支覆盖率
					总体覆盖率
					总体新覆盖率
					总体代码覆盖率
					总体新代码覆盖率
					总体覆盖的新行数
					总体未覆盖分支
					总体未覆盖的新分支
					总体未覆盖代码
					总体未覆盖新行数
					单元测试忽略数
					未覆盖分支
					集成测试未覆盖的新分支
					未覆盖新分支
					未覆盖的代码
					集成测试未覆盖的行
					未覆盖的新代码
					单元测试持续时间
					单元测试错误数
					单元测试失败数
					单元测试成功 (%)
					单元测试数
				文档
					注释行
					注释 (%)
					公共API
					公共注释的API (%)
					公共未注释的API
				重复
					重复块
					重复文件
					重复行
					重复行(%)
				问题
					阻断违规
					确认问题
					严重违规
					误判问题
					提示违规
					违规
					主要违规
					次要违规
					新阻断违规
					新严重违规
					新提示违规
					新违规
					新主要违规
					新次要违规
					开启问题
					重开问题
					不修复的问题
				可维护性
					新代码的技术债务
					坏味道
					达到可维护性A级所需的工作
					新增坏味道
					技术债务
					技术债务比率
					新代码技术债务比率
					Management
					Burned budget
					Business value
					Team size
				可靠性
					Bugs
					新增Bugs
					可靠性修复工作
					新代码的可靠性修复工作
				安全性
					新增漏洞
					安全修复工作
					新代码的安全修复工作
					漏洞
				大小
					类
					目录
					文件
					方法
					生成的行数
					生成的代码行数
					行数
					代码行数
					项目
					语句

5.1 登录首页效果

iOS 代码质量工具 代码质量检查工具_集成测试_05

5.2 项目指标查看

iOS 代码质量工具 代码质量检查工具_单元测试_06

5.3 项目问题列表

iOS 代码质量工具 代码质量检查工具_单元测试_07

6、管理员使用手册

6.1 管理员配置管理

配置管理内容有:

  1. 配置
  2. 权限
  3. 项目
  4. 系统

iOS 代码质量工具 代码质量检查工具_单元测试_08

6.1.1 管理员配置管理--系统

包含两部分内容分别为:

  1. 更新中心
  2. 系统信息
6.1.1.1 更新中心

方便管理插件、安装插件。

iOS 代码质量工具 代码质量检查工具_集成测试_09

6.1.1.2 系统信息

系统信息就是现实SonarQube安装环境的配置变量和系统配置路径。

如下部分截图:

iOS 代码质量工具 代码质量检查工具_iOS 代码质量工具_10

6.1.2 管理员配置管理--项目管理

包含两部分内容分别为:

  1. SonarQube项目管理
  2. SonarQube后台任务
6.1.2.1. SonarQube项目管理

创建、编辑、修改、删除(批量)SonarQube项目

iOS 代码质量工具 代码质量检查工具_数据库_11

6.1.2.2. SonarQube后台任务

iOS 代码质量工具 代码质量检查工具_集成测试_12

6.2.3 管理员配置管理--权限管理

权限管理内容包含:

  1. 用户
  2. 群组
  3. 全局权限
  4. 项目权限
  5. 权限模板
6.2.3.1. 用户

iOS 代码质量工具 代码质量检查工具_iOS 代码质量工具_13

6.2.3.2. 群组

iOS 代码质量工具 代码质量检查工具_集成测试_14

6.2.3.3. 全局权限

iOS 代码质量工具 代码质量检查工具_数据库_15

6.2.3.4. 项目权限

iOS 代码质量工具 代码质量检查工具_单元测试_16

6.2.3.5. 权限模板

iOS 代码质量工具 代码质量检查工具_集成测试_17

6.2.4 管理员配置管理--配置管理

配置管理模块又包含以下管理:

  1. 通用设置(重点介绍)
  2. Custom Metrics(自定义指标)
  3. 默认仪表盘
6.2.4.1 通用配置

管理的模块有:

  1. Java:配置检查的java源文件及静态代码检查规范检查
  2. SCM:配置软件控制器。上文已经提到的配置项。比如:svn、git等等
  3. SonarJs:雷同java文件检查、
  4. 技术债务:
  5. 授权
  6. 排除
  7. 权限
  8. 通用
6.2.4.1.1 通用配置--技术债

名词解释技术债:

维基百科上的解释:维基百科上的解释

此处配置决定和影响项目仪表盘显示、影响数据库数据。

iOS 代码质量工具 代码质量检查工具_单元测试_18

6.2.4.1.2 通用配置--排除

可以配置通配符排除一下影响代码项目:

  1. 代码覆盖率
  2. 检查文件
  3. 重复行数代码
  4. issues

具体配置请参考具体配置项目。

iOS 代码质量工具 代码质量检查工具_数据库_19

6.2.4.1.2 通用配置--通用

有以下配置项目:

  1. 通用
  2. 对比视图
  3. 数据库清理器
  4. 界面外观
  5. 邮件
  6. 重复 交叉项目重复检测
  7. 问题

7.参考资料

  1. [使用 Sonar 进行代码质量管理](http://www.ibm.com/developerworks/cn/java/j-lo-sonar/ )
  2. SonarQube官方文档
  3. [安装最新版本SonarQube环境要求]( https://docs.sonarqube.org/display/SONAR/Requirements )