home > tools > versionControl > git >

Git hooks与自动化部署

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