Gitlab代码集成阿里代码检查P3C

本文介绍了如何在Gitlab中集成阿里P3C代码检查工具,包括下载P3C-PMD源码、打包上传、创建hooks以及设置权限,确保每次push时执行代码检查。
摘要由CSDN通过智能技术生成

一、获取P3C-PMD

1、下载源码

源码地址:https://github.com/alibaba/p3c

也可以直接下载打包好的文件,

p3c-pmd-2.1.1-jar.zip:

https://pan.baidu.com/s/1VSXmP84v0OXvcsQ4Jdxxug?pwd=r4cl 提取码: r4cl

image-20231206090313656

2、打包

源码下载后,解压,进入p3c-pmd子项目,执行Maven命令:mvn clean package进行打包(或者导入开发工具通过工具打包)。

image-20231206090251516

3、上传文件

把打好的包(p3c-pmd-2.1.1-jar-with-dependencies.jar)拷贝到gitlab hooks脚本可以引用到的路径下,比如我这里拷贝到gitlab的安装目录下:/home/software/gitlab/git-hooks下面。

二、创建hooks

1、指定项目

  1. root账号登录Gitlab后台,在gitlab中,项目目录是经过hash的,所以我们首先要找到目标项目的hash目录。

image-20231206090221685

  1. 点击列表中的项目名称,进入项目详情页面,找到“Gitaly相对路径”即是。

    image-20231206090154666

  2. 进入目录。

    image-20231206090132628

  3. 创建hooks:在项目目录下创建custom_hooks/pre-receive.d目录,并在pre-receive.d目录下创建pre-receive文件(注意:不需要扩展名)。

    image-20231206085519510

    pre-receive文件内容如下(无需重启gitlab即可生效):

    #!/bin/bash
     
    # oldrev,旧版本号;newrev,新版本号;committer,当前提交代码的用户;REJECT=0,正常
     
    export JAVA_HOME=/var/opt/gitlab/jdk
    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=/var/opt/gitlab/git-hooks/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/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 -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
    

    授权:

    chown -R git:root custom_hooks/pre-receive.d
    chmod 774 custom_hooks/pre-receive.d/pre-receive
    这样,开发者每次push代码到该项目的仓库上时,gitlab都会执行该hooks脚本,如果不通过,会被gitlab拒绝push。

    说明:

    我这里通过docker安装的gitlab容器内没有JDK,映射了宿主机的JDK;

    把chown命令中的git:root(用户/用户组)换成自己的;

    chmod命令把pre-receive文件授予用户/用户组读、写、执行权限。

2、全局设置

全局设置过程中,需要将hooks的创建目录调整为/opt/gitlab/embedded/service/gitlab-shell,创建子目录pre-receive.d,在子目录下创建脚本pre-receive文件,内容如下:

#!/bin/bash
 
# oldrev,旧版本号;newrev,新版本号;committer,当前提交代码的用户;REJECT=0,正常
 
export JAVA_HOME=/var/opt/gitlab/jdk
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=/var/opt/gitlab/git-hooks/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/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 -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

三、使用

在目标项目(或者随意项目)上,编写不符合规范的代码

image-20231206090014971

然后push,结果如下图:

image-20231206090042612

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

出家二少

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

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

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

打赏作者

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

抵扣说明:

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

余额充值