1.查找项目地址

点击menu->admin->project选子需要加钩子的项目

path为linux上路径地址,默认gitlab安装路径为

/var/opt/gitlab/git-data/repositories/

2.下载p3c代码

https://github.com/alibaba/p3c

3.自定义排除规则(因为阿里有些规范并不适用于实际开发)

在rulesets下新建自己的规则排除文件

ali-p3c.xml:

<?xml version="1.0"?><ruleset name="AlibabaJavaSets" xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd"><description>AlibabaJavaSets</description><rule ref="rulesets/java/ali-comment.xml" ><!-- 方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/* */注释。注意与代码对齐。 --><exclude name="AvoidCommentBehindStatementRule"/><!-- 及时清理不再使用的代码段或配置信息。 --><exclude name="RemoveCommentedCodeRule"/></rule><rule ref="rulesets/java/ali-concurrent.xml" language=""><!-- 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 --><exclude name="ThreadPoolCreationRule"/><!-- 多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题。 --><exclude name="AvoidUseTimerRule"/><!-- SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类。 --><exclude name="AvoidCallStaticSimpleDateFormatRule"/><!-- CDATA[ThreadLocal字段【%s】应该至少调用一次remove()方法。 --><exclude name="ThreadLocalShouldRemoveRule"/><!-- 【Math.random()】应避免在多线程并发环境下使用。 --><exclude name="AvoidConcurrentCompetitionRandomRule"/><!-- 【%s()】应该在finally块中调用。 --><exclude name="CountDownShouldInFinallyRule"/><!-- 锁【%s】必须紧跟try代码块,且unlock要放到finally第一行。 --><exclude name="LockShouldWithTryFinallyRule"/></rule><rule ref="rulesets/java/ali-constant.xml" ></rule><rule ref="rulesets/java/ali-exception.xml" ><exclude name="MethodReturnWrapperTypeRule"/></rule><rule ref="rulesets/java/ali-flowcontrol.xml" ><exclude name="AvoidNegationOperatorRule"/></rule><rule ref="rulesets/java/ali-naming.xml" ><exclude name="AbstractClassShouldStartWithAbstractNamingRule"/><exclude name="ExceptionClassShouldEndWithExceptionRule"/><exclude name="TestClassShouldEndWithTestNamingRule"/><exclude name="BooleanPropertyShouldNotStartWithIsRule"/><exclude name="ArrayNamingShouldHaveBracketRule"/><exclude name="ConstantFieldShouldBeUpperCaseRule"/></rule><rule ref="rulesets/java/ali-oop.xml" ><exclude name="PojoMustUsePrimitiveFieldRule"/><exclude name="PojoNoDefaultValueRule"/><exclude name="PojoMustOverrideToStringRule"/><exclude name="StringConcatRule"/></rule><rule ref="rulesets/java/ali-orm.xml" ><exclude name="IbatisMethodQueryForListRule"/></rule><rule ref="rulesets/java/ali-other.xml" ><exclude name="AvoidPatternCompileInMethodRule"/><exclude name="AvoidApacheBeanUtilsCopyRule"/><exclude name="AvoidMissUseOfMathRandomRule"/><exclude name="AvoidDoubleOrFloatEqualCompareRule"/></rule><rule ref="rulesets/java/ali-set.xml" ><exclude name="ClassCastExceptionWithToArrayRule"/><exclude name="UnsupportedExceptionWithModifyAsListRule"/><exclude name="ClassCastExceptionWithSubListToArrayListRule"/><exclude name="ConcurrentExceptionWithModifyOriginSubListRule"/><exclude name="DontModifyInForeachCircleRule"/><exclude name="CollectionInitShouldAssignCapacityRule"/></rule></ruleset>

4.打包上传至服务器,进行钩子配置

5.在gitlab项目目录下创建如下目录和文件

路径如:

cd /var/opt/gitlab/git-data/repositories/@hashed/9c/fd/9cfd3c755be26b4e1645918e2a64a26e3d851ede421e0b257f783b443bc443d1.git

创建目录

mkdir -p custom_hooks/pre-receive.d/

在pre-receive.d/目录下,创建钩子文件

vim pre-receive
#!/bin/bash# oldrev,旧版本号;newrev,新版本号;committer,当前提交代码的用户;REJECT=0,正常export JAVA_HOME=/usr/local/jdk1.8.0_191
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH# 命令结果状态
REJECT=0
# 代码检测库
PMD_LIB=/usr/local/p3c-pmd-2.1.1-jar-with-dependencies.jar
# 检测结果国际化语言:en、zh
PMD_LANGUAGE=zh
# 文件字符编码
FILE_ENCODING=utf-8echo "开始进行代码质量检测..."while read oldrev newrev refname; doif [ "$oldrev" = "0000000000000000000000000000000000000000" ];thenoldrev="${newrev}^"ficommitter=`git log -1 $newrev --pretty=%ce`files=`git diff --name-only ${oldrev} ${newrev}  | grep -e ".java$"`echo $committerif [ -n "$files" ]; thenTEMPDIR="tmp"for file in ${files}; domkdir -p "${TEMPDIR}/`dirname ${file}`" > /dev/nullgit show $newrev:$file > ${TEMPDIR}/${file}done;java -Dfile.encoding=$FILE_ENCODING -Dpmd.language=$PMD_LANGUAGE -cp $PMD_LIB net.sourceforge.pmd.PMD -d $TEMPDIR -R rulesets/ali-p3c.xml -f text -shortnames       REJECT=$?echo "reject = "$REJECTif [ $REJECT = 0 ] ;thenecho "码出高效!您的代码通过阿里巴巴Java开发规范(黄山版)检测!"elif [ $committer = 'super@domain.com' ]; thenecho "特殊情况,特殊处理!"REJECT=0else  echo  "在您的代码中发现了瑕疵,请及时修复,然后再提交!(代码规范请参考:https://github.com/alibaba/p3c)"firm -rf $TEMPDIRfi
doneexit $REJECT

注:别忘了给此文件加权限

chmod +777 pre-receive

6.提交代码进行测试即可

gitlab增加p3c-hook强制代码规范相关推荐

  1. idea代码样式模板_阿里p3c(代码规范,eclipse插件、模版,idea插件)

    阿里p3c 一.说明 代码规范检查插件p3c,是根据<阿里巴巴Java开发手册>转化而成的自动化插件. (高级黑:P-3C"Orion",反潜巡逻机,阿里大概取p3c先 ...

  2. SonarQube 9.x集成阿里p3c代码规范检测java代码;

    文章目录 前言 一.下载p3c-pmd插件 二.sonarqube配置使用p3c规则检测 1.新建质量配置 2.将创建好的p3c检测规则设置为默认质量配置 注1 注2 前言 因为我们公司后端主用的是j ...

  3. MyEclipse中阿里JAVA代码规范插件(P3C)的安装及使用

    JAVA代码规范插件(P3C)是阿里巴巴2017年10月14日在杭州云栖大会上首发的,使之前的阿里巴巴JAVA开发手册正式以插件形式公开走向业界.插件的相关信息及安装包都可以在GitHub(https ...

  4. 前端工程化实践 - 代码规范 提交规范 构建流程 Monorepo(附 React Native 案例)

    前端工程化实践 - 代码规范 & 提交规范 & 构建流程 & Monorepo 前言 仓库策略 Multirepo 什么是 Multirepo? Multirepo 的优点 M ...

  5. 代码规范及格式化工具(vscode、clang-format、git)

    文章目录 说明 Linux 内核代码风格 1) 缩进 2) 把长的行和字符串打散 3) 大括号和空格的放置 3.1) 空格 4) 命名 5) Typedef 6) 函数 7) 集中的函数退出途径 8) ...

  6. 在Git上如何强推代码规范

    引言 最近参加了"前端规范制定topic"小组,小组成员一起制定了html.css.js.es6.vue和react等规范,但规范制定好了怎么进行推广去强制执行呢,已知我们的项目都 ...

  7. 基于 React 项目前端团队推行代码规范及代码质量,真香(姐妹篇)

    前言 大家好,我是虚竹. 2022年是我们的一次重大技术栈转型(尝试.试错.挑战.精进),发动组员学习React新技术,前端小组采用主流的前端框架基于React.React Native系列生态支撑公 ...

  8. c++ doxygen 注释规范_[代码规范]Go语言编码规范指导

    本规范旨在为日常Go项目开发提供一个代码的规范指导,方便团队形成一个统一的代码风格,提高代码的可读性,规范性和统一性.本规范将从命名规范,注释规范,代码风格和 Go 语言提供的常用的工具这几个方面做一 ...

  9. 【代码规范】google开源c\c++项目代码规范

    版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载;https://blog.csdn.net/csdn_baotai https://blog.csdn.net/csdn_baotai/a ...

  10. eslint 保存自动格式化_代码规范之理解ESLint、Prettier、EditorConfig

    授权转载自:nowThen https://juejin.cn/post/6895889063111294990 前言 团队多人协同开发项目中困恼团队管理一个很大的问题是:无可避免地会出现每个开发者编 ...

最新文章

  1. 算法最少分组法_数据结构
  2. 红帽目录服务的数据导入导出
  3. django2.x报错No module named 'django.core.urlresolvers'
  4. oracle tb级别数据量,备份TB级别Oracle数据库的一些技巧
  5. Linux系统编程39:多线程之基于阻塞队列生产者与消费者模型
  6. 电商、快递最后一公里的解决方案
  7. 计算机发展史的内容概述,计算机及其发展史概述
  8. 用vue-cli+iview做项目不兼容ie问题
  9. java 基础知识2
  10. 第四章 蒙特卡洛方法-强化学习理论学习与代码实现(强化学习导论第二版)
  11. linux之终端的灵活使用。SCREEN
  12. java实现io阻塞的代码,Java:完整的每个连接线程阻塞IO与NIO的代码示例?
  13. NCBI引物设计-查找目的基因前后序列方法、序列比对
  14. java messagedigest,在C#中的Java MessageDigest类
  15. 鲲鹏920的服务器芯片,鲲鹏920芯片是什么芯片
  16. 为什么计算机没有桌面显示不出来,​为什么电脑图片显示不出来
  17. 条件运算符的嵌套使用
  18. linux增加/删除虚拟IP地址
  19. Ubuntu16.04下使用kalibr标定intel RealSense D435i imu+双目
  20. Accuracy, Precision, Recall和F1-score解释

热门文章

  1. 5 分钟,使用内网穿透快速实现远程桌面
  2. jsp余jspx的区别
  3. FPAG—UART串口实现与解析-黑金fpga资料解析
  4. FPGA实现千兆以太网发送
  5. python django面试题_django面试题(21道)
  6. EmmyLua 断点调试、xlua断点调试
  7. haversine根据经纬度算距离
  8. 差分码、相对码、绝对码、空号差分码、传号差分码
  9. Linux发包工具pktgen
  10. 入门必看,51单片机学习三步走