1. 获取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的安装目录下:/var/opt/gitlab/git-hooks(我的gitlab是通过docker方式安装的,该目录映射到了宿主机)。
2. 创建hooks
2.1 选择目标项目
在gitlab中,项目目录是经过hash的,所以我们首先要找到目标项目的hash目录。
(1)进入项目列表。
(2)点击列表中的项目名称,进入项目详情页面,找到“Gitaly相对路径”即是。
(3)进入目录
我的gitlab是通过docker方式安装的,已映射到宿主机。
2.2 创建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文件授予用户/用户组读、写、执行权限。
3. 使用
在目标项目上,编写不符合规范的代码
然后push,结果如下图: