最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

Git hooks与自动化部署-全球新消息

来源:博客园

好的 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/envpython#coding=utf-8##commitmsgcheckimportsysimportreimportioifhasattr(sys.stdout,"buffer"):sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding="utf-8")TIPS_INFO="""不符合commit规范,提交失败(当前状态等于没做刚刚的commit操作)!commit规范:类型详细消息规范样例:gitcommit-m"xxxxxxxxxxxxxxxxxx"!!!!提交失败!!!!"""defcheck_commit_line1_format(msg):regOther=r"\S{5,}(.){10,100}"matchObj=re.match(regOther,msg)returnmatchObjif__name__=="__main__":withopen(sys.argv[1],"r")asf:forlineinf: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//.git目录cd/var/opt/gitlab/git-data/repositories//.gitls//HEADconfigdescriptionhooksinfoobjectsrefs//在hooks文件夹中存放着GitLab定义的钩子脚本lshooks//post-receivepre-receiveupdate

创建 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/shDIR=/home/wwwroot/default#此次为nginx服务器站点代码git--work-tree=${DIR}clean-fddemo-brancdgit--work-tree=${DIR}checkout--forcedemo-brancdchowngit:gitpost-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

关键词: