Gitlab+P3C-PMD(Aliyun)标准化你团队的代码

2023-11-07

1.背景简介:

项目越来越大,团队越来越大,代码越来越来多,然后就是各种五花八门的代码格式、代码规范。要做到代码规范我们可以采取代码交叉检视、IDEA/Eclipse安装插件自检、以及代码管理服务端做校验,且不说各种方法的利弊,本文直接采用服务端做校验(Gitlab)。

2.服务端gitlab校验原理简要说明:

利用gitlab的 (钩子)hooks机制,关于钩子有客户端、服务端的,本文仅描述服务端的钩子,更多关于钩子的资料参考:

https://git-scm.com/book/zh/v2/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git-%E9%92%A9%E5%AD%90

gitlab服务端会有三个主要钩子:pre-receive(处理客户端push动作时最先被调用的脚本,以非0值退出拒绝Push,可以用来做注释标准化、代码标准化等)、update(与pre-receive功能类似,为每个准备更新的分之各运行一次)、post-receive(是在push之后执行的脚本,可以用来调用后续的持续集成、发邮件通知等)。

而本文的用到的做代码规则校验的就是pre-receive的钩子,通过此钩子执行java –cp命令调用aliyun p3c-pmd的规则校验,然后检查如不符合规范返回错误信息到客户端(idea,git bash等)。

3. P3C-PMD

P3c阿里云的插件,github地址:https://github.com/alibaba/p3c

此处我们用到p3c-pmd插件,需要打包成jar文件,以便gitlab服务端使用。主要是受:

https://www.jianshu.com/p/b87ca8615c9c博文启发,结合该博文以及已经躺过的一些坑整理成一份新的文档

3.1 打包p3c-pmd,

使用最新2.0.0版本,Windows环境构建

3.1.1 准备gradle环境和git环境(可选),请自行百度安装gradle文档

3.1.2 github下载源码:git clone https://github.com/alibaba/p3c.git  或者直接到github上download zip文件

3.1.3 进入p3c-pmd目录:

 

3.1.4 执行gradle init

 

3.1.4 编辑build.gradle文件

 

在文件末尾添加:

jar {

    from {

        // 添加依懒到打包文件

        configurations.runtime.collect{zipTree(it)}

    }

}

如下图所示:

 

3.1.5 开始构建gradle

执行gradle.bat build

 

构建成功后会在 build\libs生成p3c-pmd-2.0.0.jar文件

 

3.1.6 修改p3c-pmd-2.0.0.jar中META-INFO文件内容

1).用压缩文件打开.jar文件:

 

2).删掉重复的文件并确保里面的内容是正确的

 

 

3).主要用于解决:

 

 

3.2 执行jar校验是否正确

java -cp p3c-pmd-2.0.0.jar net.sourceforge.pmd.PMD -d . -R rulesets/java/ali-comment.xml

得到如下提示,表名正确可用:

 

p3c-pmd 几个参数说明:-d 待校验的源文件目录,-R 校验规则,-f 检测结果输出格式。

Github没有明确说明各种参数,只不过执行命令错误会提示各种参数以及使用方法:

 

4. gitlab + p3c-pmd配合使用

4.1 gitlab hooks配置

4.1.1 gitlab hooks配置分全局(所有项目)和针对项目配置

官方文档说明地址:https://docs.gitlab.com/ee/administration/custom_hooks.html#setup

全局配置路径:/opt/gitlab/embedded/service/gitlab-shell/hooks/

 

针对项目的配置路径:

/var/opt/gitlab/git-data/repositories/${group}/${project_name}.git/

需要在该文件下创建custom_hooks目录,不要试图直接修改hooks目录下的东西,是针对全局的。

 

本次以项目为单位配置代码校验,即在custom_hooks

4.2 配置p3c-pmd-2.0.2.jar

4.2.1拷贝3步骤所生成的p3c-pmd-2.0.0.jar文件到 custom_hooks目录

4.2.2 pre-receive文件,并保持776可执行权限以及仅属于git用户

 

4.2.3 编辑里面的内容:

EJECT=0

JAVA_HOME=/usr/local/java8

BASE_PATH=$(cd `dirname $0`; pwd)

 

while read oldrev newrev refname; do

    echo 'old version:'${oldrev}

    echo 'new version:'${newrev}

    echo 'branc:'${refname}

 

    if [ "$oldrev" = "0000000000000000000000000000000000000000" ];then

        oldrev="${newrev}^"

    fi

 

    FILES=`git diff --name-only ${oldrev} ${newrev}  | grep -e "\.java$"`

 

    if [ -n "$FILES" ]; then

        TEMPDIR=$BASE_PATH/"tmp"

        for FILE in ${FILES}; do

            mkdir -p "${TEMPDIR}/`dirname ${FILE}`" >/dev/null

            git show $newrev:$FILE > ${TEMPDIR}/${FILE}

        done;

 

        FILES_TO_CHECK=`find $TEMPDIR -name '*.java'`

 

        echo 'Check files:'${FILES_TO_CHECK}

        echo 'Aliyun p3c-pmd check starting.....'

 

        echo 'Current shell Path:' $BASE_PATH

        echo 'JAVA_HOME:' $JAVA_HOME

        echo 'Root directory for java sources: '$TEMPDIR

 

        $JAVA_HOME/bin/java -Dpmd.language=en -cp $BASE_PATH/p3c-pmd-2.0.0.jar net.sourceforge.pmd.PMD -d $TEMPDIR -R rulesets/java/ali-comment.xml,rulesets/java/ali-concurrent.xml,rulesets/java/ali-constant.xml,rulesets/java/ali-exception.xml,rulesets/java/ali-flowcontrol.xml,rulesets/java/ali-naming.xml,rulesets/java/ali-oop.xml,rulesets/java/ali-orm.xml,rulesets/java/ali-other.xml,rulesets/java/ali-set.xml -f text

        REJECT=$?

 

        echo 'Aliyun p3c-pmd check end...'

 

        #REJECT=1

        echo $REJECT

 

        rm -rf $TEMPDIR

    fi

done

 

exit $REJECT

参考文件pre-recive文件和jar:

 

注意的坑:JAVA_HOME的设置、BASE_PATH对比更新后的待检查临时文件的目录、以及Dpmd.language=en参数设置成英文(暂无法处理返回到客户端乱码),以上两个环境变量配置错误需要自己调试该这个校验的命令

4.3 客户端提交测试

Git bash提交测试服返回结果:

 

IDEA 返回结果:

 

修改所有返回错误后再次push返回成功的

 

文档github地址:[https://github.com/Xlinlin/SpringCloud-Demo]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gitlab+P3C-PMD(Aliyun)标准化你团队的代码 的相关文章

随机推荐

  • 大数定理

    2017 12 29 我一直对这个大数定理不理解 为什么就这么重要 学了这么多年的概率论 而且 这么多年了也一直没事就看到这些东西 但是还真的没有让我感觉的这个东西的重要性 http www cnblogs com vamei p 3460
  • R语言 面试题

    什么是R语言编程 R语言是一种用于统计分析和为此目的创建图形的编程语言 不是数据类型 它具有用于计算的数据对象 它用于数据挖掘 回归分析 概率估计等领域 使用其中可用的许多软件包 R语言中的不同数据对象是什么 它们是R语言中的6个数据对象
  • mysql-5.7.27 安装

    net start mysql 发生系统错误2 系统找不到指定的文件 转自 https www jianshu com p 6d8ed7c36e6f 以管理员身份运行 在命令行输入cd mySQL的bin目录的安装路径 C Windows
  • Java 运行时发生 NoClassDefFoundError: Could not initialize class 的解决方法

    在编译时没有异常的程序 在运行时抛出异常称 NoClassDefFoundError Could not initialize class 类名 根据 Java 官方文档 NoClassDefFoundError 是由于 JVM 或 Cla
  • 3分钟学会在 ASP.NET MVC 中创建、读取和编辑 Excel 电子表格

    在本文中 您将学习如何在ASP NET MVC 应用程序中创建 读取和编辑 Excel 电子表格 为此 我们将创建一个由功能丰富的网格控件组成的电子表格应用程序 用于显示和编辑 Excel 文件 如下所示 为了在 ASP NET MVC 中
  • Vision Transformer里的MLP Head里的Pre-Logits层

    Representation layer if representation size and not distilled self has logits True self num features representation size
  • 动态代理的俩种实现方式

    提到设计模式 我们不得不提下代理模式 这里给出其定义 给某一个对象提供一个代理 并由代理对象控制对原对象的引用 说白了就是我们不能直接操作被代理的对象 而只能通过操作代理对象而间接操作被代理的对象 这就好比水厂 送水代理点 用户三者的关系
  • JavaScript 将表达式的结果转换为布尔值

    运算符可用于将表达式的结果快速转换为布尔值 true或false const foo Hello console log foo const fox Not null console log fox const bar console lo
  • 数字电路设计之ARM m0进度(2)

    2014 10 22 1 已解决问题 跳转指令B0是两条指令代价 B1是一条指令代价 2 时序同步 要做到心中有流水线 对于每个信号的状态要同时改变 终于把求最大公约数和最小公倍数的程序顺序地仿真完 接下来就要加RAM和各种调时序了
  • 网页点击跳转到微信页面

  • 9_react生命周期函数

    1 16 3 声明周期函数图 2 react16 3 和 16 4 生命周期差异 在 16 3 中 只有当 props 改变时 会触发 getDerivedStateFromProps 方法 在 16 4 中 当 props state f
  • spring 事务传播级别

    spring事务传播级别 一 介绍 1 2 各种事务的解释 1 2 什么是嵌套事务 一 介绍 主要就是下面两张图 很重要 很重要 很重要 能够清晰的描述出 第一次事务 和 嵌套事务的 关系 记录一下 当前不存在事务 直接调用带有事务的方法
  • java 纯面向对象_为什么说Java语言是一门非常纯粹的面向对象编程语言?

    针对题主提的这个问题 我在此分享Naresh Joshi的一篇译文给你 希望对你理解这个问题有所帮助 在我刚开始学习 Java 的前面几年 我从书本里知道了 Java 是遵循 面向对象编程范式 Object Oriented Program
  • sybase常见语句

    文章目录 1 查看执行计划 2 用户管理 3 系统存储过程 4 页大小 5 设置数据库为单用户模式 6 清理过程缓存 7 更新统计值 8 重建索引 9 修改字段约束为null 10 修改字段长度 12 修改字段默认值 13 修改表名 14
  • 国内主要Android应用市场包名大全

    com tencent android qqdownloader 腾讯应用宝 com qihoo appstore 360手机助手 com baidu appsearch 百度手机助手 com xiaomi market 小米应用商店 co
  • 基于RISC-V的软件编译脚本

    脚本 设置RISC V工具链riscv set env RISC V setenv RISCV PATH mnt Software FreedomStudio SiFive riscv64 unknown elf gcc 8 1 0 201
  • swiper的使用,鼠标放上面停止变动

    swiper真的太好用了 根本停不下来 div class swiper container div class swiper wrapper flex div class swiper slide img class src home s
  • (一)seaborn教程——可视化统计关系

    简介 学习笔记为官网教程seaborn教程0 9 0 安装最新版本方法 pip install git https github com mwaskom seaborn git 导入包和设置背景 import numpy as np imp
  • 【蓝桥杯每日刷题】——分巧克力

    一 题目 儿童节那天有 K 位小朋友到小明家做客 小明拿出了珍藏的巧克力招待小朋友们 小明一共有 N 块巧克力 其中第 i 块是 Hi Wi 的方格组成的长方形 为了公平起见 小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们 切出
  • Gitlab+P3C-PMD(Aliyun)标准化你团队的代码

    1 背景简介 项目越来越大 团队越来越大 代码越来越来多 然后就是各种五花八门的代码格式 代码规范 要做到代码规范我们可以采取代码交叉检视 IDEA Eclipse安装插件自检 以及代码管理服务端做校验 且不说各种方法的利弊 本文直接采用服