August 5, 2022
By: 马海强

git hooks(钩子)介绍和应用

  1. 客户端hooks :: 不随代码提交
    1. 位置
    2. 要求
    3. 提交钩子
    4. 电子邮件工作流钩子
    5. 其他钩子
  2. 服务端hooks :: 有自己的仓库目录
    1. 存在意义
    2. pre-receive :: 处理来自客户端的推送操作时最先被调用的脚本
    3. post-receive :: 在整个过程完结以后运行,可以用来更新其他系统服务或者通知用户
    4. 使用强制策略的一个例子
  3. 实践应用
    1. push msg检查
    2. blog有push时自动触发jenkins构建

客户端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 $exitCode
    

    commit时提示 lint 的结果

  • commit-msg : 对commit消息和用户进行校验

    1. 要求

      feat:新功能(feature)
      fix:修补bug
      docs:文档(documentation)
      style: 格式(不影响代码运行的变动,空格,格式化,等等)
      refactor:重构(即不是新增功能,也不是修改bug的代码变动)
      perf: 性能 (提高代码性能的改变)
      test:增加测试或者修改测试
      build: 影响构建系统或外部依赖项的更改(maven,gradle,npm 等等)
      ci: 对CI配置文件和脚本的更改
      chore:对非 src 和 test 目录的修改
      revert: Revert a commit
      
    2. 实现

      #!/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构建

  1. 服务端实现
    1. 在服务端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
      
    2. 使其可执行

      chmod +x post-receive
      chown jenkins:jenkins post-receive
      
    3. 钩子测试

      ./post-receive
      
  2. 客户端实现
    • 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
      
  3. 其他方案 jenkins webhook plugin code.aliyun.com 上也可配置webhooks
Tags: git