Jenkins+SonarQube6.5.5+SonarScanner2.5代码质量管理平台

Jenkins+SonarQube6.5.5+SonarScanner2.5代码质量管理平台

简介

Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质量。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具,比如pmd-cpd、checkstyle、findbugs、Jenkins。通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。

为神马要分析我的代码

对代码质量关注时,安排人工进行code review是需要的,但100%的code review却需要投入人员,消耗大量的工作量,而工具自动检查只需少量人工配置。
最主要的原因就是提高代码质量,了解RD在编码过程中犯过的错误可能对功能逻辑产生的影响,同时也推动RD让自己的代码更具有可读性和维护性,所以我们借鉴持续改进的流程,希望能够在这个过程中有所收获

SonarQube能干什么?

SonarQube 在进行代码质量管理时,会从图 1 所示的七个纬度来分析项目的质量。
Jenkins+SonarQube6.5.5+SonarScanner2.5代码质量管理平台

  1. 不遵循代码标准
    sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写。
  2. 潜在的缺陷
    sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检 测出潜在的缺陷。

Jenkins+SonarQube6.5.5+SonarScanner2.5代码质量管理平台

  1. 糟糕的复杂度分布
    文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员 难以理解它们, 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。Jenkins+SonarQube6.5.5+SonarScanner2.5代码质量管理平台
  2. 重复
    显然程序中包含大量复制粘贴的代码是质量低下的,sonar可以展示 源码中重复严重的地方。

Jenkins+SonarQube6.5.5+SonarScanner2.5代码质量管理平台

  1. 注释不足或者过多
    没有注释将使代码可读性变差,特别是当不可避免地出现人员变动 时,程序的可读性将大幅下降 而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。
  2. 缺乏单元测试
    sonar可以很方便地统计并展示单元测试覆盖率。

Jenkins+SonarQube6.5.5+SonarScanner2.5代码质量管理平台

  1. 糟糕的设计
    通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则 通过sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况, 检测耦合。
每一个issue分为五个严重性等级:
  1)BLOCKER
  有相当高的概率会导致应用产生十分严重的行为后果,如memory leak, unclosed JDBC connection, .... 这部分代码必须紧急fix.
  2)CRITICAL
  在实际应用中可能会出现低概率的偶现性行为缺陷,也或许存在安全漏洞,如: empty catch block, SQL injection, ... 该部分代码必须立刻进行review. 
  3)MAJOR
  开发人员的代码质量缺陷,如: uncovered piece of code, duplicated blocks, unused parameters, ...
  4)MINOR
  编码规范: lines should not be too long, "switch" statements should have at least 3 cases, ...
  5)INFO
  Neither a bug nor a quality flaw, just a finding.

SonarQube架构

SonarQube框架包含以下四个部分:
1)Project
2)SonarQube Scanner
3)SonarQube Server
4)SonarQube Database

Jenkins+SonarQube6.5.5+SonarScanner2.5代码质量管理平台

Jenkins+SonarQube6.5.5+SonarScanner2.5代码质量管理平台

Project
是需要被分析的源码,如我们的app工程源码,SonarQube支持多种语言和多种工程结构,Andriod是属于一种多模块的Java工程。

SonarQube Scanner
是用于执行代码分析的工具,在Project的根目录下执行,我们还需要在Project下进行SonarQube配置,其中指定了工程的相关信息,还指定了SonarQube Server的地址,SonarQube Scanner分析完毕之后,会将结果上报到该Server。

SonarQube Server
显示分析结果的Web Server,在SonarQube Scanner第一次将一个工程的分析结果上报给SonarQube Server后,Server上会自动创建一个工程显示分析的结果,可以在Server上设置代码质量管理相关的各种配置,如设置代码检查规则(Rule)和质量门限(Quality Gate)等。

工作原理

远程客户机可以通过各种不同的分析机制,从而将被分析的项目代码上传到 SonarQube server 并进行代码质量的管理和分析,SonarQube 实际上是一个Web系统,通过 Web API 将分析的结果以可视化、可度量的方式展示代码扫描结果,结果是可以自定义的,而真正实现代码扫描的是Sonar Scanner这个工具
SonarQube 并不是简单地将各种质量检测工具的结果(例如 FindBugs,PMD 等)直接展现给客户,而是通过不同的插件算法来对这些结果进行再加工,最终以量化的方式来衡量代码质量,从而方便地对不同规模和种类的工程进行相应的代码质量管理。

SonarQube 可以支持 25+ 种编程语言,针对不同的编程语言其所提供的分析方式也有所不同:
对于所有支持的编程语言,SonarQube 都提供源了代码的静态分析功能;
对于某些特定的编程语言,SonarQube 提供了对编译后代码的静态分析功能,比如 java 中的 class file 和 jar 和 C# 中的 dll file 等;
对于某些特定的编程语言,SonarQube 还可以提供对于代码的动态分析功能,比如 java 和 C# 中的单元测试的执行等。

集成之路

1、下载并安装Sonar、SonarScanner
2、下载并安装DB(推荐MySQL)
3、配置sonar.properties、sonar-scanner.properties
http://wiki.inwaimai.baidu.com/download/attachments/9563635/1.png?version=1&modificationDate=1500005898178&api=v2

http://wiki.inwaimai.baidu.com/download/attachments/9563635/2.png?version=1&modificationDate=1500005899625&api=v2

4、jenkins安装Sonar plugin

Sonar支持以下几种方式进行代码检查:
1、Analyzing with SonarQube Runner (recommended analyzer)
2、Analyzing with SonarQube Ant Task
3、Analyzing with Maven
4、Analyzing with Gradle
5、CI Engines

5、Jenkins下面配置Sonar和SonarRunner

http://wiki.inwaimai.baidu.com/download/attachments/9563635/3.jpg?version=1&modificationDate=1500006054554&api=v2

http://wiki.inwaimai.baidu.com/download/attachments/9563635/4.png?version=1&modificationDate=1500005899895&api=v2

http://wiki.inwaimai.baidu.com/download/attachments/9563635/5.png?version=1&modificationDate=1500005900463&api=v2

6、jenkins中配置需要做代码扫描的项目

衡量软件质量的5个最常用的指标

  1. SLOC(Source Lines of Code,源代码行)
    计算代码行数可能是最简单的衡量指标,主要体现了软件的规模,并为项目增长和规划提供了相关数据。
  2. 每个代码段/模块/时间段中的bug数
    要想实现更好的测试以及更高的可维护性,bug跟踪是必不可少的。每个代码段、模块或时间段(天、周、月等)内的bug可以很容易通过工具统计出来(如Mantis)。这样,可以及早发现并及时修复。
  3. 代码覆盖率
    在单元测试阶段,代码覆盖率常常被拿来作为衡量测试好坏的指标,也用来考核测试任务完成情况。
  4. 设计/开发约束
    软件开发中有很多设计约束和原则,其中包括:

1) 类/方法的长度
2) 一个类中方法/属性的个数
3) 方法/构造函数参数的个数
4) 代码文件中魔术数字、字符串的使用(魔术数字指直接写在代码中的具体数值,其他人难以理解数字的意义)
5) 注释行比例等
代码的可维护性和可读性是很重要的,开发团队可以选择以上这些原则中的一个或全部,并通过一些自动化工具(如maven pmd插件)来遵循这些原则,这将大大提高软件产品的质量。

  1. 圈复杂度(Cyclomatic Complexity)
    圈复杂度是用来衡量一个模块判定结构的复杂程度,已经成为评估软件质量的一个重要标准,能帮助开发者识别难于测试和维护的模块,在成本、进度和性能之间寻求平衡。圈复杂度可以使用pmd工具来自动化计算。