文章目录
- 一 开发规范
-
- 1 分支命名规范
- 2 CommitMessage 规范
- 3 Idea Git Commit Template插件
- 4 开发手册
- 二 Code Review
-
- 1 前置代码Review
- 2 人工代码Review
- 3 静态代码扫描配置
- 三 gitstats 代码统计
一 开发规范
1 分支命名规范
名称 | 说明 | 命名规范 | 命名示例 | 目标 | 合并操作 |
---|---|---|---|---|---|
master | 线上稳定版本,发布需要打Tag。 | master | master | – | – |
test | 测试分支,待发布版本。 | test | test | master | merge request |
dev | 当前正在开发的分支 | dev | dev | test | merge request |
feature | 功能分支,每个功能需分别建立自己的子分支 | feature-功能模块 | feature-order | dev | merge request |
2 CommitMessage 规范
Git提交代码必须输入commit message,否则不允许提交。commit message应该尽量清晰明了,说明本次提交的目的。关于commit message写法规范,我们将采用社区使用最广的angular规范,比较合理和系统化,并且有配套的工具。
commit message格式
每次提交,Commit message 都包括三个部分:Header,Body 和 Footer。
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>
Header
(1) type
type用于说明commit的类别,常用的标识如下:
- feat:新功能
- fix:修补bug
- docs:文档
- style: 格式(不影响代码运行的变动,空格,格式化,等等)
- refactor:重构(即不是新增功能,也不是修改bug的代码变动)
- perf: 性能 (提高代码性能的改变)
- test:增加测试或者修改测试
- build: 影响构建系统或外部依赖项的更改(maven,gradle,npm 等等)
- ci: 对CI配置文件和脚本的更改
- chore:对非 src 和 test 目录的修改
- revert: Revert a commit
(2) scope
scope用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。
(3) subject
subject是 commit 目的的简短描述,不超过50个字符,主要介绍此次代码变更的主要内容。
Body
Body 部分是对本次 commit 的详细描述,可以分成多行。
例如:
-修改菜单查询接口
-增加菜单删除接口
日常项目开发中,如果Header中subject已经描述清楚此次代码变更的内容后,Body部分就可以为空。
Footer
(1) 不兼容变动
(2) 关闭 Issue
日常项目中开发,Footer不常用,可为空。
3 Idea Git Commit Template插件
4 开发手册
目前使用阿里巴巴开发手册-嵩山版本
二 Code Review
1 前置代码Review
提交代码到gitlab时,主要做下面两件事情:
- 检查commit message是否合理
- 通过p3c插件检查代码质量,p3c是专门用来检测代码是否符合阿里巴巴开发规范的。
2 人工代码Review
采用MergeRequest形式,合并代码时进行代码Review,或者发起Issue。
3 静态代码扫描配置
准备代码Review需要的环境
在gitlab数据目录建立git-hooks,准备jdk、p3c-pmd jar包、代码规则xml文件。注意git-hooks目录以及子目录和子文件需要 chown -R git:root git-hooks, Jar包和xml规则来源alibaba p3c开源项目。
配置代码钩子和代码Review执行脚本
在gitlab的版本库里面配置下面的目录结构,并且指定属主和属组,chown -R git:root custom_hooks, chmod +x pre-receive。
pre-receive脚本内容
把git-hooks目录挂载到了gitlab的数据目录,脚本是在gitlab容器里面运行的,因此脚本里面配置的相关路径是容器内部的路径。
#!/bin/bash
echo "开始检测代码质量"
export JAVA_HOME=/var/opt/gitlab/git-hooks/jdk1.8.0_211
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=0while read oldrev newrev refname; doif [ "$oldrev" = "0000000000000000000000000000000000000000" ];thenoldrev="${newrev}^"fi# 先检测commit messagecommitmsg=git log -1 $newrev --pretty=%secho $commitmsgif [[ commitmsg =~ ^(feat|fix|test|refactor|docs|style|chroe)\(.*\):.* ]]thenecho "commit message通过"elseecho -e "\033[31m Error: the commit message is irregular \033[m"echo -e "\033[31m Error: type must be one of [feat,fix,docs,style,refactor,test,chore] \033[m"echo -e "\033[31m eg: feat(user): add the user login \033[m"exit 1ficommitter=git log -1 $newrev --pretty=%cefiles=git diff --name-only ${oldrev} ${newrev} | grep -e ".java$"echo $committerif [ -n "$files" ]; thenTEMPDIR="tmp"for file in ${files}; domkdir -p "{TEMPDIR}/`dirname {
file}`" >/dev/nullgit show newrev:file > {
TEMPDIR}/{
file}done;files_to_check=find $TEMPDIR -name '*.java'java -Dpmd.language=en -cp /var/opt/gitlab/git-hooks/p3c-pmd-2.0.1-jar-with-dependencies.jar net.sourceforge.pmd.PMD -d $TEMPDIR -R /var/opt/gitlab/git-hooks/rulesets/ali-comment.xml,/var/opt/gitlab/git-hooks/rulesets/ali-concurrent.xml,/var/opt/gitlab/git-hooks/rulesets/ali-constant.xml,/var/opt/gitlab/git-hooks/rulesets/ali-exception.xml,/var/opt/gitlab/git-hooks/rulesets/ali-flowcontrol.xml,/var/opt/gitlab/git-hooks/rulesets/ali-naming.xml,/var/opt/gitlab/git-hooks/rulesets/ali-oop.xml,/var/opt/gitlab/git-hooks/rulesets/ali-orm.xml,/var/opt/gitlab/git-hooks/rulesets/ali-other.xml,/var/opt/gitlab/git-hooks/rulesets/ali-set.xml -f text -shortnamesREJECT=$?echo "reject = "$REJECTif [ $REJECT = 0 ] ;thenecho "恭喜你代码通过质量检测!"elif [ $committer = 'admin@domain.com' ]; thenecho "在白名单中,临时允许通过"REJECT=0else echo "请及时修改代码并再次尝试!"firm -rf $TEMPDIRfi
done
exit $REJECT
三 gitstats 代码统计
安装gitstats命令
- git clone https://github.com/hoxu/gitstats
- 把gitstats改成gitstats.py
- yum install gnuplot -y
生成仓库统计结果
- python gitstats/gitstats.py ./macao/ ./git-stats-macao-mpw
- 生成的./git-stats-macao-mpw目录是仓库代码的统计结果,可以通过ngxin访问该目录。