提交代码「前置处理」,向前一小步,效率提升「亿点点」

news2024/11/26 18:28:54

💡 如何巧用 Git Hook,解决代码提交中的代码规范性、冲突和错误以及工作流程问题?

近日,在极狐Tech Talk 直播上,极狐(GitLab) 后端工程师田鲁分享了自己的实践经验。以下内容整理自本次直播,你也可以点击文末「阅读原文」观看视频回放。Enjoy~

在开发过程中,开发人员提交代码后,需要继续做很多工作,因此我们不由萌生一个问题:是否可以把一些工作前置处理,减少等待时间?

首先,我们先回顾一下常见的代码流程:

1. 开发人员在本地编写代码之后,执行 Git Commit 操作 ,保存本地仓库;

2. 将代码推送到远端服务器,触发 CI Pipeline,执行 Pipeline 中各阶段任务:Build、Unit test、Integration test;

3. 执行 CD Pipeline 阶段任务:Review、Staging、Production。

在该流程中,若在本地发现问题,修复起来时间相对较短;若在远程执行 Pipeline 后才发现问题,则修复时间较长,并且增加了服务器的压力。

那么是否可以将一些工作提前,如在中间部分(如上图)完成来提高本地效率,缩短开发流程呢?如题所言“向前一步”,即把原本在 CI 中执行的部分工作,放在本地执行。

代码流程中的后置处理之痛


常见代码开发过程中,通常依赖于后置处理,即开发人员的代码提交到 Git 上以后,运行 CI/CD 或者 Code Review 过程中才发现常见问题,包括:

  • 代码规范 → 花大量时间沟通达成一致;

  • 冲突与错误 → 提交后发现与主分支冲突,需要重复修改代码和提交;

  • 敏感误提交 → 可能造成安全事故;

  • 缺少自动化任务 → 手动执行,容易遗忘。

这样既浪费了 CI/CD 资源,也花费了不必要的时间,导致开发效率低。

举个🌰,如下图极狐GitLab 中的 Pipelines,在构建作业 → 测试 → 发布的环节中,我们需要等上传测试后才能发现错误,接着在本地修改,再把 Pipeline 推送上来,才能确认这个错误是否被修复;若没有修复,则需要重复修改,直至修复完成,这个过程耗费很多时间。

可能大家会想到,对团队成员进行口头约束,或从制度上要求开发人员必须自己做检测,但这些几乎是流于形式。

那么,极狐GitLab 如何处理解决这些问题的?

极狐GitLab 自动化流程落实前置处理


极狐GitLab 通过自动化流程,高效落实开发工作,让团队协作更流畅。

  • 代码规范性问题

在提交代码前,运行代码风格检查和自动化测试等脚本,帮助开发人员发现并修复代码中的规范性问题,从而保证代码的质量和可维护性。

  • 冲突和错误问题

在提交代码前运行 Git Hook,帮助开发人员避免将错误或不规范的代码推送到代码仓库中,从而减少代码冲突和错误。

  • 工作流程问题

开发人员规范化 Git 工作流程,提高工作效率和协作效果。通过配置 Git Hook,可以自动化执行代码检查、测试、构建和部署等任务,避免手动操作繁琐和出错。

极狐GitLab 在具体实践中逐步完善了该自动化流程,从而确保研发任务能更有效执行。这部分在极狐GitLab 的文档里也有更具体说明,感兴趣的小伙伴可以查阅我们的资源与文档。

前置处理的关键方法:Git Hook


与许多其他版本控制系统一样,Git 有一种方法可以在发生某些重要操作时,触发自定义脚本,即 Git Hook(Git 钩子)。

当我们初始化一个项目之后,.git 目录下有一个 hooks 目录,可以看到上图左侧有很多执行任务,比如 pre-commit,代表在运行这些命令之后或之前,会进行一些校验和检测来执行相应任务。

Git Hook 分为两部分:本地和远程,如下图所示:

本地 Git Hook,由提交和合并等操作触发:

  • 比如代码发生变更,进行 git add,把 message 进行 commit changes;

  • 当 git commit 时,就会执行一个钩子叫 pre-commit(准备提交钩子)。

远程 Git Hook,运行在网络操作上,例如接收推送的提交:

  • 在 commit 之后,要推送到远端,此时有一个叫 pre-push 钩子,把信息推送 git 仓库;

  • 在远程阶段,极狐GitLab 相当于一个远程仓库。如图有很多仓库,分别承担不同功能,比如 pre-receive ,主要在服务器端接收通过本地推上来代码,然后 update 相关代码,post-receive 说明代码接受成功,同时有一个服务器钩子执行。

在这里,我们主要关注本地 hook,比如说 pre-message 和 pre-push,因此我们会借助这些工具来实现规范化代码内容。

提前进行代码规范检测

极狐GitLab 是一个非常大的代码仓库,包含前端代码、后端代码,还有运维相关代码:

  • 前端代码如 ESlint、Jsonlint、HAML-lint、Markdown-lint;

  • Ruby 相关的如 RuboCop、Stylelint;

  • Yaml 相关的如 Yaml-lint。

当然也支持不同语言项目,像 Python、Java 或者其它编程语言,也会有相应代码规范要求,可以自己添加。

每个 Lint 都会去检测代码中的变动,从而检测代码是否符合预期。只有符合预期的代码,才能够推送进来,避免代码提交之后,再发现代码规范问题,在反复修改上浪费时间。

这就好比整个代码仓库是房子,代码是水,Lint 相当于过滤器,必须让这些代码经过过滤后,才能从水龙头流出,成为生活用水。

提前进行代码安全检测

下图展示的是 GitHub 安全事故:很多人在测试或调试代码过程中,把一些 Token 放在里面,无意识地推送到仓库中,导致 API 和加密密钥泄露,这很容易被人发现和利用,进而造成巨大损失。

极狐GitLab 十分注重代码安全,我们必须想办法阻止开发人员将密钥提交到仓库,也就是必须在 Commit 之前,阻止开发人员把密钥信息给放到 Git 历史记录中。

那么,常见的安全代码检测工具有哪些?这里给大家提供一个参考,就是 Gitleaks。

Gitleaks 是一个 SAST 静态代码检测工具,检测代码中常见的 Secret、Token、Password 等内容,生成 Secret 检测报告产物,避免误提交,提高研发安全性。

提前进行自动化内容检测

上述代码规范检测、代码安全检测,都是在代码提交前,及时发现问题和解决问题,提升代码质量和安全性。自动化内容检测偏向于常规性内容检测,例如:

  • gettext:查找未翻译的内容,提示开发人员及时翻译;

  • docs-metadata:提醒开发人员为文本添加描述等;

  • graphql-doc:检测 graphql 的 doc 是否完整;

自动化内容检测避免代码提交到在服务器后再去修改内容,也是提高开发效率的手段之一。

上述 3 个步骤放在本地开发阶段执行,基于以下原因,开发效率就会有很大提升,甚至整个运行时间降低 50%,同时更高效地提升了代码质量:

  • 本地运行速度快;

  • 及时发现问题,减少沟通协作成本;

  • 节省 Code Review 时间;

  • 节省 CI/CD 运行资源。

友好的 Git Hook 管理工具:Lefthook


我们可以使用 Git Hook 里的 bash 脚本来编写,比如前面提到的 Eslint、Stylelint 等,但是这种方式有个比较大的缺点:无法放在仓库中,则无法看到变更历史,也不方便分发,而且可能不是每个开发人员都熟悉脚本的开发。

因此,我们可能需要更友好的 Git Hook 管理工具,这里推荐工具:Lefthook。

什么是 Lefthook?

Lefthook 是一个开源的 Git Hook 管理工具,帮助开发人员自动化和规范化 Git 工作流程。

Lefthook 具备以下特点:

1.  支持多种编程语言:包括 Python、JavaScript、Ruby、Go、Java 等;

2.  简单易用:轻松安装和配置,使用过程也非常简单;

3.  高灵活性:允许用户在 Git Hook 中使用任何语言和工具,而不仅仅是 shell 脚本;

4.  高可扩展性:可与其他工具和系统集成,比如 CI/CD 工具、代码检查工具、自动化测试工具等;

5.  支持跨平台:支持 macOS、Linux 和 Windows 等多个平台。

如何使用 Lefthook?

前文介绍了本地开发的前置一步,接下来通过实例让大家体会一下在前置处理中,如何使用 left hook 处理代码的风格安全问题。

上图是我第一次编辑的一段 Ruby 代码:通过 ChatGPT 抓取 GitHub issue 的一个内容。可以看到,acces-token 是一个环境变量,生成一个client 接口,接着我们去抓取相关 issue 信息,最后把它们打印出来。

这段代码无论从风格上还是从安全性上来说,都是一个很简单的内容。

假设本地开发人员对这段代码进行了二次编辑,他发现设置本地变量比较麻烦,直接把密钥写在代码中(如上图。密钥为随机值),同时还把代码风格打乱了,空了很多多余行,换行也是往后对齐,导致整个代码乱糟糟,不符合规范。

把这段代码推送到 CI 上,就会被检测出问题,或者 Code Review 发现这些Token 不应该上传,但这样属于事后处理,实际上,我们应该在提交之前处理掉这些问题。

那么我们看下 Lefthook 的配置, Lefthook 是类似一个 yml 的文件的配置。如下图,这里有一个 pre-push 的 hook,还有推送前的一个命令叫 pre commit。这里我们着重讲讲 pre-commit。

pre-commit 它运行两个方面:

1. Rubocop 风格检测:对 .rb 后缀的文件进行入库,检测是否符合规范

2. 密钥检测:检测文件中是否发生了密码的泄露

当我们在 commit 时,就会运行这两个命令,检测提交的代码内容。

检测上图这段糟糕的的代码时,看到执行钩子 pre-commit 后的效果:

  • 密钥检测提醒第七行有一个 api key 泄露,确实左边第七行用了一个明文密钥;

  • 风格检测提醒 15-17 行是多余空行,第 25 行写法不符合规范。

从而这段代码报错了,阻止 commit 的提交。

发现这些问题之后,就可以直接在本地去修复了,不用等待 CI/CD 时间;修复完再次提交,就成功了,可以看到 CI/CD 正常运行,让 CI/CD 在 测试期间也能正常通过,效率就大大提高了。

除了这些内容,我们还会进行一些常规检测,比如在 Lefthook 配置里,有一个叫 Ruby 代码风格检测工具 Rubocop,有一些命令可以修复大部分错误内容,我们也可以加入一些自定义命令,如出现问题,自动修复并推送到服务后,给钉钉发送信息等。

极狐GitLab 中,大概有十几个 Lefthook 命令,在开发过程中自动发现常见问题并解决。

总结


很多时候,造成效率低下的原因,是发现问题的时机太晚,Git Hook 在本地就能帮助我们解决代码规范问题、代码安全问题,并通过自定义脚本内容来自动执行,减少CI/CD、Code Review 时间,整体提升开发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/460665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux第二章

文章目录 前言一、Linux系统的目录结构和路径表达形式二、Linux命令基础1.ls命令入门2.ls命令的参数和选项3.-cd-pwd命令4.相对路径绝对路径和特殊路径符5.-mkdir命令6.-touch-cat-more-命令7.-cp-mv-rm-命令8.-which-find命令9.-grep-wc-管道符10.-echo-tail-重定向符11.-vi编…

Spring Boot自动装配

目录 是什么? 自动装配的原理 进入SpringBootApplication注解 点击进入EnableAutoConfiguration注解 AutoConfigurationImportSelector(核心) 点进getAutoConfigurationEntry()方法: 点进getCandidateConfigurations() 流程图 是什么&…

远程支持软件:轻松解决电脑问题!

远程协助不工作 当我们提到Windows的远程支持软件时,许多人的第一个想法可能是Windows远程协助。它可以通过发送和接收邀请文件连接两台电脑,然后您可以远程修复另一台电脑上的问题。但是,有时,您会遇到诸如“远程协助无法连接…

【FFTW库】编译生成 x86、arm 环境下的FFTW库

FFTW是一个快速计算离散傅里叶变换的标准C语言程序集,可计算一维或多维实和复数据以及任意规模的DFT。下面主要介绍的是 x86 环境下 FFTW库的编译过程,arm环境下的编译过程和FFTW类似,不同之处在于需要手动指定 编译环境 和 编译器。 FFTW有…

十大常见的电子元器件

电子元器件是电子技术中的基础组成部分,是电子电路的基本构件。电子元器件的种类繁多,但其中一些元器件的应用非常广泛,被称为十大最常用电子元器件。本文将介绍这些元器件的基础知识。 一、电阻器 电阻器是一种用来阻碍电流流动的元器件&a…

改善内部客户服务的 3 个技巧

在当今世界,许多公司都专注于改善客户关系管理,公司管理层面临的挑战是他们不仅拥有外部客户,员工也是有痛点和需求的内部客户。正如糟糕的客户服务会导致客户流失一样,糟糕的内部客户服务会增加员工流动率。在当今瞬息万变的就业…

C++98 auto_ptr智能指针

auto_ptr 是C98定义的智能指针模板,其定义了管理指针的对象,可以将new获得(直接或间接)的地址赋给这种对象.当对象过期时,其析构函数将使用delete来释放内存! 用法: 头文件: #include<memory> 用法: auto_ptr <类型> 变量名(new 类型); #include<iostream> …

算力为基,生态谋远,英特尔商用客户端的三重创新进化

“混合办公”仍旧是2023年全球企业IT管理者与“打工人”共同关注的热点话题。 比如根据携程最新公布的数据&#xff0c;过去一年内有超过66%的员工申请了混合办公对比试运行阶段&#xff0c;管理者对混合办公的支持率提升了10%。超九成管理者认为混合办公对效率无影响。调研数…

gpt人工智能模型原理-GPT的特点和基本原理

gpt训练模型 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是指一类以Transformer网络为基础的语言模型&#xff0c;可以用于自然语言生成、问答、文本分类等多个NLP任务。GPT的训练是基于预训练&#xff08;pre-training&#xff09;的方式进行的&#xff…

Java中读取用户输入的是谁?Scanner类

目录 前言一、Scanner类二、Scanner类基本使用1. 基本使用2. nextLine()方法 前言 我们在初学 Java 编程的时候&#xff0c;总是感觉很枯燥乏味&#xff0c;想着做点可以交互的小系统&#xff0c;可以让用户自由输入&#xff0c;系统可以接收做出反映。这就要介绍一下 Java 中的…

【数据库】表的增删改查(基础 )

目录 1、新增/插入数据 1.1、给表中所有字段插入数据 1.1、给表中指定字段&#xff08;列&#xff09;插入数据 1.2、一次插入多条记录 1.3、时间日期数据的插入 1.3.1、手动插入某个时间 1.3.2、插入当前时刻的时间 2、查找操作 2.1、全列查找&#xff08;查找表的…

【ArcGIS Pro二次开发】(24):现状、规划用地图斑的变化检查

如题如见&#xff0c;这是一个检查现状、规划用地变化的工具。 通过此工具&#xff0c;可以生成变化图斑&#xff0c;检查规划中发生的变化&#xff0c;明确是正常的规划措施&#xff0c;还是因为误操作产生的图斑变化。 一、要实现的功能 如上图所示&#xff0c;点击【检查现状…

【Daily Share】没有域名怎么破?手把手教你如何通过hosts配置域名(假域名)

目录 ❌前言&#x1f4c4;hosts文件&#x1f989;DNS解析步骤&#x1f44c;配置伪域名第一步 修改本机hosts配置第二步 配置服务器nginx &#x1f503;流程图 ❌前言 ip记不住&#xff1f;&#xff1f;&#xff1f; 域名不想买&#xff1f;&#xff1f;&#xff1f; 每次当我…

系统分析师《企业信息化战略与实施》高频知识点

企业信息化战略与实施---企业信息化与电子商务 业务流程重组&#xff08;Business Process Reengineering BPR&#xff09;是针对企业业务流程的基本问题进行反思&#xff0c;并对它进行彻底的重新设计&#xff0c;使业绩取得显著性提高。与目标管理、全面质量管理、战略管理等…

桂林阳朔4天4夜旅游攻略-亲测整理踩坑版本

桂林阳朔4天4夜旅游攻略-亲测整理踩坑版本 前言我的行程上海飞机出发到达两江机场桂林第一家酒店第一天早饭桂林米粉正宗吃法坐大巴去杨堤路口杨堤路口坐巴士直达杨堤码头杨堤到兴坪坐电动竹筏兴坪--20元背面打卡地兴坪古镇--汽车站阳朔酒店租电动车遇龙河漂流&#xff08;*五星…

Three.js教程:Face3对象定义Geometry的三角形面

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 其他系列工具&#xff1a; NSDT简石数字孪生 Face3对象定义Geometry的三角形面 几何体Geometry的三角面属性geometry.faces和缓冲类型几何体BufferGeometry顶点索引属性BufferGeometry.index类似都是顶点位置数据的索引值…

【MySQL入门指南】MySQL中的数据类型总结

文章目录 MySQL数据类型一、数值类型1.类型总览2.BIT类型3.INT系列类型4.浮点数类型1)float与double2.float与decimal 二、字符串类型1.类型总览2.CHAR类型3.VARCHAR类型 三、日期与时间类型四、枚举类型1.enum类型2.set类型3.在set中的查找 MySQL数据类型 ​ MySQL中支持的数…

ONLYOFFICE协作空间是什么?

今天给大家带来一个好消息&#xff0c;ONLYOFFICE推出更安全的协作空间了&#xff0c;好多朋友看到这个标题不认识是什么&#xff0c;我也是&#xff0c;今天来给大家介绍一下。 什么是 ONLYOFFICE 协作空间 简单来说ONLYOFFICE协作空间是一个协同工作平台&#xff0c;帮助您更…

Unity3D:模拟器视图

推荐&#xff1a;将NSDT场景编辑器加入你的3D工具链 3D工具集&#xff1a;NSDT简石数字孪生 模拟器视图 “模拟器”视图在模拟的移动设备上显示应用程序。使用它来查看应用程序与该设备的屏幕形状、分辨率和方向的显示方式。 模拟器视图的屏幕截图 使用模拟器视图 若要打开…

微服务学习——Docker

初识Docker 项目部署的问题 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题: 依赖关系复杂&#xff0c;容易出现兼容性问题开发、测试、生产环境有差异 Docker Docker如何解决依赖的兼容问题的? 将应用的Libs(函数库)、 Deps&#xf…