常青持续集成:为什么我们要重新发明车轮

||cigolang

我们都有过这样的经历:当你正在推销一个解决方案时,你的一个团队成员插话说:“我们不要在这里白费力气了。”无论是出于恐惧还是出于智慧,对创新的指控都是对创意的死刑判决。通常不值得花费时间和资源来实现一个旧的、普遍存在的想法的新版本——尽管你永远不会知道你每天使用的所有不同类型的实际的、字面上的轮子。

对于大多数开发人员来说,持续集成(CI)——将新代码自动构建和测试推入存储库——是一种永远不会重新发明的车轮。你建立了一些长期的解决方案,比如特拉维斯詹金斯,重新调整您的测试代码以适应该解决方案的组织模型,然后避免对其进行过多的修改。在MongoDB188金宝搏手机客户端安卓下载,挑战这种方法给了我们极大的回报。

我们没有围绕一个不符合我们需求的现成解决方案工作,而是重新发明了轮子,并构建了我们自己的持续集成系统Evergreen。它为我们提供了一个强大、高效的基础架构,让我们能够快速测试更改——同时也让我们的工程师感到高兴。我们创建Evergreen的过程是出于需要和不确定性,但我们并不后悔。重新发明轮子使我们能够为我们的用例构建一个近乎完美的CI工具,认真地评估强大的新技术,并从中获得很多乐趣。

我们是怎么走到这一步的?

与大多数科技公司一样,我们将持续集成作为我们开发实践的基石。而且,与大多数科技公司一样,持续集成一直让我们很头疼——事实上,更像是一种令人心悸的偏头痛。大多数CI用户只需要在单个操作系统、单个机器架构和单个堆栈上测试代码。在Mo188金宝搏手机客户端安卓下载ngoDB,我们需要确保代码库在许多不同的操作系统和架构组合上运行(现在,我们在50多个配置上测试)。一个更罕见和更难的问题是:我们有近20个小时的测试要进行每个平台如果我们真的想验证构建的正确性。以我在其他公司的经验来看,即使是两个小时来测试一个变化也会是永恒的。今天,尽管有这些限制,我们能够快速得到关于代码库状态的全面反馈。我们积极地迭代并自信地发布。

情况并非一直如此。在MongoDB的早期,我们依赖于188金宝搏手机客户端安卓下载BuildBot作为我们选择的CI系统。当我们的团队由六个工程师组成时,BuildBot是有效的,它允许我们同时监控多个平台上构建的正确性。但是当我们雇佣了更多的人,提交和新测试的流量就会增加——系统就会开始崩溃。BuildBot的工作方式是在一组buildslaves上运行提交任务。如果在运行前一个提交的测试时出现多个提交,则更改将排队,下一次运行可能是测试多个提交。这意味着无论何时测试失败,您都不需要知道是哪个提交导致了它。

了解失败的根源与了解失败的原因同样重要。通过将测试扩展到每晚和每周的套房,我们成功地控制了这一点。虽然这使得单次提交的周转速度更快,但它引入了一个全新的问题,即从周一开始不知道提交会破坏一个模糊的复制测试,直到周六下午。我们的工程师花了太多时间调试服务器代码和构建机器人配置。发布变成了一个长达数周的过程,提交了几个小的错误修复,然后我们坐了一个下午,流汗,等待测试来验证它们。我们需要一个新的方法。

我们梦想的CI工具

所以我们就去找。我们梦想中的CI系统是一种工具,它可以将我们从束缚开发人员的各种限制中解放出来。首先,由于MongoDB运行在188金宝搏手机客户端安卓下载如此多的地方,它必须支持广泛的架构和操作系统。其次,我们厌倦了由于提交堆积而导致的长构建队列,因此新系统将需要分配弹性机器以满足需求的能力。

像Jenkins这样的工具在很多事情上都做得很好,但是有了Evergreen,我们可以做一些非常出色的事情。

许多工具都在不同程度上提供了其中的一些特性,但没有一个工具提供了所有的特性。为我们提供最多平台灵活性的解决方案是闭源的或太慢;最具弹性的解决方案只有有限的平台支持。最好的选择是将CI平台上的多个可能不兼容的插件粘在一起。但实施这样一个系统的现实比它看起来要复杂得多。虽然Jenkins的插件允许我们定义复杂的测试依赖结构,支持预提交测试,并允许在EC2机器上进行并行,但这些插件通常并不总是能够很好地相互协作。

这样的解决方案无疑仍需要多名全职工程师。引用我们的首席技术官Eliot Horowitz的话:“我们尝试了很多选择:Buildbot、Jenkins、Bamboo,但没有一个能够满足我们的需求。许多平台和配置的结合,加上并行化,加上EC2,加上静态主机,加上补丁构建,这是我们在任何地方都找不到的。我们非常努力地想从货架上买一些东西。”

无论我们选择什么,要让事情有效地工作,都需要大量的工作和新代码。但我们意识到,构建一个内部CI工具来测试MongoDB本身对于一个小的工程师团队来说是可行的——甚至可能是维护我们科学的现成解188金宝搏手机客户端安卓下载决方案的小团队。考虑到这一现实,我们选择将我们的时间和资源花在自己的CI工具Evergreen上。(我们随后扩展了Evergreen的用途。它不仅测试MongoDB,还测试了几188金宝搏手机客户端安卓下载个驱动程序,我们的指南针产品,甚至Evergreen本身)。

Evergreen UI的特写

Evergreen UI的特写

Evergreen在设计时考虑到了动态并行化:我们可以在需求高时自动启动主机,在需求消失时让主机退役,这让我们可以在构建时实现几乎无限的并行化。我们自制的CI工具使我们能够在提交之前轻松地提交更改集用于测试配置的任何子集,在几分钟内获得数小时的测试反馈——所有这些都不会中断我们对提交代码的常规测试。而找出BuildBot的指责者到底是哪些提交破坏了构建的日子也一去不复返了:如果Evergreen跳过了几次提交,然后测试失败了,Evergreen就会反向测试之前的提交,以便准确地指出哪一次提交有问题。没有更多的猜测;没有更多的本地git bisect。

通过并行化,我们可以在工程师可以使用的时间框架内完成对单个配置的所有测试。例如,我们的一个Red Hat Enterprise 6.2配置串行运行需要超过17个小时,但Evergreen可以在不到3个小时内完成这项工作。

Evergreen的调度模型使主机在规定的时间内完成任务。当在一个主机的生命周期内运行多个任务时,我们的算法会考虑任务的优先级和依赖关系,因此我们会有复杂的依赖管道高效的并行化。并不能保证我们能够通过将Jenkins社区中独立用户开发的插件之间的系统连接起来来实现这样的功能。像Jenkins这样的工具在很多事情上都做得很好,但是有了Evergreen,我们可以做一些非常出色的事情。在构建自己的系统时,您不必为最需要的特性做出妥协。

一个失败的任务

一个失败的任务

作为CI解决方案,Evergreen取得了巨大的成功。在一个典型的工作日,我们的系统利用数百台弹性机器运行数千小时的测试,总计超过200万个离散测试结果。我们在几个小时内运行了几天的测试,这意味着我们的工程师可以从他们的代码中得到反馈,并进行前所未有的迭代。我们对代码库的状态有一个全知的视角。

要走的路

但除了用于构建和测试代码之外,Evergreen还给了我们一个评估的机会.我们从一开始就知道Go,受到它的静态编译、多平台支持和并发原语的诱惑。2013年,当艾略特创建了一个简单的概念验证(最终成为Evergreen)时,它既是对Go的一次实验,也是对动态测试基础设施的一次实验。

我们进入CI工具的世界并没有带来太多技术上的好处:它给我们带来了很多乐趣。

我们知道Go可以支持MongoDB运行的许多平台。188金宝搏手机客户端安卓下载我们相信它的并发原语将帮助我们快速和简单地开发分布式体系结构。是时候把我们的测试放在嘴边了。自定义CI工具是一个足够小的项目,一个团队可以在几个月内完成一些工作,但又足够大,可以为Go语言提供广泛的、现实的尝试。

Go的杀手特性之一是静态编译。它允许我们将所有的代理代码和库编译成一个二进制文件,这样我们就可以在所有的测试主机上运行无依赖的代理程序。任何必须在构建机器上管理Python库依赖项或Java vm的人都知道这是多么方便。

静态编译和跨平台支持的共生关系比我们所希望的要好。例如,当我们向MongoDB添加对PowerPC和zSeries芯片188金宝搏手机客户端安卓下载等更奇异的架构的支持时,让Evergreen代理在这些新机器上运行已经成为这个过程中最简单的部分。利用Go对交叉编译的广泛支持和几乎通用的GCCGO编译器,我们的代理只是工作

在构建Evergreen的过程中,Go证明了自己是如此有用,以至于我们继续使用它来重写我们的云代理和MongoDB工具(mongodump, mongoimport等)。188金宝搏手机客户端安卓下载我们对围棋的采用就像在软件开发的卡丁车比赛中隐藏的捷径;1888bet亚洲体育188金宝慱官网下载如果我们没有给自己重新发明轮子的许可,我们就会错过它。如今,Go是MongoDB工程师在解决新问题时最先使用的工具之一。188金宝搏手机客户端安卓下载

Go gopher由Renee French设计,版权受知识共享署名3.0许可

Go gopher由Renee French设计,版权受知识共享署名3.0许可

最后,值得一提的是,我们进入CI工具的世界并没有带来太多技术上的好处:它带来了大量的乐趣。虽然这看起来微不足道,但我保证不是。当工程师有一些有趣的工作时,他们会更快乐,写出更好的代码,工作速度也更快。制作常青树是一件很有趣的事。它结合了建立和运行分布式系统的兴奋感,使事情变得更快,并真正地帮助我们的同事处理他们正在做的事情。

更重要的是,这项事业甚至不需要太多的投资。Evergreen是一个小团队(每次不超过3或4人)在过去3年的产品,许多工程师同时从事其他项目。但作为一家公司,我们获得了不可思议的价值,也学到了一些重要的东西:当处理新问题时,不要害怕从头开始。你可能会从中得到比最终产品更多的东西。

如果你想看到它的运行,我们的构建可以在evergreen.188金宝搏手机客户端安卓下载mongodb.com.去年,我们将Evergreen作为开源软件发布,目标是与与我们处境相似的团队合作。1888bet亚洲体育188金宝慱官网下载加入我们吧,我们将继续让Evergreen变得更强大,更一般化,并在不久的将来成为Jenkins和Travis等工具的有力竞争对手。如果您有任何问题,请通过erf@mongodb.com与我联系。188金宝搏手机客户端安卓下载