除非您知道我们曾经做什么,否则您将无法知道CI是什么。想象一个由3部分组成的系统。有一个UI收集数据并将其放入数据库中。有一个报告系统可以从数据库中生成报告。还有一种服务器可以监视数据库并在满足某些条件时发送电子邮件警报。
很久以前,其内容如下:
- 同意数据库的架构和要求-这将需要数周的时间,因为它必须是完美的,因为您很快就会知道为什么
- 将3个开发者或3个独立的开发团队分配给这3个作品
- 每个开发人员都会工作数周,并使用自己的数据库副本测试其工作数周或数月。
在这段时间内,开发人员不会运行彼此的代码,也不会尝试使用由其他人的代码创建的数据库版本。报告编写者只需手工添加一堆示例数据。警报编写者将手动添加模拟报告事件的记录。GUI编写者将查看数据库以查看GUI所添加的内容。随着时间的推移,开发人员会意识到规范在某种程度上是错误的,例如未指定索引或字段长度太短,然后在其版本中“修复”该规范。他们可能会告诉其他人,他们可能会对此采取行动,但通常这些事情会在列表中列出以备后用。
当所有三个部分都经过完全编码,并由其开发人员进行了测试,有时甚至由用户进行了测试(向他们显示报告,屏幕或电子邮件警报)时,就会进入“集成”阶段。这通常是几个月的预算,但仍会结束。开发人员1所做的字段长度更改将在此处发现,并且需要开发人员2和3进行大量代码更改,并且可能还会更改UI。额外的索引将对其造成严重破坏。等等。如果用户告诉其中一位开发人员添加了一个字段并做到了,那么现在是其他两个人也必须添加它的时候了。
这个阶段非常痛苦,几乎无法预测。因此人们开始说“我们必须更频繁地集成”。“我们必须从一开始就共同努力。” “当我们中的一个提出变更请求时(那是我们当时的谈话方式),其他人必须知道这一点。” 一些团队开始更早地进行集成测试,同时继续单独工作。一些团队从一开始就一直使用彼此的代码并一直输出。这就是持续集成。
您可能会认为我夸大了第一个故事。我曾经为一家公司做过一些工作,当时我的联系人让我为检查存在以下缺陷的某些代码而烦恼:
- 他未使用的屏幕上的按钮尚未执行任何操作
- 没有用户签署过屏幕设计(精确的颜色和字体;屏幕的存在,功能以及300页规格中的按钮)。
他认为在完成之前不要将任何东西放到源代码控制中。他通常每年进行一到两次签到。我们在哲学上有点不同:-)
另外,如果您很难相信团队会在诸如数据库之类的共享资源周围断开连接,那么您真的不会相信(确实是)采用相同的方法进行编码。您将要编写一个我可以调用的函数?太好了,继续进行,在此期间,我将只硬编码所需的内容。几个月后,我将“集成”我的代码,因此它将调用您的API,并且如果我传递null,它将发现它炸毁,如果返回null(它做了很多),我将炸毁它返回的东西太大了对我来说,它不能应付leap年,还有其他一千件事。独立工作然后进入整合阶段是正常的。现在听起来像疯了。