概述

又搞一边质量扫描插件,之前做过一遍,然后后面各种忽略,然后就放弃了,所以,应该寻找一种方法,循序渐进的实施。本次将实施一个基本的打包扫描方案,包含

  • checkstyle 固定团队编码风格,固定命名风格以及换行风格等,原型配置出资googlestyle, 修改缩进为4个字符(原型是2个)
  • surefile test report Junit Test结果报告
  • JaCoCo test coverage 代码测试覆盖率插件
  • 阿里巴巴Java代码扫描插件P3C(PMD)
  • cpd 重复代码扫描
  • Findbugs 通用Java bug检查
  • Sonar Quabe 一站式代码质量审查平台

1. Maven pom插件安装

现有完整的代码demo: https://github.com/Ryan-Miao/code-quality-verify-demo

具体插件内容,查看 https://github.com/Ryan-Miao/code-quality-verify-demo/blob/master/pom.xml

这里大概叙述下配置原理。首先,maven构建生态分build和report,而build又分verify, compile, test, install等生命周期。我们的插件就是基于这几个概念而产生作用的。

先说report插件,位于reporting目录下,主要是在执行mvn site的时候生成各种html report,这里绑定了想要生成各种report的的插件配置。生成的report文件最终位于target/site。

然后是build插件,在构建过程中发生作用。这里可以绑定插件执行到构建过程,比如verify, 当执行install的时候,我们插件就会执行。考虑为了查看report,这里就不绑定生命周期,而是直接通过执行goal的方式来检查。

需要注意的是:

1.Jacoco的覆盖率,目前只配置了全局行覆盖和分支覆盖,不添加阈值则为0,修改阈值实现覆盖率的控制。可以过滤不需要扫描的文件,比如生成的java文件。

2.checkstyle,这个读取我们自定义的checkstyle的配置,后期在使用过程中修改完善程我们自己的配置方案。可以过滤不需要扫描的文件,比如生成的java文件。

3.阿里巴巴Java规范,这个是PMD扫描,但移除了PMD自带的n条规则,只执行阿里的规则,可以过滤不需要扫描的文件,比如生成的java文件。

4.findbugs,指定了配置文件,里面可以配置忽略的文件和bug类型。当然,也可全局配置。

在代码里通过注解或者注释忽略扫描:

1.1 checkstyle忽略

忽略单独的代码模块,比如spring security的配置

//CHECKSTYLE:OFF
public void someMethod(String arg1, String arg2, String arg3, String arg4) {
//CHECKSTYLE:ON

忽略匹配正则

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<configLocation>config/checkstyle/google-checks-6.18.xml</configLocation>
<consoleOutput>true</consoleOutput>
<encoding>UTF-8</encoding>
<consoleOutput>true</consoleOutput>
<skip>false</skip>
<failsOnError>false</failsOnError>
<linkXRef>true</linkXRef>
<violationSeverity>error</violationSeverity>
<!--<includes>**/TestController.java</includes>-->
<excludes>**/generated/**.java</excludes>
<excludes>**/**Vo.java</excludes>
</configuration>
</plugin>

1.2 P3C阿里Java扫描PMD忽略

阿里Java扫描插件使用的PMD来实现,对于某些类不想执行扫描,可以在类上添加注解

@SuppressWarnings("PMD")

也可以直接在excludes里配置

<excludes>
<exclude>**/*Bean.java</exclude>
<exclude>**/generated/**.java</exclude>
</excludes>

1.3 FindBugs扫描忽略

FindBugs有些检查我们不想改,比如总是判定Date类是可变的。事实上,我们应该都切换为LocalDate或LocalDateTime,但总有遗留代码采用Date,此时可以忽略扫描

修改配置文件https://github.com/Ryan-Miao/code-quality-verify-demo/blob/master/config/findbugs/findbugs-exclude.xml,

比如正则匹配

<Match>
<Class name="~.*\.entity\..*" />
</Match>
<Match>
<Class name="~.*\.vo\..*" />
</Match>

还可以:

<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>annotations</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>

然后:


@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
value = {"MT_CORRECTNESS", "STYLE"},
justification = "I know what I'm doing")
public JdbcTemplate get(String datasourceName) {
JdbcTemplate jdbcTemplate = TEMPLATE.get(datasourceName);
if (jdbcTemplate == null) {
synchronized (this) {
if (jdbcTemplate == null) {
jdbcTemplate = createTemplate(datasourceName);
TEMPLATE.put(datasourceName, jdbcTemplate);
} return jdbcTemplate;
}
} return jdbcTemplate;
}

2 生成report

上面的pom配置后,执行mvn install site即可生成各种报告

阿里Java检查报告:

checkstyle编码规范报告:

有时候你会发现会爆出这个问题Skipping JaCoCo execution due to missing execution data file,大多数原因是因为没有编译测试类

3 检查阈值

site命令会生成对应的report,但实际开发中,我们会期望出现错误时停止构建,提醒开发者修复问题。bug发现的越早,修复的成本越低。那么,就需要给各个扫描插件设定失败阈值。

3.1Checkstyle设定失败

我们可以选择把checkstyle:check绑定到verify的生命周期上,这样工程师每次变异都会扫描,当出现不符合规范的code style就会编译失败。也可以在检查的时候手动执行一下check。最终,我选择了手动check方案。

 mvn checkstyle:check

3.2 阿里巴巴Java扫描设定失败

mvn pmd:check

3.3 Findbugs 发现bug失败

findbugs:check

4 Jenkins集成

代码质量不能靠个人素质来维护,而是通过完善的流程制度来保障。我们的代码开发最终都要merge到开发分支。我们只要卡住合并时的代码质量就可以了。规定:当代码合并到dev或者master等保护分支时,CI构建必须success,否则不允许合并分支。

集成Jenkins和Gitlab,添加Merge-Request/Pull-Request扫描任务,当发起Pull Request后自动Jenkins构建,并将构建结果写回Gitlab。

我们使用Jenkins pipeline来配置任务,编写Jenkinsfile

https://github.com/Ryan-Miao/code-quality-verify-demo/blob/master/Jenkinsfile

当任务构建时,我们会生成报告,然后,检查是否通过了扫描。

我们使用Jenkins Warnings Next Generation插件

该插件也提供了qualityGates来根据扫描结果中断构建,但为了保证配置一致性,我采用maven插件自带构建失败功能。当所有扫描通过了即构建成功,允许合并。

Java代码质量检查checkstyle, pmd, cpd, p3c,findbugs, jacoco, sonarquebe以及和Jenkins集成的更多相关文章

  1. Java 8,Jenkins,Jacoco和Sonar进行持续集成

    技术环境 在以安全与质量为主要驱动力的项目中,CI至关重要. 因此,我从我的团队开始进行"概念验证",以表明以下技术已准备好协同工作: Java 8, NetBeans 8.0 & ...

  2. 提高代码质量 CheckStyle FindBugs PMD

    提高代码质量-工具篇 注:这是一篇翻译文章,原文:How to improve quality and syntax of your Android code,为了理解连贯,翻译过程中我修改了一些陈述 ...

  3. 代码静态分析工具--PMD,Findbugs,CheckStyle

    最近学习Mybatis的官方文档,看到了[项目文档]一节有很多内容没有见过,做个笔记,理解一下. PMD 扫描Java源代码,查找潜在的问题,如: 可能的bugs,如空的try/catch/final ...

  4. jenkins+findbugs+checkstyle+PMD静态代码检查(二)

    可以根据自己的需求选中对应的插件进行配置(不一定非要同时配置三个插件) jenkins:持续集成的工具 fundbugs:检测代码静态错误的插件  例如:定义了没有用到的对象,string类型的比较使 ...

  5. IDEAL葵花宝典:java代码开发规范插件 checkstyle、visualVM、PMD 插件

    前言: visualVM: 运行java程序的时候启动visualvm,方便查看jvm的情况 比如堆内存大小的分配:某个对象占用了多大的内存,jvm调优必备工具. checkstyle: CheckS ...

  6. Java静态检测工具/Java代码规范和质量检查简单介绍(转)

    静态检查: 静态测试包括代码检查.静态结构分析.代码质量度量等.它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行.代码检查代码检查包括代码走查.桌面检查.代码审查等,主要检查代码 ...

  7. jenkins+maven配置findbugs+checkstyle+pmd

    一.findbugs+checkstyle+pmd介绍 工具 目的 检查项 FindBugs 检查.class 基于Bug Patterns概念,查找javabytecode(.class文件)中的潜 ...

  8. 提高Java代码质量的Eclipse插件之Checkstyle的使用详解

    提高Java代码质量的Eclipse插件之Checkstyle的使用详解 CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具.它能够自动化代 ...

  9. 提高Java代码质量的Eclipse插件之Checkstyle的使用具体解释

    CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发者遵守某些编码规范的工具.它可以自己主动化代码规范检查过程.从而使得开发者从这项重要可是枯燥的任务中解脱出来. Ch ...

随机推荐

  1. Centos7安装dubbo与zookeeper服务配置

    目录 环境: 第一步:安装jdk,并且配置环境变量 1.解压jdk: 2.配置环境变量: 3.保存并使文件立即生效: 4.立即重启虚拟机,进行下面的安装 第二步:安装注册中心zookeeper 1.解 ...

  2. TEE(Trusted Execution Environment)简介【转】

    转自:https://blog.csdn.net/fengbingchun/article/details/78657188 TEE(Trusted Execution Environment),可信 ...

  3. Win平台下窗口操作(Unity)

    Unity发布在Win平台时, 可以通过user32.dll的方式与Win API通信, 最小化窗口代码: public static class DllImports { private const ...

  4. django项目中cxselect三级联动

    下载cxselect插件放在static文件夹下 前端引入 <script src="/static/js/jQuery-1.8.2.min.js"></scri ...

  5. 第18.2节_地址类型与LL层设备过滤

    一.地址类型 二.白名单和Resolving List 三.LL层设备过滤 一.地址类型 学习资料:官方手册 Vol 6: Core System Package [Low Energy Contro ...

  6. jQuery的DataTables中的TableTools的基本使用

    DataTables的TableTools插件提供复制,导出excel.pdf,打印等功能. DataTables官网:http://datatables.net TableTools示例:http: ...

  7. Selenium获取页面指定元素个数

    测试需求: 获取页面中下拉框个数,并验证是否与预期个数一致 方法1:因下拉框的tagname属性值为select,可通过获取标签为select的元素来获取下拉框个数   List<WebElem ...

  8. SQL必知必会01 检索列 排序

  9. node端console.log输出不同颜色文字

    我们知道console.log直接输出是按着终端的默认颜色来显示的, console.log('message') 那么如何指定他们的颜色显示呢?很简单,直接再加一个参数就可以了,例如: consol ...

  10. USACO Buying Hay

    洛谷 P2918 [USACO08NOV]买干草Buying Hay https://www.luogu.org/problem/P2918 JDOJ 2592: USACO 2008 Nov Sil ...