前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Git hooks与自动化部署

Git hooks与自动化部署

原创
作者头像
周陆军博客
发布2023-06-06 11:34:52
6820
发布2023-06-06 11:34:52
举报
文章被收录于专栏:前端博客前端博客

好的 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 文件中写入以下内容

代码语言:javascript
复制
#!/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。

代码语言:javascript
复制
# 替换 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)。

代码语言:javascript
复制
#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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Git 钩子(hooks)
  • Git 钩子安装
    • 创建 post-commit 脚本
      • Git hooks 案例:commit msg 格式自动检查实战
      • Git 钩子的作用域
      • Git 服务端钩子 Server-Side Hooks
      • Git 钩子进行自动部署
      相关产品与服务
      持续集成
      CODING 持续集成(CODING Continuous Integration,CODING-CI)全面兼容 Jenkins 的持续集成服务,支持 Java、Python、NodeJS 等所有主流语言,并且支持 Docker 镜像的构建。图形化编排,高配集群多 Job 并行构建全面提速您的构建任务。支持主流的 Git 代码仓库,包括 CODING 代码托管、GitHub、GitLab 等。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档