gitlab增加p3c-hook强制代码规范

本文介绍了如何在 GitLab 中配置代码质量检查钩子,以遵循阿里巴巴的 P3C 规范。首先,查找项目地址并下载 P3C 代码,然后自定义排除规则以适应实际开发需求。接着,打包 P3C 上传至服务器并配置钩子。在项目目录下创建预接收钩子文件,并设置权限。最后,测试提交代码以验证钩子是否有效。该过程有助于确保代码符合阿里巴巴的 Java 开发规范。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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-8
 
echo "开始进行代码质量检测..."
 
while read oldrev newrev refname; do
    if [ "$oldrev" = "0000000000000000000000000000000000000000" ];then
        oldrev="${newrev}^"
    fi
    committer=`git log -1 $newrev --pretty=%ce`
    files=`git diff --name-only ${oldrev} ${newrev}  | grep -e ".java$"`
    echo $committer
    if [ -n "$files" ]; then
        TEMPDIR="tmp"
        for file in ${files}; do
            mkdir -p "${TEMPDIR}/`dirname ${file}`" > /dev/null
            git 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 = "$REJECT
          if [ $REJECT = 0 ] ;then
            echo "码出高效!您的代码通过阿里巴巴Java开发规范(黄山版)检测!"
    elif [ $committer = 'super@domain.com' ]; then
      echo "特殊情况,特殊处理!"
            REJECT=0
          else  echo  "在您的代码中发现了瑕疵,请及时修复,然后再提交!(代码规范请参考:https://github.com/alibaba/p3c)"
          fi
 
        rm -rf $TEMPDIR
    fi
done
 
exit $REJECT

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

chmod +777 pre-receive

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

javachen__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值