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

文章目录

  • 一、获取P3C-PMD
    • 1、下载源码
    • 2、打包
    • 3、上传文件
  • 二、创建hooks
    • 1、指定项目
    • 2、全局设置
  • 三、使用

一、获取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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/221821.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Javaweb之前端工程打包部署的详细解析

6 打包部署 我们的前端工程开发好了,但是我们需要发布,那么如何发布呢?主要分为2步: 前端工程打包 通过nginx服务器发布前端工程 6.1 前端工程打包 接下来我们先来对前端工程进行打包 我们直接通过VS Code的NPM脚本中提供的…

Python与PHP:编写大型爬虫的适用性比较

目录 一、引言 二、Python编写爬虫的优势 1、强大的数据处理能力 2、丰富的网络库和框架 3、良好的可读性和易维护性 4、社区支持和生态系统 三、PHP编写爬虫的优势 1、简单易学 2、广泛的应用领域 3、高效的性能 4、灵活的请求处理方式 四、大型爬虫的编写实例&am…

java开发神器之ecplise的基本使用

java开发神器之ecplise的基本使用 一、ecplise的安装二、利用ecplise创建工作空间 一、ecplise的安装 免安装eclipse程序包 二、利用ecplise创建工作空间 1、准备好eclipse的程序包,右键执行程序。 2、若打开eclipse显示如下第一张图的界面提示,是因…

生产环境_从数据到层级结构JSON:使用Spark构建多层次树形数据_父子关系生成

代码补充了!兄弟萌 造的样例数据 val data Seq(("USA", "Male", "Asian", "Chinese"),("USA", "Female", "Asian", "Chinese"),("USA", "Male", "Bl…

网络之路26:STP生成树协议

正文共:2222 字 19 图,预估阅读时间:3 分钟 目录 网络之路第一章:Windows系统中的网络 0、序言 1、Windows系统中的网络1.1、桌面中的网卡1.2、命令行中的网卡1.3、路由表1.4、家用路由器 网络之路第二章:认识企业设备…

碳信用市场的未来:中碳CCNG的愿景

在全球碳减排努力日益增强的背景下,中国碳中和发展集团有限公司(简称中碳CCNG)正以其创新的碳交易平台引领行业新趋势。中碳CCNG提供的一站式综合服务不仅包括碳信用的托管、买卖和抵消,而且通过其综合性数字平台,促进…

【100天精通Python】Day75:Python机器学习-第一个机器学习小项目_鸾尾花分类项目(上)

目录 1 机器学习中的Helloworld _鸾尾花分类项目 2 导入项目所需类库和鸾尾花数据集 2.1 导入类库 2.2 scikit-learn 库介绍 (1)主要特点: (2)常见的子模块: 3 导入鸾尾花数据集 3.1 概述数据 3.…

matlab 最小二乘拟合空间直线(方法二)

目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理

IT外包服务内容有哪些?

在信息技术迅猛发展的今天,越来越多的企业为了提高效率、降低成本以及更专注于核心业务,选择将信息技术工作外包给专业的IT服务公司。IT外包包含很多不同的服务,以下是对主要服务内容的简要概述。 1. 网络建设与维护 网络是现代企业信息系统…

jquery实现省市区三级联动

一、技术&#xff1a; 前端采用的是jsp页面 后端采用springmvcmybatismysql8 效果图 二、cascadeSelect.jsp页面 <% page contentType"text/html;charsetUTF-8" language"java" %> <%String path request.getContextPath();String basePath …

每日一练2023.12.5—— 一帮一【PTA】

题目链接&#xff1a; L1-030 一帮一 题目要求&#xff1a; “一帮一学习小组”是中小学中常见的学习组织方式&#xff0c;老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作&#xff0c;即在得到全班学生的排名后&…

西安安泰——ATA-1220E宽带放大器

ATA-1220E宽带放大器简介 ATA-1220E是一款可放大交直流信号的差分通道宽带放大器。其最大输出电压 60Vp-p(30Vp)&#xff0c;最大输出电流1Ap&#xff08;>50Hz&#xff09;。电压增益数控可调&#xff0c;一键保存设置&#xff0c;提供了方便简洁的操作选择&#xff0c;可…

华为无线配置模板 一

华为无线配置模板 一 拓扑图1.配置SwitchA和AC&#xff0c;使AP与AC之间能够传输CAPWAP报文2.配置AC作为DHCP服务器&#xff0c;为STA和AP分配IP地址3.配置AP上线4.配置WLAN业务参数5.验证配置结果 拓扑图 采用如下的思路配置小型网络的WLAN基本业务&#xff1a;1.配置AP、AC、…

阿里云账号注册完成实名认证免费领取云服务器4台

注册阿里云&#xff0c;免费领云服务器&#xff0c;每月280元额度&#xff0c;3个月试用时长&#xff0c;可快速搭建网站/小程序&#xff0c;部署开发环境&#xff0c;开发多种企业应用&#xff0c;共3步骤即可免费领取阿里云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com…

一键抠图1:Python实现人像抠图 (Portrait Matting)

一键抠图1&#xff1a;Python实现人像抠图 (Portrait Matting) 目录 一键抠图1&#xff1a;Python实现人像抠图 (Portrait Matting) 1. 项目介绍 2. 抠图算法 3. Matting数据集 4. MODNet模型 (1) 项目安装 (2) 数据集说明 (3) MODNet模型 5. Demo测试效果 6. 源码下载…

Windows循环检测,直到网络通/断后执行指定命令

前言 前几天&#xff0c;一个朋友让我帮他做个脚本或者批处理&#xff0c;要实现的功能很简单&#xff1a;开机时检测网络是否联通&#xff0c;如果联通了就执行一个指定的程序&#xff0c;然后脚本就可以退出了。 批处理的解决方法 手动操作时&#xff0c;我们通常使用ping…

(2)(2.4) TerraRanger Tower/Tower EVO(360度)

文章目录 前言 1 安装传感器并连接 2 通过地面站进行配置 3 参数说明 前言 TeraRanger Tower 可用于在 Loiter 和 AltHold 模式下进行目标规避。传感器的最大可用距离约为 4.5m。 TeraRanger Tower EVO 可用于在 Loiter 和 AltHold 模式下进行目标规避。传感器的最大可用…

电子编曲软件FL Studio2024汉化中文免费版下载

电子编曲需要什么软件&#xff1f;市面上的宿主软件都可以完成电子编曲的工作&#xff0c;主要适用电子音乐风格编曲的宿主软件有FL Studio、Ableton Live等。电子编曲需要什么基础&#xff1f;需要对于电子音乐足够熟悉、掌握基础乐理知识以及宿主软件的使用方法。 就我个人的…

TinyMPC - CMU (卡耐基梅隆大学)开源的机器人 MPC 控制器

系列文章目录 CasADi - 最优控制开源 Python/MATLAB 库 文章目录 系列文章目录前言一、机器人硬件对比1.1 Teensy 上的微控制器基准测试1.2 机器人硬件1.3 BibTeX 二、求解器三、功能&#xff08;预期&#xff09;3.1 高效3.2 鲁棒3.3 可嵌入式3.4 最小依赖性3.5 高效热启动3.…

Geoserver发布2000坐标系遇到的问题总结

在Geoserver上发布2000坐标系的服务时&#xff0c;要想正常发布服务&#xff0c;不仅仅是要涉及2000坐标系&#xff0c;还需要在发布的时候选择对坐标系。具体问题描述如下&#xff1a; 1.问题描述&#xff1a; 在发布好2000坐标系的服务后&#xff0c;在超图的平台加载服务时&…