SonarQube-介绍
Sonar是一个代码质量管理的开源平台,基于Java开发的,用于管理源代码的质量,通过插件形式,可以支持包括java、C#、JavaScript等二十余种编程语言的代码质量管理与检测。
它具有免费的社区版本和其他付费版本。利用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 : 代码扫描工具 可以有多个
1、SonarQube服务器
sonarqube是sonar的服务端,相当于一个web服务器,用来发布应用,在线浏览、配置分析等。
- 开发人员和管理员操作频繁,用于浏览代码质量和配置服务器。
- 集成ElasticSearch做搜索服务,用于返回通过UI搜索内容。
集成计算引擎处理代码分析后的报告,并将报告保存到数据库。
![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临时文件夹
-
2、SonarQube数据库
存储代码分析数据报告。
-
3、Sonarqube-Scanner
sonarqube-scanner相当于sonar客户端,sonarqube-scanner如下图所示。每个文件夹的作用和sonar类似,具体不在赘述。
客户端工具,用于扫描项目。
将扫描结果上传到服务器。
![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插件库
通过插件使平台功能更加强大。
-
关于机器和位置
平台不能通过多个sonarqube服务器公用一个数据库。
- 每个组件应单独安装在专用计算机上,这样性能是最好的。
- 扫描器可以在多台机器进行扩展。
- 所有机器的时间应该是同步一致的。
- 服务器与数据库必须位于同一网络中。
- 扫描器和服务器可以不再同一网络中。
- 扫描器和数据库之间是没有通信的。
SonarQube-集成
下面的模式展示了SonarQube如何与其他ALM工具集成,以及使用SONARQUE的各种组件。
- 开发人员在IDE中编写代码,并使用SonarLint来运行本地分析。
- 开发人员将他们的代码推到他们最喜欢的SCM:Git,Svn,TFVC,…
- 连续集成服务器触发自动构建,执行SONARQUE扫描器需要运行SONARQUE分析。
- 分析报告被发送到SONARQUE服务器进行处理。
- SONARQUE服务器在SONARQUE数据库中处理和存储分析报告结果,并将结果显示在UI中。
- 开发人员审查、评论、挑战他们的问题,通过SONARQUE UI管理和减少他们的技术债务。
- 管理者从分析中得到报告。
- OPS使用API来自动配置并从SONARQUE中提取数据。
- OPS使用JMX监控SONARQUBE服务器。
SonarLint是一个Sonar IDE插件,可以接收和连接SonrarQube对代码库扫描的结果从而通知Developer, SonarLint本身也可以基于一些规则对代码IDE中的代码进行即时的检测。它的目的是在您键入代码时提供即时反馈。
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)