本地代码-gitlab-sonar一条龙(3)-[p3c-pmd]

1、P3C-PMD

 

下载地址:

https://github.com/alibaba/p3c

编译:

<groupId>com.alibaba.p3c</groupId>
<artifactId>p3c-pmd</artifactId>
<version>2.1.1</version>

 mvn package 产生 p3c-pmd-2.1.1-jar-with-dependencies.jar

用命令测试一下,是否能检查代码:

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

2、gitlab中设置pre-recive进行push前检查 

进入gitlab中某一个项目的路径:/var/opt/gitlab/git-data/repositories/@hashed/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35.git/custom_hooks/pre-receive.d

 暂时先在目录下放p3c-pmd-2.1.1-jar-with-dependencies.jarpre-receive:

pre-receive脚本:

#!/bin/sh
#
# An example hook script to make use of push options.
# The example simply echoes all push options that start with 'echoback='
# and rejects all pushes when the "reject" push option is used.
#
# To enable this hook, rename this file to "pre-receive".
EJECT=0                 #REJECT变量,初始化为0

JAVA_HOME=/var/opt/gitlab/jdk18    #定义JAVA_HOME变量为当前jdk安装路径  /var/opt/gitlab/jdk18
BASE_PATH=$(cd `dirname $0`; pwd)     #BASE_PATH变量中为当前脚本存放的路径,比如当前脚本路径为/usr/local/script/shell.sh,则BASE_PATH=/usr/local/script/

while read oldrev newrev refname; do    #接收键盘输入的参数,空格分隔,分别赋值给oldrev, newrev, refname(推测这里oldrev,newrev为同一个代码仓库的两个分支名称)
    echo 'old version:'${oldrev}        #输出 oldrev
    echo 'new version:'${newrev}        #输出 newrev
    echo 'branc:'${refname}             #输出 refname

    if [ "$oldrev" = "0000000000000000000000000000000000000000" ];then  #如果oldrev的值是“00000000……”,那么将oldrev的值改成newrev拼接"^"的值
        oldrev="${newrev}^"
    fi

    FILES=`git diff --name-only ${oldrev} ${newrev}  | grep -e "\.java$"`    #执行git命令,找出oldrev分支和newrev分支中内容有差异的.java文件,将这些文件名放到FILES变量中

    if [ -n "$FILES" ]; then                                                #如果FILES变量有值,创建TEMPDIR变量,存放当前脚本路径所在目录地址加/tmp的字符串值
        TEMPDIR=$BASE_PATH/"tmp"
        for FILE in ${FILES}; do                                            #循环FILES列表,在TEMPDIR所指定的路径下,创建当前文件的父目录
            mkdir -p "${TEMPDIR}/`dirname ${FILE}`" >/dev/null              #例如FILE内容是/abc/de/fg/tt.java   TEMPDIR为/usr/local/script/tmp 则会创建/usr/local/script/tmp/abc/de/fg/目录
            git show $newrev:$FILE > ${TEMPDIR}/${FILE}                     #从git上将FILE文件的内容拷贝到TEMPDIR路径下
        done;

        FILES_TO_CHECK=`find $TEMPDIR -name '*.java'`                       #查找TEMPDIR路径下所有.java文件,将文件名放到FILES_TO_CHECK变量

        echo 'Check files:'${FILES_TO_CHECK}                                #输出FILES_TO_CHECK中的内容(TEMPDIR路径下左右java文件名)
        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.1.1.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

         $JAVA_HOME/bin/java -Dpmd.language=en -cp $BASE_PATH/p3c-pmd-2.1.1-jar-with-dependencies.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=$?                                                           #REJECT变量接收上面的java命令执行的结果返回值

        echo 'Aliyun p3c-pmd check end...'
        echo '返回值为: '$REJECT                                                     #输出返回值

        rm -rf $TEMPDIR                                                  #删除产生的临时文件
    fi
done

exit $REJECT                                                            #退出脚本程序,退出码为REJECT值

另一篇文章中的shell代码也可参考:https://my.oschina.net/u/3991747/blog/4254070

同时要使配置生效:

# gitlab-ctl reconfigure

push代码,出现拒绝提交:

3、eclipase插件

https://github.com/alibaba/p3c

具体打包过程,参看md:

mvn -U clean install

 注意:

直接下载地址: 

https://p3c.alibaba.com/plugin/eclipse/update

4、idea插件

 gradle安装,具体见md。

想直接下载的话:

直接下载地址:​​​​​​​​​​​​​​​​​​​​https://plugins.jetbrains.com/plugin/10046-alibaba-java-coding-guidelines

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值