文章目录
- 一、获取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
2、打包
源码下载后,解压,进入p3c-pmd子项目,执行Maven命令:mvn clean package进行打包(或者导入开发工具通过工具打包)。
3、上传文件
把打好的包(p3c-pmd-2.1.1-jar-with-dependencies.jar)拷贝到gitlab hooks脚本可以引用到的路径下,比如我这里拷贝到gitlab的安装目录下:/home/software/gitlab/git-hooks下面。
二、创建hooks
1、指定项目
- root账号登录Gitlab后台,在gitlab中,项目目录是经过hash的,所以我们首先要找到目标项目的hash目录。
-
点击列表中的项目名称,进入项目详情页面,找到“Gitaly相对路径”即是。
-
进入目录。
-
创建hooks:在项目目录下创建custom_hooks/pre-receive.d目录,并在pre-receive.d目录下创建pre-receive文件(注意:不需要扩展名)。
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
三、使用
在目标项目(或者随意项目)上,编写不符合规范的代码
然后push,结果如下图: