SonarQube-介绍

Sonar是一个代码质量管理的开源平台,基于Java开发的,用于管理源代码的质量,通过插件形式,可以支持包括java、C#、JavaScript等二十余种编程语言的代码质量管理与检测。
image.png
它具有免费的社区版本和其他付费版本。利用SonarQube的主要好处是:
它集成了数千种自动的静态代码分析规则,旨在提高开发人员的代码质量和安全性,使得开发人员编写更加干净,更加安全的代码。主要提供了三个比较大的功能:

  • 代码可靠性支持:提前捕获和提示代码中的错误,从而避免未定义的行为影响到终端用户。
  • 应用安全支持:修复可能危害到应用程序的漏洞,并通过安全热点学习AppSec(简单理解就是会学习和识别新的漏洞)。
  • 技术债务支持:确保管理的代码库干净并且可维护,以便提高开发人员的开发效率。

这可以帮助你确保代码在合并之前达到预期的质量!

  • 只需一行命令即可轻松集成到CI/CD管道中。
  • 也可以集成到Maven和Gradle构建周期中
  • 检查几乎所有内容,如代码质量,格式,变量声明,异常处理等。

实际上,研发团队可以基于SonarQube做下面的事情:

  • CI/CD流程加入一个SonarQube扫描的环节
  • 实施代码质量阈值,只有通过了这个质量阈值检测才能进入下一个流程
  • 代码质量低于阈值的项目要及时调整对应的代码

质量阈值可以进行自定义,SonarQube中针对每个项目会有详细的面板信息,里面会给出项目当前的健康状态,不同级别漏洞的分类和明细,漏洞对应提交者等多维度的统计信息,方便进行问题的追踪和修复。

举个例子,笔者在上一家公司项目上线需要跑一个流水线,而SonarQube设定了不同等级的阈值,对于老项目,会使用最低等级的阈值:阻断性的错误数量要求为0,对于一些新的项目,则严格要求质量如严重性的错误要求为0等,只要无法通过质量阈值检查,那么项目是无法上线的。

SonarQube-组成

1.Sonarqube Server 启动三个主进程:

  • Web Server 供开发人员,管理人员浏览质量快照并配置SonarQube实例
  • Search Server 基于ElasticSearch从UI返回搜索
  • Complate Engine Server 负责处理代码分析和上报并将其保存到SonarQube数据库中

2.Sonarqube Database : 用于存储配置

  • SonarQube实例的配置(安全,插件…的设置)
  • 项目,视图…的质量快照


    3.Sonarqube Plugins: 插件增加功能

  • Server上安装了多个插件,可能包括Language,SCM,Intergration,Authentication,Governance…

4.Sonar-Scanner : 代码扫描工具 可以有多个
image.png

1、SonarQube服务器

  1. sonarqubesonar的服务端,相当于一个web服务器,用来发布应用,在线浏览、配置分析等。
  • 开发人员和管理员操作频繁,用于浏览代码质量和配置服务器。
  • 集成ElasticSearch做搜索服务,用于返回通过UI搜索内容。
  • 集成计算引擎处理代码分析后的报告,并将报告保存到数据库。

    1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/5374140/1638631805869-9a5ae889-621c-4408-9168-bab446c74115.png#clientId=u6e911ba8-b33c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=249&id=u17b281fb&margin=%5Bobject%20Object%5D&name=image.png&originHeight=353&originWidth=625&originalType=binary&ratio=1&rotation=0&showTitle=false&size=30343&status=done&style=none&taskId=u4414718c-b230-4360-99bf-5cafce0f500&title=&width=440)

每个文件夹的作用

  • bin:sonarqube运行命令文件夹
  • conf:sonarqube配置文件夹
  • data:嵌入式数据库的数据(H2数据库引擎),建议只用于测试和演示
  • extensions:sonarqube的插件等存放文件夹
  • lib:sonarqube存放的运行库文件夹(jar)
  • logs:sonarqube日志文件夹
  • temp:sonarqube临时文件夹
  • web:sonarqube系统UI界面文件夹

    2、SonarQube数据库

  • 存储代码分析数据报告。

  • 支持oracle、PostgreSQL、MySQL。

    3、Sonarqube-Scanner

    sonarqube-scanner相当于sonar客户端,sonarqube-scanner如下图所示。每个文件夹的作用和sonar类似,具体不在赘述。

  • 客户端工具,用于扫描项目。

  • 将扫描结果上传到服务器。

    1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/5374140/1638631849544-2ddb3a78-bf95-4a1a-9666-b5833e5c8b40.png#clientId=u6e911ba8-b33c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=156&id=uf2a6cbfa&margin=%5Bobject%20Object%5D&name=image.png&originHeight=197&originWidth=610&originalType=binary&ratio=1&rotation=0&showTitle=false&size=15011&status=done&style=none&taskId=ub9d0cf6f-64e4-43ab-ac64-4600abc29b5&title=&width=484)

    4、SonarQube插件库

  • 通过插件使平台功能更加强大。

  • 常用的插件分类: SCM、集成、身份验证、管理维护等插件。


    关于机器和位置

  • 平台不能通过多个sonarqube服务器公用一个数据库。

  • 每个组件应单独安装在专用计算机上,这样性能是最好的。
  • 扫描器可以在多台机器进行扩展。
  • 所有机器的时间应该是同步一致的。
  • 服务器与数据库必须位于同一网络中。
  • 扫描器和服务器可以不再同一网络中。
  • 扫描器和数据库之间是没有通信的。

SonarQube-集成

下面的模式展示了SonarQube如何与其他ALM工具集成,以及使用SONARQUE的各种组件。

  1. 开发人员在IDE中编写代码,并使用SonarLint来运行本地分析。
  2. 开发人员将他们的代码推到他们最喜欢的SCM:Git,Svn,TFVC,…
  3. 连续集成服务器触发自动构建,执行SONARQUE扫描器需要运行SONARQUE分析。
  4. 分析报告被发送到SONARQUE服务器进行处理。
  5. SONARQUE服务器在SONARQUE数据库中处理和存储分析报告结果,并将结果显示在UI中。
  6. 开发人员审查、评论、挑战他们的问题,通过SONARQUE UI管理和减少他们的技术债务。
  7. 管理者从分析中得到报告。
  8. OPS使用API来自动配置并从SONARQUE中提取数据。
  9. OPS使用JMX监控SONARQUBE服务器。

sonarqube-1.png

SonarLint是一个Sonar IDE插件,可以接收和连接SonrarQube对代码库扫描的结果从而通知Developer, SonarLint本身也可以基于一些规则对代码IDE中的代码进行即时的检测。它的目的是在您键入代码时提供即时反馈。
image.pngimage.png

SonarQube-概念

概念 定义
Bug 表示代码中出错的问题
Code Smell 代码中与可维护性相关的问题
Cost 花费
Debt 解决问题所需的时间
Issue 代码不符合规则时,快照上会记录一个问题。有: Bugs , Code Smells and Vulnerabilities
Measure 给定时间内给定文件或项目的度量值
Metric 一种测量方式。随着时间的推移,度量标准可能具有不同的值或度量
New Code Period 需要密切关注代码中引入新问题的时间段
Quality Profile 一组规则
Rule 应该遵循的编码标准或惯例
Remediation Cost 修复漏洞和可靠性问题所需的估计时间
Snapshot 在给定时间内针对给定项目的一组度量和问题
Security Hotspot 与安全相关的问题,突出显示使用安全敏感API的一段代码
Technical Debt 修复问题所需的估计时间
Vulnerability 与安全相关的问题,代表攻击者的后门

SonarQube-指标

项目有如下指标:

  • 复杂度(Complexity) - 应用的控制流是简单还是复杂
    • 圈复杂度
      • Cyclomatic Complexity- 可以计算出达到全面覆盖需要的最少测试用例。
      • 它是基于通过代码的路径数计算的,每当函数的控制流分裂时,复杂度计数器就会增加1。每个函数的最小复杂度为1.此计算因语言而异,因为关键字和功能有所不同。
    • 认知复杂度
      • Cognitive Complexity- 对应这个应用是否很难被理解,理解代码的控制流程有多难。
  • 重复(Duplications)
  • 问题(Issues)
  • 可维护性(Maintainability)
  • 质量阈(Quality Gates)
  • 可靠性(Reliability)
  • 安全性(Security)
  • 大小(Size)
  • 测试(Tests)

image.png