为什么你的团队不需要使用拉取请求 | IDCF

news2024/11/24 20:40:45

作者:Kief Morris

译者:冬哥

原文:https://infrastructure-as-code.com/book/2021/01/02/pull-requests.html

前 言

Github 引入了Pull Request拉取请求(简称PR)实践和相关的支持功能,使运行开源项目的人更容易接受来自他们信任的提交者群体之外的贡献。

Committer是被信任的主体,可以定期更改代码库。但是需要评估来自随机外部人员的更改,以确保其有效,不会使项目朝着不需要的方向发展,并且符合风格和质量标准。外部人员将他们提出的变更打包为拉取请求,Committer可以轻松地将其作为一个单元进行审查和管理,然后再将其合并到代码库中。

图片

(图 1:拉取请求流程)

尽管拉取请求旨在更容易地接受来自团队外部不受信任的人的贡献,但现状是很多团队对内部人员使用拉取请求。这种做法已经变得如此普遍,以至于许多人将其视为默认的“最佳”实践。有些人认为没有其他方法可以确保代码得到评审,因为他们从未见过其他任何东西。

然而,拉取请求会牺牲性能,包括交付时间和质量。当管理来自未知人员的变更风险时,这是一个值得做出的牺牲。外部人员可能不了解你项目的愿景和方向。他们在测试、代码质量和风格方面可能没有相同的习惯和规范。但是,你自己团队成员内部应该共享这些规范。

针对自己团队成员的代码变更采用拉取请求,就像让你的家人通过机场安全检查站进入你家一样,这是针对不同问题的昂贵解决方案。 

使用持续集成而不是拉取请求

软件交付过程应该针对流程和质量进行优化。将变更前置保持在较短的时间,并在变更引入问题时提供快速反馈。这是支持持续集成(CI)的想法。CI 是在每个人的代码上不断合并和测试他们的做法。

图片

(图 2:持续集成过程)

“当他们工作时”是必不可少的。作为团队成员,你不会等到完成某个功能或故事后才将代码集成到主干中。相反,你经常 - 至少每天一次 - 将你的代码置于健康状态,通过测试并将其与其他人的当前工作一起集成到主干中。

每次推送变更时,CI 构建作业都会自动测试项目的主干。这意味着在投入太多时间之前,你会立即发现你正在做的事情是否与另一个人正在做的事情发生冲突。当你认为已经完成了一个故事或功能,却发现必须回去解决并重做这几天的努力,会很糟糕。

图片

(图 3:每次推送时都在集成代码上运行测试)

拉取请求的麻烦

拉取请求会延迟集成。当完成工作,认为已准备好与团队其他成员的工作进行集成时,你创建一个拉取请求并等待有人对其进行审核。只有在其他人审查通过变更后,才会将其与主干集成。

如果团队成员快速审查和集成拉取请求,这仅比 CI 慢一点。也许他们会在你每次推送的30 分钟内回复并审核,将你的代码变更与主干集成,并针对它运行自动化测试。因此,你可能会在 30-40 分钟左右之后发现与其他人的工作发生冲突。

图片

(图 4:拉取请求与 CI 的反馈延迟)

在实践中,没有多少团队能在 30 分钟内可靠地解决拉取请求。在等待某人审查你的变更时,你可以切换到另一个任务或开始处理新的修改。当发现存在问题时,你需要切换回原始更改,从而中断了当前的工作流程。

另一方面,有效的 CI 构建应该在推送集成代码后的几分钟内完成测试 - 在我们的场景中最多 10 分钟。你几乎会立即发现该冲突,因此可以对其进行调查和修复。

在从测试完全集成的代码中获得反馈之前,你无需打断其他人的工作来要求他们对其进行审查。正如我将很快解释的那样,你可能仍然需要有人审核变更。但是你可以利用更快的周期时间来提交、集成和测试自己的代码,以便在要求他们审查之前进行多项更改。

即使团队中的每个人都很快地改变了拉取请求,典型的做法是等到完成功能或故事的工作,然后再将拉取请求与主干集成。大多数团队平均需要超过一天的时间来开发一个故事。因此,典型的拉取请求流程不满足持续集成的最低要求,即至少每天集成每个人的工作。

每天数次以编码、拉取、测试、推动和从集成测试中获取反馈的节奏工作会令人兴奋,而拉取请求在节奏中引入人为延迟,不可能产生这种兴奋感。

审查代码更改更好的方法

当 CI 与拉取请求的话题出现时,不可避免地会有人站出来为拉取请求辩护,以获取其他团队成员对更改的反馈。

必须有第二双眼睛(如果不是更多)查看代码更改。人类会发现测试没有发现的问题,尤其是与可维护性和设计相关的问题。让人们审查彼此的代码还有助于团队在编码风格、编程习惯和质量要求等规范上趋于一致。在某些情况下,例如受监管的环境,需要由第二人审查每个更改。

然而,最近拉取请求的流行似乎导致一些人认为没有其他方法可以用来审查代码变更。以下是你可以使用的一些实践,而不会中断持续集成反馈周期。请记住,完全可以根据需要进行多个实践的组合。

图片

(图 5:配对以实现即时、持续的代码审查)

  • 结对编程:没有任何形式的代码审查比结对编程更有效。反馈是即时的,因此使用它进行改进的可能性要高得多。如果有人在你编写代码时告诉你有更好的方法,那么你可以立即停止、学习并以更好的方式编写代码。如果有人在一天后告诉你,你可以将其记录下来以备将来参考。但是要让你停止当前的工作并回去重做你已经完成的工作,这会成为一个严重的问题。

  • 定期审查:如果合规性没有明确要求进行审查,则可能不需要为每个代码更改设置一个门禁。你可能有定期的、预定的审查,例如每周,来检查自上次审查以来的代码更改。这作为小组练习尤其有效,因为它创建了对话,帮助人们学习和塑造团队的编码规范。

  • 流水线审批:如果你的团队使用持续交付流水线将变更交付到生产,可以包括一个阶段,要求有人授权变更进行。这在概念上类似于拉取请求,因为它是交付过程中的一个门禁,但当你将门禁放在代码集成和自动化测试之后。这样做意味着人们只花时间审查已经在技术上被证明是正确的代码。

图片

(图 6:在集成和测试之后审查更改)

结论

拉取请求与持续集成的不同之处在于,在编写代码变更之后但在将其与主线集成之前,需要人工审查代码更改。这会延迟从已完全集成代码的自动化测试中获取到反馈。

使用持续集成,代码要么在编写时(结对)进行审查,要么在集成和测试之后进行审查。针对集成和测试变更的循环进行优化,意味着你可以更频繁地运行此循环。更频繁的编码和集成循环鼓励开发人员进行更小更频繁的提交,从而提高质量和流程。

 

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

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

相关文章

Day58权限提升-网站权限后台漏洞第三方获取

webshell 一般我们的渗透流程就是信息收集,发现漏洞,漏洞利用,一些漏洞成功之后获得一些相应的权限,还有一些是漏洞利用成功之后并没有取得的权限,而这个权限是要通过漏洞利用之后在利用其它地方取货的权限。 权限的获…

docker (简介、dcoker详细安装步骤、常用命令)- day01

一、 为什么出现 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应…

8 个适用于电脑的顶级免费分区恢复软件

Windows PC 上的数据管理有时可能会带来压力,尤其是当您有多个分区时。大多数时候,磁盘管理工具使分析磁盘、释放空间甚至创建分区变得非常容易。但有时会发生不可预见的事件,可能导致分区丢失,从而造成潜在的数据灾难。嗯&#x…

Keil报错_Error:CreateProcess failed,Command:‘xxx\fromelf.exe‘

1、报错信息 2、分析及解决 错误原因:fromelf.exe路径错误,无法执行命令。 发生情景:编译从另一个电脑拷贝的代码时。 解决方法: 1、当你不需要生成bin文件时,可以选择不执行这个命令。(去掉√&#xf…

Java 之 lambda 表达式(一)

目录 一. 前言 二. lambda 表达式语法 2.1. 语法1:无参,无返回值 2.2. 语法2:一个参数,无返回值 2.3. 语法3:两个参数,lambda 体中有多条语句 2.4. 语法4:两个以上参数,有返回…

使用paddledetection的记录

首先在这里使用的是是paddle--detection2.7的版本。 成功进行训练 目录: 目录 数据集准备 配置文件的修改 使用的是BML的平台工具: !python -m pip install paddlepaddle-gpu2.5 -i https://mirror.baidu.com/pypi/simple --user %cd /home/aistudio…

识别验证码

背景 需求是要爬取某网站的数据, 已有账号密码, 但这个网站需要登录, 登录需要输入验证码 验证码样式如下 调研了Tesseract框架, 识别效果不佳. 后来使用ddddocr, 能正确识别. https://github.com/sml2h3/ddddocr 代码如下 def ocr():response requests.get(http://xxx/get…

Jenkins Pipeline应用实践

Jenkins Pipeline是一种可编程的、可扩展的持续交付管道,允许您使用脚本来定义整个软件交付过程。 以下是使用Jenkins Pipeline创建和配置流水线的基本步骤。 Part 01. 创建一个Pipeline Job 在Jenkins中创建一个新的"Pipeline"类型的Job。 以下是在Je…

【STM32F103】HC-SR04超声波测距模块详解(附工程文件)

前言: 使用的硬件:STM32F103C8T6,HC-SR04,ST-Link(其他烧录器也可以),0.96寸OLED屏幕(非必须,仅供显示测距结果,可以使用串口助手代替)&#xff…

rabbitMQ对消息不可达处理-备份交换机/备份队列

生产者发送消息,在消息不可达指定队列时,可以借助扇出类型交换机(之前写过消息回退的处理方案,扇出交换机处理的方案优先级高于消息回退)处理不可达消息,然后放置一个备份队列,供消费者处理不可…

Pytorch中的gather的理解和用法

Pytorch中的gather的理解和用法 这个Gather的用法花费了点时间,我相信很多人一开始不太懂。 跟着我简单理解。 首先样例是: tensor([[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])然后index: [[2, 1, 0]]然后执行的代码: tensor_0.gather(0…

使用 SIEM 管理安全事件

每家公司都必须处理检测、管理和解决安全事件,未能制定事件响应计划可能会对任何组织产生重大的影响,无论是在财务损失还是声誉损害方面。本文探讨了事件响应的重要性、检测和管理事件的关键要素,以及帮助组织处理安全事件的最佳实践。 安全…

FLASK博客系列6——数据库之谜

我们上一篇已经实现了简易博客界面,你还记得我们的博客数据是自己手动写的吗?但实际应用中,我们是不可能这样做的。大部分程序都需要保存数据,所以不可避免要使用数据库。我们这里为了简单方便快捷,使用了超级经典的SQ…

如何使用内网穿透将Tomcat网页发布到公共互联网上【内网穿透】

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器,不仅名字很有趣&#xff0…

Redis面试题:分布式锁相关问题

目录 面试官:Redis的内存用完了会发生什么? 面试官:Redis分布式锁如何实现 ? 面试官:好的,那你如何控制Redis实现分布式锁有效时长呢? 面试官:好的,redisson实现的分布式锁是可重…

现货黄金走势图下载与保存

MetaTrader 4 (MT4) 是一款在全球范围内广受欢迎的现货黄金交易软件,简单性和灵活性是其深受市场欢迎的原因。它的显示界面的主要部分由品种的走势图表组成,投资者可以在其中查看实时的行情走势。屏幕左上角是市场观察窗口,当中列出了平台所有…

群晖NAS:docker(Container Manager)、npm安装Verdaccio并常见命令集合

群晖NAS:docker(Container Manager)、npm安装Verdaccio并常见命令集合 自建 npm 资源库,使用Verdaccio。如果觉得麻烦,直接可以在外网注册 https://www.npmjs.com/ 网站。大同小异,自己搭建搭建方便局域网…

如何进行有效的移动应用测试?

1、识别关键功能: 对于移动应用测试,首先要了解应用的需求和功能规格,确定哪些功能是最关键的。 关键功能通常是用户最常用的功能,对应用的成功和用户体验至关重要。 2、设定测试目标和用例: 针对每个关键功能,设置具体的测试目…

基于springboot+maven的个人理财管理系统

基于springbootmaven的个人理财管理系统,演示地址:个人理财系统登录界面 用户名:admin,密码:123456 共分为用户信息管理(用户信息,银行卡,个人征信),理财产品管理(零钱理财,工资理财,期限理财&#xff0c…

如何在本地安装部署WinSCP,并实现公网远程本地服务器

可视化文件编辑与SSH传输神器WinSCP如何公网远程本地服务器 文章目录 可视化文件编辑与SSH传输神器WinSCP如何公网远程本地服务器1. 简介2. 软件下载安装:3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 …