ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## [持续集成](https://lingcoder.gitee.io/onjava8/#/book/16-Validating-Your-Code?id=%e6%8c%81%e7%bb%ad%e9%9b%86%e6%88%90) 在软件开发的早期,人们只能一次处理一步,所以他们坚信他们总是在经历快乐之旅,每个开发阶段无缝进入下一个。这种错觉经常被称为软件开发中的“瀑布流模型”。很多人告诉我瀑布流是他们的选择方法,好像这是一个选择工具,而不仅是一厢情愿。 在这片童话的土地上,每一步都按照指定的预计时间准时完美结束,然后下一步开始。当最后一步结束时,所有的部件都可以无缝地滑在一起,瞧,一个装载产品诞生了! 当然,现实中没有事能按计划或预计时间运作。相信它应该,然后当它不能时更加相信,只会使整件事变得更糟。否认证据不会产生好的结果。 除此之外,产品本身经常也不是对客户有价值的事物。有时一大堆的特性完全是浪费时间,因为创造出这些特性需求的人不是客户而是其他人。 因为受流水工作线的思路影响,所以每个开发阶段都有自己的团队。上游团队的延期传递到下游团队,当到了需要进行测试和集成的时候,这些团队被指望赶上预期时间,当他们必然做不到时,就认为他们是“差劲的团队成员”。不可能的时间安排和负相关的结合产生了自实现的预期:只有最绝望的开发者才会乐意做这些工作。 另外,商学院培养出的管理人员仍然被训练成只在已有的流程上做一些改动——这些流程都是基于工业时代制造业的想法上。注重培养创造力而不是墨守成规的商学院仍然很稀有。终于一些编程领域的人们再也忍受不了这种情况并开始进行实验。最初一些实验叫做“极限编程”,因为它们与工业时代的思想完全不同。随着实验展示的结果,这些思想开始看起来像是常识。这些实验逐渐形成了如今显而易见的观点——尽管非常小——即把生产可运作的产品交到客户手中,询问他们 (A) 是否想要它 (B) 是否喜欢它工作的方式 (C) 还希望有什么其他有用的功能特性。然后这些信息反馈给开发,从而继续产出一个新版本。版本不断迭代,项目最终演变成为客户带来真正价值的事物。 这完全颠倒了瀑布流开发的方式。你停止假设你要处理产品测试和把部署"作为最后一步"这类的事情。相反,每件事从开始到结束必须都在进行——即使一开始产品几乎没有任何特性。这么做对于在开发周期的早期发现更多问题有巨大的益处。此外,不是做大量宏大超前的计划和花费时间金钱在许多无用的特性上,而是一直都能从顾客那得到反馈。当客户不再需要其他特性时,你就完成了。这节省了大量的时间和金钱,并提高了顾客的满意度。 有许多不同的想法导向这种方式,但是目前首要的术语叫持续集成(CI)。CI 与导向 CI 的想法之间的不同之处在于 CI 是一种独特的机械式的过程,过程中涵盖了这些想法;它是一种定义好的做事方式。事实上,它定义得如此明确以至于整个过程是自动化的。 当前 CI 技术的高峰是持续集成服务器。这是一台独立的机器或虚拟机,通常是由第三方公司托管的完全独立的服务。这些公司通常免费提供基本服务,如果你需要额外的特性如更多的处理器或内存或者专门的工具或系统,你需要付费。CI 服务器起初是完全空白状态,即只是可用的操作系统的最小配置。这很重要因为你可能之前在你的开发机器上安装过一些程序,却没有在你的构建和部署系统中包含它。正如重构一样,持续集成需要分布式版本管理,自动构建和自动测试系统作为基础。通常来说,CI 服务器会绑定到你的版本控制仓库上。当 CI 服务器发现仓库中有改变时,就会拉取最新版本的代码,并按照 CI 脚本中的过程处理。这包括安装所有必要的工具和类库(记住,CI 服务器起初只有一个干净、基本的操作系统),所以如果过程中出现任何问题,你都可以发现它们。接着它会执行脚本中定义的构建和测试操作;通常脚本中使用的命令与人们在安装和测试中使用的命令完全相同。如果执行成功或失败,CI 服务器会有许多种方式汇报给你,包括在你的代码仓库上显示一个简单的标记。 使用持续集成,每次你合进仓库时,这些改变都会被从头到尾验证。通过这种方式,一旦出现问题你能立即发现。甚至当你准备交付一个产品的新版本时,都不会有延迟或其他必要的额外步骤(在任何时刻都可以交付叫做持续交付)。 本书的示例代码都是在 Travis-CI(基于 Linux 的系统) 和 AppVeyor(Windows) 上自动测试的。你可以在[Gihub仓库](https://github.com/BruceEckel/OnJava8-Examples)上的 Readme 看到通过/失败的标记。