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/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
Git hooks与自动化部署的更多相关文章
- jenkins+git+maven搭建自动化部署项目环境
简介 折腾了两个晚上,趁着今晚比较有空,把jenkins+git+maven搭建自动化部署项目环境搭建的过程记录一下,这里我把github作为git的远程仓库(https://github.co ...
- 使用Git Hooks实现开发部署任务自动化
前言 版本控制,这是现代软件开发的核心需求之一.有了它,软件项目可以安全的跟踪代码变更并执行回溯.完整性检查.协同开发等多种操作.在各种版本控制软件中,git是近年来最流行的软件之一,它的去中心化架构 ...
- 用 Git Hooks 进行自动部署
原文发表于 http://ourai.ws/posts/deployment-with-git-hooks/ 昨天开始接手开发公司前端团队的主页,在稍微修改点东西后推送到远程仓库想看下线上结果时发现并 ...
- 搭建Git服务器环境----Git hooks代码自动部署
引言:自己想搭一套git的服务端环境,不想用github码云等.经多方资料整合,实验总结,以下是亲测有效的方式.可用于公司日常开发 一.搭建Git环境 ① 安装 Git Linux 做为服务器端系统, ...
- linux运维、架构之路-Git+Jenkins实现自动化部署
一.Jenkins介绍 jenkins是一个用JAVA编写的开源的持续集成工具,运行在servlet容器中,支持软件配置管理(SCM)工具,可以执行基于APACHE ANT和APAC ...
- Git + Docker + Jenkins自动化部署web到Linux(Centos)
1.把代码托管到Github上 2.安装Docker 3.安装Jenkins 4.在项目中编写Dockerfile.publish.sh (1)Dockerfile内容 # 基于dotnet基础环境构 ...
- GitLab私有化部署 - CI/CD - 持续集成/交付/部署 - 源代码托管 & 自动化部署
预期目标 源代码管理 借助GitLab实现源代码托管,私有化部署版本,创建项目,创建用户组,分配权限,项目的签入/牵出等. 自动化部署 源代码产生变更时(如签入),自动化编译并发布到指定服务器中部署, ...
- Git Hooks、GitLab CI持续集成以及使用Jenkins实现自动化任务
Git Hooks.GitLab CI持续集成以及使用Jenkins实现自动化任务 前言 在一个共享项目(或者说多人协同开发的项目)的开发过程中,为有效确保团队成员编码风格的统一,确保部署方式的统一, ...
- 使用Git实现Laravel项目的自动化部署
简介 不知道大家一开始是怎么使用 git 进行开发的,反正我个人是先将代码提交到 github 仓库,然后用 SSH 登录到服务器,然后进行克隆或者版本更新.听起来就很麻烦,当然实际操作中也很麻烦,那 ...
- 8.3 Customizing Git - Git Hooks 钩子 自动拉取 自动部署 提交工作流钩子,电子邮件工作流钩子和其他钩子
https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks https://github.com/git/git/blob/master/temp ...
随机推荐
- 【KMP】border 题解
题目描述 输入 输出 样例输入 abaabaa 样例输出 17 样例解释: f[2][a] = 1 f[3][a] = 1 f[4][a] = 1 f[4][b] = 2 f[5][a] = 1 f[ ...
- SSL证书链及使用
什么是证书链 证书链简单来说是域名钥证书.CA公钥.根证书形成的一个颁发链条,属于公钥的一部分. 更白话一点,就是证书链文件包含一系列CA机构公钥的证书. 证书链格式 一般证书链格式是.chain,证 ...
- 什么是PIO
PIO,最早是我在raspberry pi pico的介绍中偶然看到的一个新词 转载来在[https://zhuanlan.zhihu.com/p/347948344] 关于PIO的介绍如下: MCU ...
- 【随手记录】Llama Tutorial 大语言模型实践
这个tutorial的契机是yy突然看到了一个workshop 所以类似于一周大作业的形式,输入command输出使用了自动驾驶哪些模块,代码在这里 所以就干一干,顺便写一个tutorial给大家参考 ...
- python函数str()避免类型错误
python中当输出需要拼接字符串(char)和整数(int)时,需要用到str()函数 如果编写如下代码: age = 23 print("Happy " + age +&quo ...
- python的动态绑定属性和方法
目录 创建类 动态绑定属性 动态绑定方法 创建类 首先我们创建一个类和它的对象 class Student: def __init__(self, name, age): self.name = na ...
- Proj4:改进LiteOS中物理内存分配算法
Proj4:改进LiteOS中物理内存分配算法 实验目的 掌握LiteOS系统调用的自定义方法 实验环境 Ubantu和IMX6ULL mini 实验内容 (从代码角度详细描述实验的步骤和过程) 原先 ...
- [ABC238G] Cubic?
Problem Statement Given a sequence $A$ of $N$ numbers, answer the following $Q$ questions. In the $i ...
- pinia持久化存储插件-pinia-plugin-persistedstate
pinia-plugin-persistedstate 丰富的功能可以使 Pinia Store 的持久化更易配置: 与 vuex-persistedstate 相似的 API 所有 Store 均可 ...
- Recursion Function 递归笔记
递归的解释: 递归(英语:Recursion),又译为递回, 在数学与计算机科学中,是指在函数的定义中使用函数自身的方法.(本文要讨论的重点) 递归一词还较常用于描述以自相似方法重复事物的过程.(指一 ...