SonarQube

1 - 前言

任何引入到软件里的变更将导致系统复杂性的提高以及混乱程度的加深。系统的混乱程度被称为“技术债”。每当新代码被引入到系统时,技术债就会相应增加。
如果技术债长期不受重视的话,得到控制权的可能性将变得越来越渺茫,毕竟越来越多的功能在紧迫的期限内堆积过来。而这将会对软件的生产力和可维护性产生负面影响。
迭代开发方法,将测试的执行自动化,以及使用CI来监控每一次签入的技术债,这些是保证技术债在可控范围内的不二法门。
使用类似SonarQube的(分辨代码质量和跟踪技术债的开源平台),可以轻松地集成到任何CI服务器,并为用户提供团队技术债实时数据的展示。
SonarQube作为一款非常实用的工具,能够在一个友好的web界面上展示它的分析结果,有助于管理和其他相关的非技术人员观测。

2 - Sonar简介

Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量。
通过插件机制(Plugin Library)支持绝大多数主流编程语言的代码质量管理与检测
可以与不同的测试、代码分析、CI、IDE等工具进行集成,例如Maven、Jenkins等
对代码质量分析结果数据进行再加工处理,通过量化的方式来度量,并且能够定制化地展示

  • 检查代码是否遵循编程标准:如命名规范,编写的规范等。
  • 检查设计存在的潜在缺陷:SonarQube通过插件Findbugs、Checkstyle等工具检测代码存在的缺陷。
  • 检测代码的重复代码量:SonarQube可以展示项目中存在大量复制粘贴的代码。
  • 检测代码中注释的程度:源码注释过多或者太少都不好,影响程序的可读可理解性。
  • 检测代码中包、类之间的关系:分析类之间的关系是否合理,复杂度情况。

使用SonarQube可以从七个维度检测代码质量

  • 复杂度分布(complexity):代码复杂度过高将难以理解、难以维护;
  • 重复代码(duplications):重复严重的代码是质量低下的表现;
  • 单元测试(unit tests):统计并展示单元测试覆盖率;
  • 编码规范(coding rules):通过Findbugs,PMD,CheckStyle等代码规则检测工具规范代码编写;
  • 注释(comments):缺少或者过多的注释都会严重影响代码可读性;
  • 潜在的Bug(potential bugs):通过Findbugs,PMD,CheckStyle等代码规则检测工具检测潜在的bug
  • 结构与设计(architecture & design):检测依赖、耦合等关系

3 - Sonar官方信息

4 - SonarQube组件

SonarQube平台由4个组件组成:

  • 一个SonarQube服务器:包含web服务(界面管理)、搜索服务、计算引擎服务(写入数据库)
  • 一个SonarQube数据库:存储安全配置、全局配置、插件配置以及项目的质量快照、展示内容等
  • 多个SonarQube插件:位于服务器端extensionsplugins目录,插件功能多种多样
  • 一个或者多个SonarQube扫描器:运行在构建或CI服务器上,用于分析特定的项目

对于大规模项目的场景,每个组件都可以分离安装到不同的虚拟机或物理机上。

SonarQube服务器

  • WebServer:负责页面展示,可以查看项目情况、页面配置等
  • SearchServer:使用基于内存开源的ElasticSearch作为后台的搜索服务,搜索请求一般从页面发出
  • ComputeEngine:负责处理源码分析报告,并存储报告结果到数据库

5 - SonarQube主要流程

  1. 开发人员可以使用IDE开发,可以使用SonarLint插件进行本地实时代码扫描和分析
  2. 开发人员通过SCM(源代码管理器)将本地推送代码到代码仓库
  3. 自动触发构建与代码分析
  4. CI(持续集成服务器)使用SonarQube扫描器进行代码分析,并上传结果到SonarQube服务器
  5. 持久化数据存储
  6. 开发处理问题,通过SonarQube Sever界面,查看代码问题并处理
  7. 展示或同步报告结果,可以通过Web访问,也可以使用IDE插件来同步SonarQube结果,了解项目代码质量趋势

6 - Sonar扫描器

SonarQube扫描器可以认为是SonarQube服务器对应的客户端,
运行具体代码扫描任务,读取项目代码并发送至SonarQube服务器,以便让SonarQube进行代码分析。
https://docs.sonarqube.org/latest/analysis/overview/

扫描方式

  • 通过命令行:例如SonarQube扫描器
  • 通过构建工具:例如Maven、Gradle等的SonarQube扫描器
  • 通过集成平台:例如Jenkins的SonarQube扫描器
  • 通过本地代码:例如IDE的SonarLint插件

官方文档

原文地址:https://www.cnblogs.com/anliven/p/6260782.html