Continuous Integration is Dead

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

几天前,我的文章为什么持续集成不起作用DevOps.com上发表了。几乎同一天,我在Twitter上收到了几条非常负面的批评。

下面是我对这个未被问到的问题的回应:

为什么连续集成不应该有效呢?它是一个如此优秀和受欢迎的想法。

虽然我在这个领域有一些经验,但我不会将其作为论据。相反,我将尽力仅依靠逻辑。

顺便说一下,我的经验包括在50多个开源和商业项目中使用Apache Continuum、Hudson、CruiseControl和Jenkins五年。除此之外,几年前我创建了一个托管的持续集成服务,名为fazend.com,并于2013年改名为rultor.com。目前,我还是TravisAppVeyor的活跃用户。

How Continuous Integration Should Work

这个想法很简单、很明显。每次你向“master”分支(或Subversion中的“/trunk”)提交新的修改时,持续集成服务器(或服务)会尝试构建整个产品。“构建”意味着编译、单元测试、集成测试、质量分析等等。

结果要么是“成功”,要么是“失败”。如果是成功的,我们说“构建成功”。如果是失败的,我们说“构建失败”。构建通常会失败,因为有人通过提交新代码,导致以前通过的单元测试变为失败的。

这是问题的技术方面。它总是有效的。嗯,它可能存在一些问题,比如硬编码的依赖、环境之间缺乏隔离或并行构建冲突,但本文不涉及这些问题。如果应用程序编写良好且其单元测试稳定,持续集成就很简单。从技术上讲。

让我们来看看组织方面。

持续集成不仅仅是一个进行构建的服务器,还是一个应该“工作”的管理/组织过程。所谓“工作”,正如Jez Humble在《持续交付:通过构建、测试和部署自动化实现可靠软件发布》(http://amzn.to/2c7sR4V)第55页所说的。

重要的是,如果构建失败,开发团队会立即停止当前的工作并立即修复问题。

这就是不能运行和无法工作的。

Who Needs This?

正如我们所看到的,持续集成是让整个开发团队暂停工作并修复破损的构建。让我重申一下。一旦构建出现问题,每个人都应该专注于修复它,并提交一个将构建恢复到稳定状态的代码。

现在,我的问题是,在一个积极工作的团队中,可能需要这个吗?

一个对尽快将新功能推向市场感兴趣的产品负责人?或者一个负责截止日期的项目经理?或者程序员们,他们讨厌修复其他人制造的错误,尤其是在压力下?

谁喜欢这种持续集成,谁需要它呢?

Nobody.

What Happens In Reality?

我可以告诉你,我见过这种情况多次。情景总是一样的。我们开始忽视持续集成构建的状态。无论构建是干净的还是破碎的,我们继续做之前的事情。

我们没有停下来修复它,就像Jez Humble建议的那样。

相反,我们忽视来自持续集成服务器的信息。

最终,也许是明天或者周一,我们会尽量找些空闲时间来修复构建。只是因为我们不喜欢仪表板上的红色按钮,想要把它变成绿色的。

What About Discipline?

是的,这个问题还有另一面。我们可以尝试在团队中强制执行纪律。我们可以制定严格的规定,即我们的构建始终保持干净,而且任何破坏构建的人都会受到某种惩罚。

尝试这样做,你会得到恐惧驱动开发。程序员会害怕将任何东西提交到代码库,因为他们知道如果他们导致构建失败,他们将不得不道歉,至少要道歉。

在这种情况下,严格的纪律(我非常喜欢)只会使情况变得更糟。整个开发过程变得缓慢,程序员尽可能地将他们的代码保留给自己,以避免可能破坏构建。当是提交的时候,他们的更改如此庞大,导致合并变得非常困难,有时甚至不可能。

结果就是你会得到很多一次性的代码,由某人编写但从未提交到master,因为这种恐惧因素。

OK, What Is The Solution?

我之前写过这个问题;它被称为只读主分支。

很简单—禁止任何人将任何东西合并到master分支,并创建一个任何人都可以调用的脚本。该脚本将合并、测试和提交。脚本不会有任何例外。如果任何分支在任何一个单元测试中出现问题,整个分支将被拒绝。

换句话说:在代码进入master之前,引发红旗。

这解决了所有问题。

首先,构建始终是干净的。我们根本无法破坏它,因为除非他的代码保持构建干净,否则没有人能够提交。

其次,不会有任何破坏的担忧。仅仅是因为你在技术上做不到。你唯一能做的就是从合并脚本中得到一个负面的回应。然后你修复错误并告诉脚本再试一次。没有人看到这些尝试,你也不需要道歉。恐惧因素消失了。

顺便提一下,尝试使用rultor.com来在你的项目中强制执行这个只读主分支原则。

Translated by ChatGPT gpt-3.5-turbo/36 on 2023-10-01 at 08:08

sixnines availability badge   GitHub stars