• home > tools > versionControl > git >

    Git hooks与自动化部署

    Author:zhoulujun Date:

    Git 钩子最常见的使用场景包括根据仓库状态改变项目环境、接入持续集成工作流等。由于脚本是可以完全定制,所以你可以用 Git 钩子来自动化或者优化你开发工作流中任意部分。简单的解决办法是把钩子文件存放在项目目录

    好的 commit message 是至关重要的,如果随意编写 log,带来的后果可小可大,但是无论大小都影响了开发的效率和回朔的难度,所以有必要进行 log 规范化检查。

    通过自定义的commit message,我们可以

    jenkins虽好,但是对于小型项目,特别是客户合作开发。一些自动化的东西就需要自己手工编写脚本了。如git 的hooks  nodejs 的shell.js,甚至打包工具, webpack执行终端shell命令操作系统:webpack-shell-plugin。最多用的还是git hooks

    Git 钩子(hooks)

    Git 钩子(hooks)是在 Git 仓库中特定事件(certain points)触发后被调用的脚本。通过钩子可以自定义 Git 内部的相关(如 git push)行为,在开发周期中的关键点触发自定义的行为

    Git 含有两种类型的钩子:客户端的和服务器端的。

    • 客户端钩子由诸如提交和合并这样的操作所调用

    • 服务器端钩子作用于诸如接收被推送的提交这样的联网操作。

    Git 钩子最常见的使用场景包括根据仓库状态改变项目环境、接入持续集成工作流等。由于脚本是可以完全定制,所以你可以用 Git 钩子来自动化或者优化你开发工作流中任意部分。


    Git 钩子安装

    Git 钩子存在于每个 Git 仓库的 .git/hooks 目录中。 

    当你用 git init 初始化一个新版本库时,Git 默认会在这个目录中放置一些示例脚本。所有的示例都是 shell 脚本,其中一些还混杂了 Perl 代码,不过,任何正确命名的可执行脚本都可以正常使用 —— 你可以用 Ruby 或 Python,或其它语言编写它们。

    默认存在的都是示例,其名字都是以 .sample 结尾,如果你想启用它们,得先移除这个后缀。把一个正确命名且可执行的文件放入 Git 目录下的 hooks 子目录中,即可激活该钩子脚本。 这样一来,它就能被 Git 调用。

    创建 post-commit 脚本

    touch post-commit

    然后在 post-commit 文件中写入以下内容

    #!/usr/bin/env python# coding=utf-8## commit msg checkimport sysimport reimport ioif hasattr(sys.stdout, 'buffer'):
        sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')TIPS_INFO = '''
    不符合commit规范,提交失败(当前状态等于没做刚刚的commit操作)!
    
    commit规范:
    类型 详细消息
    
    规范样例:
    git commit -m "xxxxx xxxxxxxxxxxxx"
    
    !!!!提交失败!!!!
    '''def check_commit_line1_format(msg):
        regOther = r'\S{5,} (.){10,100}'
        matchObj = re.match(regOther, msg)
        return matchObjif __name__=="__main__":
        with open(sys.argv[1], 'r') as f:
            for line in f:
                if (check_commit_line1_format(line)):
                    sys.exit(0)
                else:
                    print(TIPS_INFO)
                    sys.exit(1)

    Git hooks 案例:commit msg 格式自动检查实战

    虽然有很多现成的 hook 可用,上面给出例子就是演示下,这里实现一个提交 message 格式的简单检查,要求提交消息单行且分两部分,且有一定的字数限制(实际你可以任意 YY 规则)。

    钩子如何编写,如何定义,官方文档写的非常详细:https://git-scm.com/book/zh/v2/自定义-Git-Git-钩子


    Git 钩子的作用域

    Git 钩子是对本地仓库相关操作影响,对于任何 Git 仓库来说钩子都是本地的,初始的钩子都是从 Git 默认模板目录中自动安装。

    在开发团队中为了保持团队所使用钩子一致,维护起来算是比较复杂的,因为 .git/hooks 目录不随你的项目一起拷贝,也不受版本控制影响。

    简单的解决办法是把钩子文件存放在项目的实际目录中(在.git 外),这样就可以像其他文件一样进行版本控制,然后在.git/hooks中创建一个链接,或者简单地在更新后把它们复制到.git/hooks目录下。


    Git 服务端钩子 Server-Side Hooks

    我们自己的开源项目,一般用GitHub,因为不是自家的服务器,只有调用官方的api接口,只有等GitHub通知我们,然后我们服务端监听,

    可参看:基于GitHub/Webhook的简单自动化部署架构,一般用github管理项目的,还是少。公司基本都用GitLab

    如果做公司的项目,还是自建GitLab服务器,下面将讲解如何在 GitLab 服务器中使用 Server-Side Hooks。

    # 替换 group 和 project,注意如果不在该目录的话,则应该是 /home/git/repositories/<group>/<project>.git 目录
    cd /var/opt/gitlab/git-data/repositories/<group>/<project>.git
    ls
    // HEAD  config  description  hooks  info  objects  refs
    // 在 hooks 文件夹中存放着 GitLab 定义的钩子脚本
    ls hooks
    //post-receive  pre-receive  update

    创建 custom_hooks 文件夹用于存放自定义钩子脚本

    mkdir custom_hooks 

    并创建 post-receive 脚本(客户端 push 到 Git 服务器时会触发 post-receive 钩子)

    touch post-receive

    Git 钩子进行自动部署

    如何实现 Git 钩子进行自动部署,其实原理很简单,我们只需要监听每次本地 git push到远程服务器,然后远程服务器同步拉取最新文件,重启服务器即可(pm2 reload xx)。

    #demo-brancd 表示demo分支,不写默认master分支
    #!/bin/sh
    DIR=/home/wwwroot/default #此次为nginx服务器站点代码
    git --work-tree=${DIR} clean -fd demo-brancd
    git --work-tree=${DIR} checkout --force demo-brancd
    chown git:git post-recevice #授权给git用户


    参考文章:

    用 Git 钩子进行简单自动部署 https://aotu.io/notes/2017/04/10/githooks/

    自定义 Git - Git 钩子 https://git-scm.com/book/zh/v2/自定义-Git-Git-钩子

    Git Hooks 的使用 https://www.jianshu.com/p/4058c63310b7

    基于GitHub/Webhook的简单自动化部署架构 www.tgf21.com/post/fc66e3c5.html


    转载本站文章《Git hooks与自动化部署》,
    请注明出处:https://www.zhoulujun.cn/html/tools/VCS/git/8319.html