1.查找项目地址
点击menu->admin->project选子需要加钩子的项目
path为linux上路径地址,默认gitlab安装路径为
/var/opt/gitlab/git-data/repositories/
2.下载p3c代码
https://github.com/alibaba/p3c
3.自定义排除规则(因为阿里有些规范并不适用于实际开发)
在rulesets下新建自己的规则排除文件
ali-p3c.xml:
<?xml version="1.0"?>
<ruleset name="AlibabaJavaSets" xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<description>AlibabaJavaSets</description>
<rule ref="rulesets/java/ali-comment.xml" >
<!-- 方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/* */注释。注意与代码对齐。 -->
<exclude name="AvoidCommentBehindStatementRule"/>
<!-- 及时清理不再使用的代码段或配置信息。 -->
<exclude name="RemoveCommentedCodeRule"/>
</rule>
<rule ref="rulesets/java/ali-concurrent.xml" language="">
<!-- 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 -->
<exclude name="ThreadPoolCreationRule"/>
<!-- 多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题。 -->
<exclude name="AvoidUseTimerRule"/>
<!-- SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类。 -->
<exclude name="AvoidCallStaticSimpleDateFormatRule"/>
<!-- CDATA[ThreadLocal字段【%s】应该至少调用一次remove()方法。 -->
<exclude name="ThreadLocalShouldRemoveRule"/>
<!-- 【Math.random()】应避免在多线程并发环境下使用。 -->
<exclude name="AvoidConcurrentCompetitionRandomRule"/>
<!-- 【%s()】应该在finally块中调用。 -->
<exclude name="CountDownShouldInFinallyRule"/>
<!-- 锁【%s】必须紧跟try代码块,且unlock要放到finally第一行。 -->
<exclude name="LockShouldWithTryFinallyRule"/>
</rule>
<rule ref="rulesets/java/ali-constant.xml" >
</rule>
<rule ref="rulesets/java/ali-exception.xml" >
<exclude name="MethodReturnWrapperTypeRule"/>
</rule>
<rule ref="rulesets/java/ali-flowcontrol.xml" >
<exclude name="AvoidNegationOperatorRule"/>
</rule>
<rule ref="rulesets/java/ali-naming.xml" >
<exclude name="AbstractClassShouldStartWithAbstractNamingRule"/>
<exclude name="ExceptionClassShouldEndWithExceptionRule"/>
<exclude name="TestClassShouldEndWithTestNamingRule"/>
<exclude name="BooleanPropertyShouldNotStartWithIsRule"/>
<exclude name="ArrayNamingShouldHaveBracketRule"/>
<exclude name="ConstantFieldShouldBeUpperCaseRule"/>
</rule>
<rule ref="rulesets/java/ali-oop.xml" >
<exclude name="PojoMustUsePrimitiveFieldRule"/>
<exclude name="PojoNoDefaultValueRule"/>
<exclude name="PojoMustOverrideToStringRule"/>
<exclude name="StringConcatRule"/>
</rule>
<rule ref="rulesets/java/ali-orm.xml" >
<exclude name="IbatisMethodQueryForListRule"/>
</rule>
<rule ref="rulesets/java/ali-other.xml" >
<exclude name="AvoidPatternCompileInMethodRule"/>
<exclude name="AvoidApacheBeanUtilsCopyRule"/>
<exclude name="AvoidMissUseOfMathRandomRule"/>
<exclude name="AvoidDoubleOrFloatEqualCompareRule"/>
</rule>
<rule ref="rulesets/java/ali-set.xml" >
<exclude name="ClassCastExceptionWithToArrayRule"/>
<exclude name="UnsupportedExceptionWithModifyAsListRule"/>
<exclude name="ClassCastExceptionWithSubListToArrayListRule"/>
<exclude name="ConcurrentExceptionWithModifyOriginSubListRule"/>
<exclude name="DontModifyInForeachCircleRule"/>
<exclude name="CollectionInitShouldAssignCapacityRule"/>
</rule>
</ruleset>
4.打包上传至服务器,进行钩子配置
5.在gitlab项目目录下创建如下目录和文件
路径如:
cd /var/opt/gitlab/git-data/repositories/@hashed/9c/fd/9cfd3c755be26b4e1645918e2a64a26e3d851ede421e0b257f783b443bc443d1.git
创建目录
mkdir -p custom_hooks/pre-receive.d/
在pre-receive.d/目录下,创建钩子文件
vim pre-receive
#!/bin/bash
# oldrev,旧版本号;newrev,新版本号;committer,当前提交代码的用户;REJECT=0,正常
export JAVA_HOME=/usr/local/jdk1.8.0_191
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=/usr/local/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/ali-p3c.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
注:别忘了给此文件加权限
chmod +777 pre-receive
6.提交代码进行测试即可