#提前准备文件:checkstyle-8.45.1-all.jar、google_checks.xml
1.修改/etc/gitlab/gitlab.rb配置文件
找到gitlab_shell['custom_hooks_dir']并放开注释
gitlab_shell['custom_hooks_dir']="/opt/gitlab/embedded/service/gitlab-shell/hooks/custom_hooks_dir"
2.在自定义钩子目录下新增文件夹:pre-receive.d, post-receive.d, update.d
3.在pre-receive.d文件夹中新增pre-receive文件并进行编码
#!/bin/bash
#配置jdk
#配置node
#配置python
#需安装pylint pip install pylint
#同级目录下需增加checkstyle-8.45.1-all.jar
#同级目录下需增加google_checks.xml(配置java检测规则)
#同级目录下需增加google_checks.xml(配置java检测规则)
#同级目录下需增加.eslintrc.js(配置vue检测规则)
#npm install eslint --save
#需增加软连接 ln -s /usr/bin/node /node_home/bin/node
#
BASE_PATH=$(cd `dirname $0`;pwd)
JAVA_HOME=/home/zfb/software/jdk1.8.0_162
PY_LINT_HOME=/usr/local/bin/pylint
NPX_HOME=/home/zfb/software/node-v12.18.3-linux-x64/bin/npx
validate_code_rules(){
echo 'Start code analysis!'
old=$(git rev-parse ${param[0]})
new=$(git rev-parse ${param[1]})
JAVA_FIELS=`git diff --name-only ${old} ${new} | grep -e "\.java$"`
PY_FIELS=`git diff --name-only ${old} ${new} | grep -e "\.py$"`
VUE_FIELS=`git diff --name-only ${old} ${new} | grep -e "\.vue$"`
TEMPDIR="${BASE_PATH}/tmp"
#分析JAVA代码
if [ -n "${JAVA_FIELS}" ];then
for FIEL in ${JAVA_FIELS};do
mkdir -p "${TEMPDIR}/`dirname ${FIEL}`" >/dev/null
git show ${new}:${FIEL} > ${TEMPDIR}/${FIEL}
done;
echo ${JAVA_HOME}
result=`${JAVA_HOME}/bin/java -jar ${BASE_PATH}/checkstyle-8.45.1-all.jar -c ${BASE_PATH}/google_checks.xml /tmp`
if [[ ${result} =~ "[WARN]" ]];then
echo -e "${result}" | sed "s#${TEMPDIR}##g"
rm -rf ${TEMPDIR}
#exit 1
fi
#分析PYTHON代码
elif [ -n "${PY_FIELS}" ];then
for FIEL in ${PY_FIELS};do
mkdir -p "${TEMPDIR}/`dirname ${FIEL}`" >/dev/null
git show ${new}:${FIEL} > ${TEMPDIR}/${FIEL}
result=`${PY_LINT_HOME} --rcfile="${BASE_PATH}"/pylint.conf "${TEMPDIR}/${FIEL}"`
if [[ ${result} =~ [CERW][0-9]{4} ]];then
echo -e "${result}" | sed "s#${TEMPDIR}##g"
rm -rf ${TEMPDIR}
exit 1
fi
done;
#分析VUE代码
elif [ -n "${VUE_FIELS}" ];then
for FIEL in ${VUE_FIELS};do
mkdir -p "${TEMPDIR}/`dirname ${FIEL}`" >/dev/null
git show ${new}:${FIEL} > ${TEMPDIR}/${FIEL}
result=`${NPX_HOME} eslint -c "${BASE_PATH}"/.eslintrc.js -f compact --ext .vue "${TEMPDIR}"`
if [[ ${result} =~ ("Error"|"Warning") ]];then
echo -e "${result}" | sed "s#${TEMPDIR}##g"
rm -rf ${TEMPDIR}
exit 1
fi
done;
else
exit 0
fi
}
#读取参数
read -a param
if [ -n "${param[0]}" -a -n "${param[1]}" -a -n "${param[2]}" ];then
validate_code_rules param
rm -rf ${TEMPDIR}
fi