一、 Sonar简介
Sonar是一个用来管理源码质量的开源平台,可以从多维度进行静态代码检测。利用其可扩展性,sonar平台通过扩展插件的方式,支持不同测试工具、代码分析工具以及持续集成工具的集成,从而实现多种编程语言的代码质量检查和管理。正是因为它可以实现多种变成语言的代码检测,所以相对单一语言的检查工具或平台来看,稍显厚重,相对的可扩展性也就更强大。
sonar作为一个代码质量管理和检测平台,既可以单独完成代码质量检查和结果分析,也可以通过插件获取其他静态代码检测工具的检查结果进行分析,因此,我们目前已有的Jenkins上实现的静态代码检查,通过插件和环境的配置,可以实现将检查结果集成到sonar平台,还可以将不同检测工具(Findbugs、OCLint、ESLint)的检查结果的统一化
代码扫描工具对比
工具名称 | 语言支持 | 类型 | 开源/付费 | 主要特点 |
spotbugs/findbugs | java | 静态分析 | 开源 | 使用静态分析查找 Java 代码中的错误 |
TScanCode | C/C++、C#、Lua | 静态扫描 | 开源 | 助力开发与测试人员从代码层面挖掘问题,支持自定义配置检查项 |
pclint | C/C++ | 静态分析 | 付费 | 检查 C/C++ 源代码并发现错误、冗余代码等 |
Cppcheck | C/C++ | 静态分析 | 开源 | 提供独特的代码分析来检测错误,并专注于检测未定义的行为和危险的编码结构 |
Klocwork | C、C++、C#、Java、JavaScript | 静态分析 | 付费 | 可识别软件安全性、质量和可靠性问题 |
Coverity Prevent | C/C++、C#、Java | 静态分析 | 付费 | 专长于最准确地找到最严重和最难检测的缺陷 |
ESLint | JavaScript、Node.js | 代码检查 | 开源 | 用于寻找有问题的模式或代码,不依赖于具体的编码风格 |
Flake8 | Python | 代码检查 | 开源 | 综合 PyFlakes、pep8 和 McCabe,提供静态检查和代码复杂度分析功能 |
Pylint | Python | 代码检查 | 开源 | 检查 Python 代码错误、执行编码标准并查找代码异味 |
PhpMetrics | PHP | 代码分析 | 开源 | 分析 PHP 代码并提供关于复杂性、依赖关系、违规等的报告 |
golangci-lint | Go | Lint 聚合器 | 开源 | 速度快,易于集成和使用,支持 go modules |
sonarqube | 多种 | 静态代码分析 | 开源 | 支持多种语言,能够集成在 IDE、Jenkins、Git 等服务中,提供代码质量分析报告 |
ESLint | JavaScript、Node.js | 代码检查 | 开源 | 用于寻找有问题的模式或代码,不依赖于具体的编码风格 |
二、 Sonar的核心
SonarQube主要由以下部分组成:
SonarQube 组成 | ? |
SonarQube Server | Sonar服务 |
SonarQube Database | 数据库本自带H2的数据库 |
SonarQube Plugins | 插件 |
SonarQube Scanner | 扫描器 |
其中,SonarQube Scanner就是SonarCube用来进行静态代码检查的工具,通过它,将项目的代码读取并发送至SonarQube服务器中,才能让SonarQube进行代码分析。和我们目前在Jenkins上使用的ESLint等工具是一样的,只是在Sonar这里使用是将ESLint这些工具作为插件使用的。
SonarQube检测的核心:
SonarQube 检测的核心 | |
检查代码是否遵循编程标准 | 命名规范,编写的规范等 |
检查设计存在的(潜在)缺陷 | 检测代码存在的缺陷 |
检测代码的重复代码量 | 展示项目中存在大量复制粘贴的代码 |
检测代码中注释的程度 | 是否源码注释过多或者太少 |
检测代码中包、类之间的关系 | 分析类之间的关系是否合理,复杂度是否合适 |
官网上给出的Sonar会检测出来的代码七大问题:
代码七大问题 | |
糟糕的复杂度分布 | 文件、类、方法等复杂度过高 |
重复 | 大量的复制粘贴代码的出现 |
缺乏单元测试 | Sonar会统计并展示单元测试覆盖率 |
没有代码标准 | 通过PMD,CheckStyle,Findbugs等这些代码规则检测工具规范代码编写 |
没有足够的或者过多的注释 | 避免过多的注释降低代码可读性 |
潜在的bug | 通过PMD,CheckStyle,Findbugs等等代码规则检测工具检测出潜在的bug |
糟糕的设计 | 找出循环,展示包与包、类与类之间的相互依赖关系,检测自定义的架构规则 |
三、 Sonar的优势
Sonar的分析器在分析源码的时候,提供了技术债务、代码覆盖率、代码复杂度、已检测到的问题等。检查结果和其他静态代码检测工具是类似的,除了可以检测出bug外,还会包括可能的bug,可能引起bug的问题等等。简单总结Sonar的优点:
1. 支持多种源码检测:
Sonar支持多种语言的检测,包括J ava、Python、Groovy、C、C++、JS等几十种编程语言的检测。
2. 报告格式清晰统一:
Sonar在对检查结果进行分析后,会输出一个统一格式的分析结果,我们可以借助这一点实现多种编程语言的检查结果的统一化(我们目前Android、IOS、RN使用的不同检查工具的检查结果形式都是不同的)。
Sonar检查结果会展示在一个动态的页面,通过不同的高亮方式标记不同的文件,清晰明显的标记告知查看者检查结果。而且在这个动态页面,还可以容易准确的查看项目的历史检测详情,便于对比。用图表和可视化的形式随着时间跟踪项目质量,还可以针对某个精确的时间放大分析结果,做更多的粒度分析。
3. 代码内可自定义规则:
如果我们需要在Sonar上直接进行静态代码检查,也是可以增加自定义检查规则的,而Sonar的检查结果,自然也会将自定义的检查结果一同进行分析,实现更加定制化的代码质量管理。
Sonar在标准设定后,会强制性进行代码检测,代码必须通过所有检查项的检查。
4. 支持本地检测:
SonarQube平台以源码作为输入。源码可以从IDE输入或者从SCM中提取。对于大多数流行的IDE,都有相应的SonarQube插件,使代码分析能够更加容易地在IDE中执行。