Git hooks与自动化部署
Author:zhoulujun Date:
好的 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
延伸阅读:
- 删除github中的项目
- git本地分支与远程分支不同步pull push操作失败,代码冲突
- git rebase取消后重新push失败,intellij提示detached head
- git版本冲突:not concluded your merge (MERGE_HEAD exists). hint: P
- GitHub不再支持密码验证解决方案:SSH免密与Token登录配置
- github的Contributions找不到自己:设置git commit邮箱与用户名
- windows上git不区分文件大小写——mac/liunx打包报错
- Git内部原理:微型文件系统与内容寻址系统(转载)
- github与gitlab使用的一些经验
- Github进行fork后如何与原仓库同步:fork分支如何追新与提交
- git文件无修改diff无变更提交列表很多—被修改(LF/CRLF换行
- git Monorepo代码管理模式
- git操作PR与MR有啥区别吗?
- 项目git commit时卡主不良代码:husky让Git检查代码规范化工作
- git中merge还是rebase?git之圣战merge vs rebase
- git宝典—应付日常工作使用足够的指北手册