SonarQube代码质量检查平台

Posted 张维鹏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SonarQube代码质量检查平台相关的知识,希望对你有一定的参考价值。

前言:code review:

        随着业务的发展,系统越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,有一种比较好的方式就是提高代码质量,比如通过 code review,从而降低错误风险。首先,我们先来看看 code reivew 的用处:

  • (1)code review 可以通过大家的建议改善代码的质量,提高代码的可读性、可维护性,以及确保程序逻辑和对需求、设计的实现的正确性
  • (2)code review 是一个传递知识的方式,让不熟悉代码的人知道作者的意图和想法,从而可以在以后轻松维护代码
  • (3)code review 也鼓励程序员们相互学习对方的长处和优点
  • (4)code review 也可以被用来确认自己的设计和实现是一个清楚和简单的

但在 code reivew 的诸多用处中,我们并没有提到可以帮助找到程序的bug和保证代码风格和编码规范,这是因为我们认为:

  • code review 不应该承担发现代码错误的职责。code review 主要是审核代码的质量,如可读性,可维护性,以及程序的逻辑和对需求和设计的实现。代码中的bug和错误应该由单元测试,功能测试,性能测试,回归测试来保证。
  • code review 不应该成为保证代码风格和编码规范的手段。编码规范和代码风格都属于死的东西,当把自己的代码提交给团队 review 时,代码就应该是符合规范的,这是属于每个人自己的事情,不应该交由团队来完成,否则只会浪费大家本来就不够的时间。

        当然,上述言论只是说上面两件事情并不是 code review 的意图,并不是说,你不能在 code review 中报告一个程序的bug或是一个代码规范的问题。如果要把上述两件事归入 code review 的职责,那将会导致 code review 增加大量的人力成本,且工作量随代码量的增加而增加,审查效率低;并且简单的 code review 只能解决代码风格问题,很难发现代码缺陷、漏洞、重复度、复杂度等方面的问题,效果差。

        所以,对于上面这两件事情,除了需要作者自己保证外,当然还有工具可以帮助我们检查代码规范的,比如下文介绍的 Sonarqube 平台。

一、SonarQube 整体介绍:

1、SonarQube 是什么:

        SonarQube 是一个代码质量管理的开源平台,通过 SonarQube 提供的代码扫描、质量阈值卡点等质量红线,我们可以提升系统的可靠性,提前捕获和提示代码中的错误,从而避免未定义的行为影响到用户,保证业务质量,也能确保管理的代码库干净并且可维护,以便提高开发人员的开发效率。

        SonarQube 可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题。

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

        另外 SonarQube 也可以生成详细的代码分析质量报告,并通过强大的仪表盘展示出来,使我们能够根据角色的不同,查看不同维度的度量标准。

2、SonarQube 的工作原理:

官方给出了典型的开发过程:

  • (1)开发人员在编写并提交代码(最好在 IDE 中集成 sonarlint 插件,并在本地进行代码分析检测,减少更多的缺陷代码被集成到 SCM 上)
  • (2)SCM 通过 webhook 调用,触发 CI 持续集成,CI 触发 Sonar Scanner,将本地代码进行扫描分析,输出分析报告,并发送给 SonarQube 服务端
  • (3)SonarQube 接受分析报告并处理,最终渲染到UI界面

SonarQube工作流程包含3个组件:

  • (1)Scanner:扫描器,负责将源文件进行代码分析,并将分析后的报告发送给SonarQube服务器
  • (2)SonarQube Server:SonarQube服务器,负责处理分析报告,后台管理等
  • (3)Database server:数据库服务器,负责存储数据

三、SonarQube 功能与使用说明:

1、项目:

1.1、项目-总览:

1.2、项目-问题:

 问题共分为三种类型:

  • Bug:潜在的代码缺陷,可能引起系统执行异常(比如空指针、魔法值等)
  • 漏洞:潜在的安全漏洞,比如sql注入、cors、xss攻击等
  • 异味:代码的坏味道。比如不遵循代码标准、糟糕的复杂度分布、注释不足或注释过多、糟糕的设计等

(1)问题类型(不推荐修改)

(2)问题的重要程度(不推荐修改)

(3)问题状态,分为五个状态:

  • 打开:问题被质量分析后的初始状态(SonarQube)
  • 确认:问题修复后,需要开发人员手动指定,表示该问题已修复(开发人员)
  • 误判:标记问题为误判,表示此问题不应该标记为问题,无需处理(管理员)
  • 标记为不会修复:表示此问题不做处理(管理员)
  • 重新打开:当SonarQube再次分析报告时,若问题再次暴露则显示为重新打开(SonarQube)

(4)问题指派:

可以将问题分配给指定用户。

当问题分配给其他用户后,若该用户有启动提醒功能,则SonarQube会发送邮件进行告警

当 Sonar 分析报告后,会根据SCM的相关记录找到对应的用户,进行自动指派。

 (5)其他:

1.3、项目-安全热点:

安全热点是SonarQube检测出来可能存在安全问题,需要项目管理员进行复审,确认是否存在问题。

1.3.1、项目-安全热点-复审:

首先确保当前用户具有管理安全热点的权限

具有安全热点管理权限后,按钮将显示为蓝色

 复审状态总共有三个,分别为

  • (1)需要复审:默认状态
  • (2)已修复:表示该安全代码已经修复
  • (3)安全:代码风险,无需修改

1.3.2、项目-安全热点-SonarQube提醒/建议:

在这个板块,SonarQube会解释为何是安全代码,且告诉你怎么修复。(英语不好的人建议翻译一下)

 翻译后

1.4、项目-指标:

观测当前项目的代码质量

1.5、项目-代码:

即SCM更新下来的代码,没啥区别,SonarQube自己也会存储一份

1.6、项目-活动:

分析记录的日志

 1.7、项目-项目配置:

管理项目的基本配置

1.7.1、设置:

设置项目的基本配置信息(不推荐)

1.7.2、新代码周期:

设置新代码周期的定义,默认按通用配置(即按上个版本的分析开始计算)。

也可以指定其他选项,如“天数”,可以指定距离上次分析多少天的数据作为为新代码

1.7.3、质量配置:

        质量配置,表示项目适配的质量配置,质量配置都是基于语言的,一个质量配置下面会存在多个代码规则。下图表示的项目qx_whale的质量配置基于java、xml两种语言,别分启用了452和11条代码规则。

1.7.4、质量阈:

它是项目质量是否合格的标准,通过设置质量阈来判断项目的代码质量是否达标。

 默认使用SonarQube内置的质量阈配置(Sonar way)

也可以自定义质量阈,如笔者定义的My Sonar Way,只要出现阻断违规问题,就达不到质量阈的要求

1.7.5、自定义指标:

即项目-指标板块,展示项目的代码质量。 官方表示未来会废弃,所以不推荐大家使用

1.7.6、链接:

配置一些跳转链接,比如项目的首页地址。建议在SonarScanner运行时指定sonar.links.homepage去配置首页地址

1.7.7、权限:

当前项目的权限配置,后面用户与权限模块会特别介绍,这里就不赘述了

1.7.8、后台任务:

可以查看项目最近分析的记录

1.7.9、更新标识:

SonarQube每个项目的标识都是唯一的,请确保使用者的项目标识唯一!!!

1.7.10、网络调用:

俗称web hook,懂得都懂(可以与jenkins集成,将分析报告的质量阈状态回传,以便jenkins判断是否继续执行pipeline任务)

1.7.11、删除:

谨慎操作,点击删除后有二次确认操作。

2、问题:

        问题菜单跟“项目-问题”展示的基本一致,不同的是,问题菜单展示的是个人参与项目的所有问题,所以数量上相对较多

3、代码规则:

代码规则,用来分析代码是否有问题

4、质量配置:

质量配置,用于定义编程语言的代码分析集合。一个质量配置可以配置多个代码规则

举个例子,我们看下质量配置/Java下的代码规则详情,下图表示Java语言的质量配置模板Sonar way,共配置了452个激活的规则,187个未激活的规则,一共配置了639个规则。

内置质量模板Sonar way不允许修改,若用户想要自定义质量模板,必须拥有“质量配置管理员”的权限才可以进行操作。

举个例子,新建一个Java语言的质量模板

在左边的卡片“规则”中,我们点击“更多激活规则”

回到质量模板MyJavaRule,可以看到我们配置了一条代码规则。那么质量配置就介绍到这里了。

什么情况下会使用到质量配置呢?一般使用官方内置的Sonar way即可,如果有特殊需求的话,可以自己去定义质量模板。

5、质量阈:

        质量阈是一系列基于指标的布尔表达式,用户标准化质量,它可以帮助我们实时了解项目是否已经满足生产要求了。在集成进流水线的情况下,质量阈提供了质量卡点的能力,当存在质量项尚未达标的情况下,阻止发布流程进入到下一环节,流水线运行时会根据对应的质量红线对测试任务进行判断,是否能够通过红线,如果未通过红线,对应的任务将失败。但考虑在一些特殊的情况下,未通过质量红线的流程也需要继续往下执行,可以由管理员将红线跳过

上图表示,所有项目默认的质量阈均为Sonar way,指标解释:新代码分析时,若覆盖率小于80% 或者 重复行大于3% 或者…安全比率劣于A时,判定为质量阈失败。

5.1、质量阈-自定义质量阈:

        默认情况下,所有项目使用相同的质量阈,每个项目的质量阈状态都会展示在首页。质量阈值也可以进行自定义,设定不同等级的阈值,对于老项目,会使用最低等级的阈值:阻断性的错误数量要求为0,对于一些新的项目,则严格要求质量如严重性的错误要求为0等,只要无法通过质量阈值检查,那么项目是无法上线的。

        自定义质量阈,首先要有质量阈管理员的权限,可以参考下图设置(建议技术经理或者项目负责人设置此权限)

新建一个自定义质量阈MySonarWay,只添加一个条件,当阻断违规的问题大于0时,判定为质量阈失败。

同时,还可以指定哪些项目使用此质量阈

6、配置: 

6.1、用户与权限:

6.1.1、用户管理:

 6.1.2、群组管理:

可以通过群组,来进行用户的统一授权

 6.2、项目权限:

项目权限,用于设置公开或者私有,公开项目所有人都可以访问,私有项目只有访问权限的人可以访问(推荐)

设置项目权限范围,管理员等

6.3、用户与权限-最佳实践:

6.3.1、最佳实践-角色分工:

角色大致上可以分为三种:系统管理员、技术经理、开发人员

(1)最佳实践-角色分工-系统管理员:

系统管理员:只负责sonar平台的管理,不负责项目相关操作

(2)最佳实践-角色分工-技术经理:

技术经理:负责项目成员定义,项目组定义,权限分配,质量配置、质量阈等配置

 (3)最佳实践-角色分工-开发人员:

开发人员:默认项目创建项目执行分析,当开发人员创建项目时,该人员成为项目的管理者,拥有项目的所有权

(4)最佳实践-权限模板:

配置默认权限模板(Default template),项目创建人拥有项目的所有权。

 若技术经理也需要同等权力的话,可以主动申请成为项目的管理员(详见下图)

 6.4、提醒(邮件告警)

6.4.1、系统邮件设置:

 6.4.2、项目提醒设置:

只有订阅了项目提醒,用户才会收到项目推送的邮件。在管理员进行问题分配给用户时,特别有用。以下介绍如何进行项目提醒设置:

(1)方式一:

进入项目

点击项目信息,设置提醒

 全部勾选

(2)方式二(推荐):

一步到位,设置也简单。在个人账号设置自己的 

1、主要参考文章:

https://blog.csdn.net/weixin_31257709/article/details/124566064

2、推荐阅读:

从Code Review 谈如何做技术

Code Review中的几个提示

以上是关于SonarQube代码质量检查平台的主要内容,如果未能解决你的问题,请参考以下文章

SonarQube代码质量检查平台

SonarQube代码质量检查平台

搭建SonarQube代码质量平台——提升代码质量

十分钟搭建和使用sonarqube代码质量管理平台

平台代码检查工具:sonarLint+sonarqube安装教程

平台代码检查工具:sonarLint+sonarqube安装教程