每天读一篇一线开发者原创好文
1、场景和问题
日常开发中,代码合入流程一般是:先修改代码,提交代码到gerrit,通过CI检查和人工code-review之后,代码合入版本库。CI上一般会配置一些代码格式规范,单元测试覆盖率,圈复杂度之类的检查。
有时本地提交的代码,到CI检查报错了,查看原因,再本地修改提交,再提代码重做CI,比较麻烦。但是每次提交前手工执行这些检查命令或者脚本等容易忘记,且比较麻烦。
2、git钩子脚本
在.git/hooks目录中,有多种钩子文件,大部分文件都是以.sample为后缀,是示例文件,不生效。去掉.sample后缀才会生效。
其中有个pre-commit.sample文件,这个钩子在执行"git commit"命令时被调用,而且可以通过在命令中添加 --no-verify参数来跳过。这个钩子没有参数,在得到提交消息和开始提交前被调用。如果钩子执行结果是非零,那么"git commit"命令就会中止执行,文件不会被提交。
默认的'pre-commit'钩子里实现的是检查非ascii文件名,例如:如果有中文命名的文件,就会报错。不过pre-commit里面默认的功能,一般我们不需要,我们可以自己重新编写这个pre-commit脚本文件,添加我们自己需要的一些检查即可。
3、实践举例
例如:简单的实现对go语言代码的两个静态检查,如果检查失败,脚本异常退出;如果检查成功,脚本正常退出
[root@centos cradle]#cat.git/hooks/pre-commit
#!/bin/sh
echo"begin check"
cd/root/go/src/gitlab.zte.com.cn/dev/cradle/
echo"begin golint"
golint pkg/...
if[$?-ne];then
exit1
fi
echo"begin go tool vet"
go tool vet pkg/
if[$?-ne];then
exit1
fi
echo"check succ"
a、钩子执行失败的情况:代码没被提交
修改文件并git add,然后执行git commit进行提交,从打印可以看出先执行了pre-commit脚本,脚本检查失败,git status查看,文件没有被提交
[root@centos cradle]#git commit-m"update file"
begincheck
begingolint
begingo tool vet
pkg/innerdata/build/buildinst/registry/handler.go:22:possible formatting directiveinErrorcall
pkg/pipelinecontroller/instance/sendmail.go:370:possible formatting directiveinErrorcall
pkg/pipelinecontroller/instance/sendmail.go:391:possible formatting directiveinErrorcall
[root@centos cradle]#git status
# On branch testpre
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: pkg/build/inst.go
#
b、钩子执行成功的情况:代码被成功提交
执行git commit进行提交,先执行pre-commit脚本,脚本成功后,提交成功
[root@centos cradle]#git commit-m"update file"
begincheck
begingolint
begingo tool vet
check succ
[testpre a05d39a]update file
2files changed,3insertions(+)
[root@centos cradle]#git status
# On branch testpre
c、如果本次不关心检查的错误,则可以加上 参数--no-verify,本次commit就跳过pre-commit脚本检查
[root@centos cradle]#git commit-m"update file"--no-verify
[testpre061c348]update file
1file changed,1insertion(+)
[root@centos cradle]#git status
# On branch testpre
git commit --amend命令也会执行pre-commit脚本
4、推荐
1、易用性:只要写好pre-commit脚本,不需要其他操作,在执行git commit命令时会自动执行,简单易用
2、实用性:添加一些CI中的静态检查,在每次提交的时候,默认做基本的静态检查,这样可以在提交到gerrit前过滤掉一些问题,不至于到CI上运行失败了再打patch修改
领取专属 10元无门槛券
私享最新 技术干货