git hooks(钩子)介绍和应用
客户端hooks :: 不随代码提交
init项目时就会生成一些默认的hooks,以.sample结尾,是不会被执行,只要去掉整个后缀就会被执行
位置
.git/hooks,不会被push到远端
也可以通过以下配置指定
git config core.hooksPath hooks
要求
.git 目录下的 hooks 子目录中,任何一个正确命名的可执行文件,nodejs, shell, python, ruby不限制
提交钩子
pre-commit : 键入提交信息前运行 例如,检查是否有所遗漏,确保测试运行,以及核查代码
通常用来检查代码风格,类似lint功能,行位空格等
git commit –no-verify (绕过这个钩子)
prepare-commit-msg : 启动提交信息编辑器之前,默认信息被创建之后运行
commit-msg : 用来在提交通过前验证项目状态或提交信息
post-commit : 整个提交过程完成后运行
该钩子一般用于通知之类的事情,通知有人push了代码等
电子邮件工作流钩子
顾名思义
其他钩子
pre-rebase : 变基之前运行
可以使用这个钩子来禁止对已经推送的提交变基
pre-push : 会在 git push 运行期间, 更新了远程引用但尚未传送对象时被调用
服务端hooks :: 有自己的仓库目录
存在意义
对项目强制执行各种类型的策略,拒绝推送并给客户端返回错误消息
pre-receive :: 处理来自客户端的推送操作时最先被调用的脚本
post-receive :: 在整个过程完结以后运行,可以用来更新其他系统服务或者通知用户
它的用途包括给某个邮件列表发信,通知持续集成(continous integration)的服务器, 或者更新问题追踪系统(ticket-tracking system) —— 甚至可以通过分析提交信息来决定某个问题(ticket)是否应该被开启,修改或者关闭
使用强制策略的一个例子
实践应用
push msg检查
pre-commit : commit前检查lint,只要以非0的值退出,便会终止操作
vue create vue01#!/bin/sh npm run lint # 获取上面脚本的退出码 exitCode="$?" exit $exitCodecommit时提示
lint的结果commit-msg : 对commit消息和用户进行校验
要求
feat:新功能(feature) fix:修补bug docs:文档(documentation) style: 格式(不影响代码运行的变动,空格,格式化,等等) refactor:重构(即不是新增功能,也不是修改bug的代码变动) perf: 性能 (提高代码性能的改变) test:增加测试或者修改测试 build: 影响构建系统或外部依赖项的更改(maven,gradle,npm 等等) ci: 对CI配置文件和脚本的更改 chore:对非 src 和 test 目录的修改 revert: Revert a commit实现
#!/bin/sh # 用 `` 可以将命令的输出结果赋值给变量 # 获取当前提交的 commit msg commit_msg=`cat $1` # 获取用户 email email=`git config user.email` msg_re="^(feat|fix|docs|style|refactor|perf|test|workflow|build|ci|chore|release|workflow)(\(.+\))?: .{1,10}" if [[ ! $commit_msg =~ $msg_re ]] then echo "\n不合法的 commit 消息提交格式,请使用正确的格式:\ \nfeat: add comments\ \nfix: handle events on blur (close #28)\ \n详情请查看 git commit 提交规范" # 异常退出 exit 1 fi
blog有push时自动触发jenkins构建
- 服务端实现
在服务端git库的hooks增加一个
post-receive钩子,目前使用阿里云,未知如何使用. 以下是自建gitlab的使用方法#!/bin/sh curl --user marvin:0b73d8f30555c647815cdef5cecee42d http://106.14.1.13:8080/view/%E5%8D%9A%E5%AE%A2/job/blog_auto_deploy/build?token=Abcd1234使其可执行
chmod +x post-receive chown jenkins:jenkins post-receive钩子测试
./post-receive
- 客户端实现
pre-push,在客户端git库的hooks增加一个
pre-push钩子,内容同上,使其可执行#!/bin/sh curl --user marvin:0b73d8f30555c647815cdef5cecee42d http://106.14.1.13:8080/view/%E5%8D%9A%E5%AE%A2/job/blog_auto_deploy/build?token=Abcd1234
- 其他方案 jenkins webhook plugin code.aliyun.com 上也可配置webhooks