代码仓库-代码提交规范

开发提交规范

不同的代码语言,代码仓库类型,都会有不太一样的提交规范。本文将从DevOps三级认证的要求,说明一些通用的提交规范。

1. 代码提交规范

  • 提交备注:必须关联到需求管理系统的需求单/任务单/缺陷单,并且可以通过备注可以看到单号对应的内容。
  • 代码质量:必须本地构建通过,自测通过,有本地质量规约扫描的,须扫描完成后,才可以提交代码到远程仓库。
  • 提交时间:必须完成一个单号对应的开发任务,提交到远程仓库一次。禁止一次提交多个单号对应的代码。

2. SQL脚本提交规范

  • 提交备注:必须关联到需求管理系统的需求单/任务单/缺陷单,并且可以通过备注可以看到单号对应的内容。
  • 文件名称:必须可以通过文件名,清晰的看出是哪个单号。
  • SQL内容:不同的数据库类型和项目特点,对SQL语句的规范要求不一样,根据需要进行约束即可,比如:不允许使用update语句。

3. 规范的强制约束

有了规范,紧紧靠开发人员的自觉,肯定是不行的。而且有些项目开发人员流动比较频繁。所以基于代码仓库钩子的强制约束肯定是少不了的。校验的内容主要如下:

  • 备注格式正确性。
  • 需求单/任务单/缺陷单的正确性(是否存在、是否在当前迭代、是否在开发中等)。
  • 提交人信息是否为单号领取人。
  • 代码质量相关校验。
  • SQL脚本规范相关校验。
3.1. SVN代码仓库钩子

SVN的钩子分为 pre-commit 和 post-commit 。假如开发提交有问题,不允许提交到仓库,需要在pre-commit在限制。

如下是 pre-commit 的脚本示例。也可以在脚本中调用其他脚本语言完成较为复杂的逻辑判断。

#!/bin/sh
REPOS="$1"
TXN="$2"
SVNLOOK=/app/csvn/bin/svnlook
export LANG="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
CODE_PATH="config/v0."

#限定提交分支,为他分支不做限制"U config/dev/readme.txt"
if [ `$SVNLOOK changed -t $TXN $REPOS |grep ${CODE_PATH}|wc -l` -eq 0 ];
    then 
    exit 0;
fi

#获取提交备注中@的个数"@reqid@test"
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep -o "@" | wc -l`
#获取备注信息中的第二个@后面的数据
COMMENT=`$SVNLOOK log -t "$TXN" "$REPOS" | awk -F@ '{print $3}'`

if [ "$LOGMSG" -lt 2 ] || [ "$LOGMSG" -gt 2 ] || [ "${COMMENT}" == "" ];
then
	echo -e '###############CI Remind Begin###############' 1>&2
	echo -e 1.You should commit with comment like as below:    @task_id@comment 1>&2
	echo -e '###############CI Remind  End ###############' 1>&2
   exit 1
fi

#个人比较喜欢使用python完成钩子的复杂判断
PYTHON_BIN=/app/csvn/data/repositories/XX_CODE/hooks/python3.6.5/bin/python3
HOOK_DIR=/app/csvn/data/repositories/XX_CODE/hooks
${PYTHON_BIN} ${HOOK_DIR}/pre_commit.py ${SVNLOOK} ${REPOS} ${TXN}
3.2. GitLab代码仓库钩子

Git钩子分为本地钩子(开发本地PC)和服务端钩子。本地钩子会在开发人员 commit 时触发,服务端钩子会在开发人员 push 到远程仓库时触发。本地钩子建议有,服务端钩子则必须有(总有开发人员忘记安装本地钩子)。

3.2.1. 本地钩子

git的本地钩子可以使用pre-commit / no-verify / prepare-commit-msg / commit-msg / post-commit 进行校验。

pre-commit 钩子在键入提交信息前运行。 它用于检查即将提交的快照,例如,检查是否有所遗漏,确保测试运行,以及核查代码。 如果该钩子以非零值退出,Git 将放弃此次提交,不过你可以用 git commit --no-verify 来绕过这个环节。 你可以利用该钩子,来检查代码风格是否一致(运行类似 lint 的程序)、尾随空白字符是否存在(自带的钩子就是这么做的),或新方法的文档是否适当。
prepare-commit-msg 钩子在启动提交信息编辑器之前,默认信息被创建之后运行。 它允许你编辑提交者所看到的默认信息。
该钩子接收一些选项:存有当前提交信息的文件的路径、提交类型和修补提交的提交的 SHA-1 校验。
它对一般的提交来说并没有什么用;然而对那些会自动产生默认信息的提交,如提交信息模板、合并提交、压缩提交和修订提交等非常实用。
你可以结合提交模板来使用它,动态地插入信息。
commit-msg 钩子接收一个参数,此参数即上文提到的,存有当前提交信息的临时文件的路径。 如果该钩子脚本以非零值退出,Git
将放弃提交,因此,可以用来在提交通过前验证项目状态或提交信息。 在本章的最后一节,我们将展示如何使用该钩子来核对提交信息是否遵循指定的模板。
post-commit 钩子在整个提交过程完成后运行。 它不接收任何参数,但你可以很容易地通过运行 git log -1 HEAD
来获得最后一次的提交信息。 该钩子一般用于通知之类的事情。

这里使用 prepare-commit-msg 对提交内容进行校验
【注意】: prepare-commit-msg 放到 本地工程目录/.git/hooks 目录下。

#!/bin/sh
# 此脚本为prepare-commit-msg内容 
# 此次提交的备注信息文件
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
SHA1=$3

COMMIT_CONTENT=`cat ${COMMIT_MSG_FILE}`
TASK_ID=`echo ${COMMIT_CONTENT} | awk -F '@' '{print $2}'`
ACCOUNT=`echo ${COMMIT_CONTENT} | awk -F '@' '{print $3}'`

echo '############ prepare-commit-msg ############'
echo "COMMIT_SOURCE:${COMMIT_SOURCE}"

#假如是merge操作,不作处理
if [ ${COMMIT_SOURCE} == 'merge' ]; then
    echo 'this is merge, exit 0.'
    echo '############ prepare-commit-msg ############'
    exit 0
fi

echo ${COMMIT_CONTENT} | grep '^@task_.*@[^@].*@[^@].*'
TASK_INFO=$?
if [ ${TASK_INFO} -eq 1 ]; then
    echo 'please comments @task_id@account@content .'
    echo '############ prepare-commit-msg ############'
    exit 1
fi

echo '############ prepare-commit-msg ############'
3.2.1. 服务端钩子

GitLab服务端Hook脚本,放到项目名称下面,只对该项目进行限制。服务端钩子有 pre-receive / update / post-receive

pre-receive 处理来自客户端的推送操作时,最先被调用的脚本是 pre-receive。它从标准输入获取一系列被推送的引用。如果它以非零值退出,所有的推送内容都不会被接受。你可以用这个钩子阻止对引用进行非快进(non-fast-forward)的更新,或者对该推送所修改的所有引用和文件进行访问控制。
update 脚本和 pre-receive 脚本十分类似,不同之处在于它会为每一个准备更新的分支各运行一次。假如推送者同时向多个分支推送内容,pre-receive 只运行一次,相比之下 update 则会为每一个被推送的分支各运行一次。它不会从标准输入读取内容,而是接受三个参数:引用的名字(分支),推送前的引用指向的内容的 SHA-1 值,以及用户准备推送的内容的SHA-1 值。 如果 update 脚本以非零值退出,只有相应的那一个引用会被拒绝;其余的依然会被更新。
post-receive 挂钩在整个过程完结以后运行,可以用来更新其他系统服务或者通知用户。 它接受与 pre-receive 相同的标准输入数据。它的用途包括给某个邮件列表发信,通知持续集成(continous integration)的服务器,或者更新问题追踪系统(ticket-tracking system) ——甚至可以通过分析提交信息来决定某个问题(ticket)是否应该被开启,修改或者关闭。该脚本无法终止推送进程,不过客户端在它结束运行之前将保持连接状态, 所以如果你想做其他操作需谨慎使用它,因为它将费你很长的一段时间。

# 需要自己创建custom_hooks目录,创建pre-receive文件
/var/opt/gitlab/git-data/repositories/[group_name]/[project_name].git/custom_hooks
# 例子 /var/opt/gitlab/git-data/repositories/menglc/test.git/custom_hooks

#修改权限,需要对custom_hooks添加755权限
chmod -R 755 /var/opt/gitlab/git-data/repositories/[group_name]/[project_name].git/custom_hooks
chmod 777 pre-receive

这里使用 pre-receive 对提交内容进行校验

#!/bin/bash
# 此脚本为pre-receive内容 
read oldrev newrev refname

echo -e '###################### pre-receive ######################'
echo -e "start: $oldrev"
echo -e "end: $newrev"
echo -e "branch: $refname"

echo ${newrev} | grep '^0000000000'
if [ $? -eq 0 ];then
  echo -e '###################### pre-receive ######################'
  echo -e '[info] newrev does not have commitid'
fi

echo ${oldrev} | grep '^0000000000'
if [ $? -eq 0 ];then
  echo -e '###################### pre-receive ######################'
  echo -e '[info] oldrev does not have commitid'
fi

git log --pretty=oneline ${oldrev}..${newrev}|while read ID COMMENT
do
  echo -e '###################### COMMIT CHECK START ######################'
  echo ${ID}:${COMMENT}
  COMMIT_CONTENT=`git cat-file commit $ID | sed '1,/^$/d'`
  TASK_ID=`echo ${COMMIT_CONTENT} | awk -F '@' '{print $2}'`
  ACCOUNT=`echo ${COMMIT_CONTENT} | awk -F '@' '{print $3}'`
  AUTHOR=`git show --pretty=oneline --format=%an $ID|sed -n '1p'`

  if [[ "$refname" == "$refname" ]]
  then
    # 假如是merge操作,不作处理
    echo ${COMMIT_CONTENT} | grep '^Merge branch'
    if [ $? -eq 0 ];then
      echo -e '[info] this is Merge branch from remote.'
      echo -e '###################### pre-receive ######################'
      #exit 0
      continue
    fi

    echo ${COMMIT_CONTENT} | grep '^Merge remote-tracking branch'
    if [ $? -eq 0 ];then
      echo -e '[info] this is Merge remote-tracking branch from remote.'
      echo -e '###################### pre-receive ######################'
      continue
    fi

    echo ${COMMIT_CONTENT} | grep '^Revert "Merge branch'
    if [ $? -eq 0 ];then
      echo -e '[info] this is Revert.'
      echo -e '###################### pre-receive ######################'
      continue
    fi
    echo ${COMMIT_CONTENT} | grep '^@task_.*@[^@].*@[^@].*'
    TASK_INFO=$?
    if [ ${TASK_INFO} -eq 1 ] ;then
      echo -e 'error: please comments @task_id@account@content .'
      echo -e '###################### pre-receive ######################'
    exit 1
    fi

  fi
  echo -e '###################### COMMIT CHECK FINISH ######################\n'
done

【参考文档】:
git钩子官方详解:https://www.git-scm.com/book/en/v2/Customizing-Git-Git-Hooks

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值