1、背景简介

项目越来越大,代码越来越多,然后就是各种五花八门的代码格式、代码规范。可用自查或者交叉检查,但是都是人工需要费事费力,还不一定能面面俱到,所以必须有一种强制的手段,不折不扣的执行代码规范,不符合规范的无法提交到代码仓库,从而杜绝了不符合规范的代码产生。同时,团队内的代码提交信息也需要遵循一定的格式,一并做校验。

2、gitlab 服务端hooks机制

利用gitlab的 (钩子)hooks机制,关于钩子有客户端、服务端的,本文仅描述服务端的钩子,更多关于钩子的资料参考:

https://blog.csdn.net/allensandy/article/details/121422607

gitlab服务端会有三个主要钩子:

  1. pre-receive(处理客户端push动作时最先被调用的脚本,以非0值退出拒绝Push,可以用来做注释标准化、代码标准化等);
  2. update(与pre-receive功能类似,为每个准备更新的分支各运行一次);
  3. post-receive(是在push之后执行的脚本,可以用来调用后续的持续集成、发邮件通知等)。

而本文的用到的做代码规则校验的就是pre-receive的钩子,通过此钩子执行java –cp命令调用aliyun p3c-pmd的规则校验,然后检查如不符合规范返回错误信息到客户端(idea,git bash等)。

3、P3C-PMD

P3C阿里云的插件,github地址:https://github.com/alibaba/p3c

此处我们用到p3c-pmd插件,需要打包成jar文件,以便gitlab服务端使用,下载源码之后,直接打包(gradlemaven均可),得到 p3c-pmd-2.1.1-jar-with-dependencies.jar ,后面备用;已经打包好的可以直接下载使用:p3c-pmd-2.1.1.jarP3c阿里云的插件-Java文档类资源-CSDN文库

4、代码提交信息格式

提交信息即 git commit message,在常规开发中,可能很多人会忽略提交信息的重要性,对于提交信息的内容会相当随意地进行输入,其实这样在很大的程度上会影响后续的维护和必要情况下的故障的追踪。所以,在此我们需要对提交信息做一个初步规范。

首先,提交信息必须格式化,即提交信息需要按照一定的格式来撰写,当团队中的所有成员都遵循一定的格式的时候,团队的其他成员可以非常方便的阅读内容。且不允许多个task一个提交,可以一个task完整提交,也可以局部提交,但是不允许跨task提交,每次提交不能让项目跑不起来,养成每日多次提交的习惯,我们约定提交信息的格式为:(任务类型后的为英文冒号!!!)

{{Task #}} // 项目管理软件中的任务 ID

{{任务类型 (feat/fix/docs/style/refactor/perf/test/build/chore/revert/merge)}}:{{任务描述}}

再者,我们可以通过项目管理软件中自动从提交信息中完成和任务的关联,提高大家的工作效率。

针对日常开发中可能存在一些并没有实际task的零碎的工作,引入了NOTASK标识,即在提交时备注信息的地方原本需要填入task编号的地方填入NOTASK,用以和普通开发任务进行区分,如:

NOTASK // 没有实际任务情况下的细小改动

{{任务类型 (feat/fix/docs/style/refactor/perf/test/build/chore/revert/merge)}}: {{任务描述}}

任务分类:

  • feat:新增功能
  • fix:bug修复
  • docs:仅仅修改了文档,比如README,CHANGELOG等等
  • style:代码格式改变(修改空白字符,格式缩进,补全缺失的分号等,没有改代码的逻辑)
  • refactor:重构代码(没有新增功能或bug修复)
  • perf:优化,比如:提升性能、体验、算法等
  • test:增加/修改测试用例,包括单元测试、集成测试等
  • build:改变了build工具
  • revert:还原先前提交的更改
  • chore:改变构建流程或者增加依赖库、工具等
  • merge:代码合并
  • ci:与CI(持续集成)有关的改动

5、配置钩子(所有项目生效,如只需针对单个项目,请自行看网上教程)

1、gitlab所在服务器创建目录:/opt/gitlab/embedded/service/gitlab-shell/hooks/pre-receive.d

2、将 p3c-pmd-2.1.1-jar-with-dependencies.jar上传到该目录;

3、在该目录新建 pre-receive 文件,文件内容如下(完整文件:gitlab服务器端代码格式以及git提交信息格式检查钩子文件,可以拿来直接使用-Java文档类资源-CSDN文库):

## 校验commit message
validate_commit_message()
{oldrev=$(git rev-parse $1)newrev=$(git rev-parse $2)refname="$3"#echo 'Old version: '$oldrev#echo 'New version: '$newrev#echo 'Branch: '$refname## git 命令#GITCMD="git"## 按时间倒序列出 commit  找出两个版本之间差异的版本号集合  oldrev~newrevcommitList=`git rev-list $oldrev..$newrev`#echo 'commitList: '$commitListsplit=($commitList)#echo 'split: '$split# 遍历数组for s in ${split[@]}do#echo “$s”#通过版本号获取仓库中对象实体的类型、大小和内容的信息#比如提交人、作者、邮件、提交时间、提交内容等currentContent=`git cat-file commit $s`#echo 'Commit obj: '$currentContent#echo 's==: '$s#获取提交内容msg=`git cat-file commit $s | sed '1,/^$/d'`echo 'commitid:'$s',msg: '$msg## merge合并分之直接放行if [[ $msg == *"Merge branch"* ]] || [[ $msg == *"Merge remote-tracking branch"* ]]; thenecho "Merge branch...skip the checking"else  ## 做内容校验match=`echo $msg | grep -nE "(${regex})"`#echo 'Match result: '$match## 找到匹配说明是符合规范的if [ "${match}" != "" ]; then## 校验注释长度msg_length=${#msg}#echo "Msg length: ${msg_length}"if [[ ${msg_length} -lt ${COMMIT_MESSAGE_MIN_LENGTH} ]]; then#echo -e "Error: Commit message should be bigger than ${COMMIT_MESSAGE_MIN_LENGTH} and current commit message length: ${msg_length}"echo -e "错误: 提交备注信息的长度应该大于 ${COMMIT_MESSAGE_MIN_LENGTH} ,本次提交的备注长度为: ${msg_length} ,请修改后再提交!"exit 1fi### 找到匹配内容做相应处理,如fix ,校验pom文件等#if [[ "${match}" =~ "fix:" ]]; then## 如果是修补bug,规范有点获取到fix中的ID,然后调用禅道对外的API关闭,其他场景类似#fi# 是否开启校验和main分支isMaster=$(echo $refname | grep "main$")if [ $CHECK_MASTER_POM_SNAPSHOT_ON == 0 ] && [ -n "$isMaster" ]; then# 如果是main分之,并且pom文件发生了变更,判断pom文件是否含有sonapshot的引用pomfile=`git diff --name-only ${oldrev} ${newrev} | grep -e "pom\.xml"`if [[ "${pomfile}" != "" ]]; then#echo $pomfile## 获取pom文件更新的内容pomcontent=`git show $newrev:$pomfile`#echo $pomcontent## 校验pom文件是否包含snapshot版本if [[ $pomcontent =~ 'SNAPSHOT' ]]; then#echo -e "Error: Snapshot version cannot exist in main branch!"echo -e "错误: main 分支中不能存在快照版本!"exit 1fififi## 其他操作#echo "Commit comments validate Success!"echo "提交备注格式检查通过!"else#echo -e "Error: Commit comments message should be started with [${tips_msg}]..."echo -e "错误: 提交备注格式错误,请修改后再提交,具体规范请参考团队规范文档"exit 1fifi
done
}
## 代码校验
validate_code_rules()
{
echo 'Start code analysis!'
oldrev=$(git rev-parse $1)
newrev=$(git rev-parse $2)
refname="$3"
#echo 'Old version: '$oldrev
#echo 'New version: '$newrev
#echo 'Branch: '$refnameTEMPDIR=$BASE_PATH/"tmp"FILES=`git diff --name-only ${oldrev} ${newrev}  | grep -e "\.java$"`committer=`git log -1 $newrev --pretty=%ce`if [ -n "$FILES" ]; thenfor FILE in ${FILES}; domkdir -p "${TEMPDIR}/`dirname ${FILE}`" >/dev/nullgit show $newrev:$FILE > ${TEMPDIR}/${FILE}done;MAIN_JAVA_PATH=$TEMPDIR'/src/main'#echo 'Temp update files path: '$MAIN_JAVA_PATH#FILES_TO_CHECK=`find $MAIN_JAVA_PATH -name '*.java'`#echo 'Check files:'${FILES_TO_CHECK}echo 'Aliyun p3c-pmd check starting.....'#echo 'Current shell Path:' $BASE_PATH#echo 'JAVA_HOME:' $JAVA_HOME#echo 'Root directory for java sources: '$MAIN_JAVA_PATH#管理员提交暂时过滤掉检查if [ $committer != 'tangkai2009fei@163.com' ]; thenif [[ $CODE_RULE_TYPE == 0 ]]; then## 需要阿里云P3C的插件包p3c-pmd-2.0.0.jar与该脚本在同级目录下echo 'Code analysis for Aliyun-p3c..'#$JAVA_HOME/bin/java -Dpmd.language=en -cp $BASE_PATH/p3c-pmd-2.0.0.jar net.sourceforge.pmd.PMD -d $MAIN_JAVA_PATH -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 -Dfile.encoding=$FILE_ENCODING -Dpmd.language=$PMD_LANGUAGE -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-other.xml,rulesets/java/ali-set.xml -f textRESULT=$?#echo $RESULTif [ $RESULT -gt 0 ]; thenecho  "代码质量检测不通过,请修改后重试,请参考规范文档:https://github.com/alibaba/p3c"rm -rf $TEMPDIRexit 1fiecho 'Code analysis success!'elseecho "在白名单中,临时允许通过"fi  elseecho 'No java code, analysis end!'
firm -rf $TEMPDIR
}

4、给 pre-receive 文件增加执行权限

chmod +777 pre-receive

5、客户端提交代码进行测试

Gitlab+P3C-PMD(阿里云插件)标准化你团队的代码和提交信息相关推荐

  1. Nginx 代理转发阿里云OSS上传的实现代码

    这篇文章主要介绍了Nginx 代理转发阿里云OSS上传的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 前言 因为小程序上传需要https,服务器https用的是 ...

  2. 北京内推 | 阿里云视频处理算法团队招聘视频处理算法实习生

    合适的工作难找?最新的招聘信息也不知道? AI 求职为大家精选人工智能领域最新鲜的招聘信息,助你先人一步投递,快人一步入职! 阿里云 阿里云-视频云团队是一个年业务增长速度超过 300% 的团队,拥有 ...

  3. 阿里云智能开放平台团队何登成:解码云计算的 2B 服务基因 | 问底中国 IT 技术演进...

    受访者 | 何登成(花名圭多) 记者 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 前阵子,笔者参加杭州云栖大会之余,一时兴起,去良渚博物院转了一圈,没错,就是国庆马云去参观的那家博物院. ...

  4. 阿里云插件新版发布,多特性助力提升开发者体验

    好消息!阿里云 Cloud Toolkit 新版本于近日正式发布,推出了面向 IntelliJ 和 Eclipse 两个平台的新款插件,多个重大特性,持续提升开发者体验,本文将带大家快速预览该新版本. ...

  5. 遇见OFFER,阿里云最强技术团队现身招聘,“职”为你来

    简历投递入口: https://bss.csdn.net/delivery/resume/ali 在5·15 遇见OFFER大厂梦招聘活动中,近20家企业来到CSDN[遇见OFFER]直播招聘栏目,其 ...

  6. 腾讯云与阿里云竞争激烈:销售团队积极争取每一笔交易

    7月3日消息,据国外媒体报道,疫情爆发后,企业的云服务需求急剧上升,而腾讯云也在借此机会努力追赶阿里云. 腾讯云 腾讯云部门的一位知情人士表示,现在和阿里巴巴的竞争非常激烈,销售团队在和他们抢每一笔交 ...

  7. 黑客租用阿里云平台攻击淘宝,9900万账户信息遭窃取

    2月1日,澎湃新闻从浙江省公安机关打击整治网络违法犯罪"净网行动"新闻发布会获悉,浙江警方通报了半年来打击整治网络违法犯罪行为的15起典型案例,其中,嘉兴平湖警方破获的一起黑客攻击 ...

  8. 关于使用阿里云服务调用识别身份证图片、营业执照的信息抓取接口的简单实现

    1:识别身份证你可以选择用   阿里开放平台提供或者百度开放平台的识别 同理用哪个就要去注册个帐号.自行百度. 再此,使用的是阿里云的人脸识别. 传送门: https://market.aliyun. ...

  9. node开通阿里云短信验证服务,代码演示 超级详细

    阿里云官网步骤:Node.js SDK (aliyun.com) 首先先搭建一个node项目:app.js const express = require('express'); // 引入 Expr ...

最新文章

  1. 【Kotlin】我的第一个 Kotlin 程序
  2. 苹果首席设计官将离职;华为将从世界范围招揽天才少年;新版 Edge 更新 | 极客头条...
  3. 如何准备 Java 初级和高级的技术面试
  4. 项目--Asp.net全局变量的设置和读(web.config 和 Gloab)
  5. 数据结构——线性表的顺序表示
  6. win10如何打开摄像头_win10系统,蓝牙关闭,如何打开?
  7. matlab 圆和直线的交点,用matlab求直线和椭圆的交点坐标!
  8. 【好玩的小demo】微信QQ聊天数据统计分析
  9. Bitbake中文手册--1(概述)
  10. flutter手写板2.0 橡皮擦
  11. 计算机专业定向选调,兄弟们,关于定向选调和找工作,JR们能不能给小弟一些建议...
  12. SAP 下载SMW0模板文件并附加数据导入到Excel示例
  13. 前后端及常用语言介绍
  14. 高并发如何处理,解决方案
  15. 搜索引擎可搜到微信公众号内容?百度回应:不能
  16. 最后几张票,送完即止:KubeCon 2021中国大会
  17. [ACTF2020 新生赛]Exec1命令注入
  18. 一个总是令人记不住的vectorvectorPoint
  19. Spark 常用算子详解(转换算子、行动算子、控制算子)
  20. 第十二届蓝桥杯初赛试题B直线

热门文章

  1. css3span等高_支持具有CSS或IMG的iPhone或iPad 3等高dpi像素密集型“视网膜”显示器
  2. Linux重命名root用户
  3. iOS13-适配夜间模式/深色外观(Dark Mode)
  4. vue项目中设置全局loading时 遇到多个请求时loading加载显示问题
  5. 【引语练习题】间接引语 + 不定式
  6. 好一道简单的html试题
  7. 最高补贴30万!这个城市面向全国高校招引优秀毕业生
  8. 以旧焕新的css滤镜
  9. pod访问外部mysql_pod连接外部数据库超时分析和处理方法
  10. i5-1035G1和i7-1065G7哪个好