好的 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与自动化部署的更多相关文章

  1. jenkins+git+maven搭建自动化部署项目环境

    简介    折腾了两个晚上,趁着今晚比较有空,把jenkins+git+maven搭建自动化部署项目环境搭建的过程记录一下,这里我把github作为git的远程仓库(https://github.co ...

  2. 使用Git Hooks实现开发部署任务自动化

    前言 版本控制,这是现代软件开发的核心需求之一.有了它,软件项目可以安全的跟踪代码变更并执行回溯.完整性检查.协同开发等多种操作.在各种版本控制软件中,git是近年来最流行的软件之一,它的去中心化架构 ...

  3. 用 Git Hooks 进行自动部署

    原文发表于 http://ourai.ws/posts/deployment-with-git-hooks/ 昨天开始接手开发公司前端团队的主页,在稍微修改点东西后推送到远程仓库想看下线上结果时发现并 ...

  4. 搭建Git服务器环境----Git hooks代码自动部署

    引言:自己想搭一套git的服务端环境,不想用github码云等.经多方资料整合,实验总结,以下是亲测有效的方式.可用于公司日常开发 一.搭建Git环境 ① 安装 Git Linux 做为服务器端系统, ...

  5. linux运维、架构之路-Git+Jenkins实现自动化部署

    一.Jenkins介绍          jenkins是一个用JAVA编写的开源的持续集成工具,运行在servlet容器中,支持软件配置管理(SCM)工具,可以执行基于APACHE ANT和APAC ...

  6. Git + Docker + Jenkins自动化部署web到Linux(Centos)

    1.把代码托管到Github上 2.安装Docker 3.安装Jenkins 4.在项目中编写Dockerfile.publish.sh (1)Dockerfile内容 # 基于dotnet基础环境构 ...

  7. GitLab私有化部署 - CI/CD - 持续集成/交付/部署 - 源代码托管 & 自动化部署

    预期目标 源代码管理 借助GitLab实现源代码托管,私有化部署版本,创建项目,创建用户组,分配权限,项目的签入/牵出等. 自动化部署 源代码产生变更时(如签入),自动化编译并发布到指定服务器中部署, ...

  8. Git Hooks、GitLab CI持续集成以及使用Jenkins实现自动化任务

    Git Hooks.GitLab CI持续集成以及使用Jenkins实现自动化任务 前言 在一个共享项目(或者说多人协同开发的项目)的开发过程中,为有效确保团队成员编码风格的统一,确保部署方式的统一, ...

  9. 使用Git实现Laravel项目的自动化部署

    简介 不知道大家一开始是怎么使用 git 进行开发的,反正我个人是先将代码提交到 github 仓库,然后用 SSH 登录到服务器,然后进行克隆或者版本更新.听起来就很麻烦,当然实际操作中也很麻烦,那 ...

  10. 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 ...

随机推荐

  1. 一文概览NLP句法分析:从理论到PyTorch实战解读

    关注TechLead,分享AI全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI ...

  2. 五分钟 k8s 实战-应用探针

    今天进入 kubernetes 的运维部分(并不是运维 kubernetes,而是运维应用),其实日常我们大部分使用 kubernetes 的功能就是以往运维的工作,现在云原生将运维和研发关系变得更紧 ...

  3. Jenkins从Ubuntu迁移至AlmaLinux问题及相关解决记录

    相关背景 之前在Ubuntu平台上搭建了Jenkins(在Ubuntu机器上使用war包安装Jenkins),现在由于一些需求,需要将系统迁移到AlmaLinux平台.由于AlmaLinux属于Cen ...

  4. ABAP 自定义附件

    SWO1 关键字   *------------------------------------------------------------* REPORT ZTEST_CSW1. *TABLES ...

  5. 为什么MySQL不建议使用delete删除数据?

    MySQL并不直接建议禁止使用DELETE语句删除数据,但是在某些情况下,使用DELETE可能会带来一些潜在的问题,特别是在大型数据库中. 下面我将详细介绍为什么在某些情况下MySQL不建议过度使用D ...

  6. 基于uQRCode封装的Vue3二维码生成插件

    标题:基于uQRCode封装的Vue3二维码生成插件 摘要:本文介绍了一种基于uQRCode封装的Vue3二维码生成插件,可以在Javascript运行环境下生成二维码并返回图片地址.该插件适用于所有 ...

  7. 0x04.信息收集

    探针 被动:借助网上的一些接口查询或者网上已经获取到的,查看历史信息. 主动:使用工具,从本地流量出发,探测目标信息,会发送大量流量到对方服务器上. 谷歌语法 懒人语法:https://pentest ...

  8. 分享一个 asp.net core 多文件分块同时上传的组件

    分享一个可多个文件同时上传.断点续传,并实时反馈上传进度的 Asp.Net core 组件. 服务器端 引用 nuget 包:JMS.FileUploader.AspNetCore 然后启用上传组件: ...

  9. [ABC246D] 2-variable Function

    Problem Statement Given an integer $N$, find the smallest integer $X$ that satisfies all of the cond ...

  10. 华企盾DSC苹果电脑-认证用户提示“不是认证成功的账户”

    出现该问题说明客户端连不上服务器,一般来说是网络原因,可按照下面方法排查 ​ 1.先检查网络是否通能否正常上网或者换一个网络试试 2.查看服务器是否启动 3.客户测试连接是否成功端口是否填成了5580 ...