欢迎Wayfair工程爱好者:新老,归来。我们今天聚在一起(实际上)是为了从韦费尔的历史中收集一个故事。我是加里怀特,志愿历史学家,经常工作。我将与大家分享我们作为一个组织采用持续集成的所有历程。这是第二部分的第一部分。在第二部分,我将告诉你在韦费尔建造风筝的故事。在这一部分(第一部分),您将让我沉迷于学习Gitlab CI。我们从哪里开始,好的,坏的,衰退,最终决定放弃我们关键的构建基础设施来做一些新的事情。

git(实验室)init

如今,Git几乎以某种形式出现在每一家公司。像很多公司一样,Wayfair早在git或github流行之前就已经创建了。事实上,在我们有发布工程团队之前(在我们有git服务器之前),我们会通过以下方式进行版本控制:

  1. 从“代码安全”中检出代码
  2. 本地编码,
  3. 将代码签回代码保险箱
  4. 部署

我们使用了一个“可视化源代码安全”,用户签出并锁定了文件,所以在签入之前没有人可以编辑它。在了解了缩放这样一个模型有多难之后,我们使用颠覆. Subversion,如果你从未使用过的话,是一个很好的版本控制工具,很像git,很多公司都已经放弃了它。就像我们现在对新技术所做的那样,我们决定运行一个概念验证,并确保Gitlab是正确的解决方案。

尽管一个真正令人难以忘怀的标志山谷,我们发现Gitlab本身对于我们六年前的组织规模来说是一个很好的工具。

持续整合的整合

在旧的旧部署中,我们将使用FTP脚本(CodeSafe-> FTW)以使用必要的代码更新我们的服务器。在这不会缩放之后,但在我们甚至需要(有?)Gitlab Ci之前,我们使用了一个非常创造性的名为Deploy工具:部署工具。部署工具会将代码安全的变化推入生产中。合并代码到代码安全,部署,不要打破任何东西。

在那些日子里,测试的责任是:

  • 团队,
  • 个人,
  • 或者没有人。

对我们来说,在我们现在认为CI/CD管道和它们一样重要的未来,这是一个突出的问题。虽然部署质量的不一致性现在对我们来说是显而易见的,但它起了一段时间的作用!随着公司规模的扩大,我们越来越清楚地认识到,我们的生产部署需要自动化和质量把关。请记住,这是在我们有任何一个团队只负责监视/管理部署之前。发布工程、培训指挥、人员团队以确保我们部署的质量?这些小组当时并不存在。福克没有在那里合并/运行测试/保持网站24/7。

我们根据我们的需求建立了务实的基础设施,我们必要的部署自动化进入了Jenkins的工作。然后我们在大小和用例中增加,我们需要在部署工具上进行更多的监督和选项。我们继续找到需要统一系统的用例:为Windows应用程序的测试和部署,部署集成和可用性改进,为Windows应用程序进行识别和监控改进,为Python部署,版本控制和审计性,并将所有这些自动化控制到其中我们的开发人员的手,少数。

当我们需要运行个人提交的测试时,发现了我们需要的一个大洞。我们的Jenkins Jobs的套件已经膨胀为一个必须由一个略带创造性的 - 比部署工具名为Tool,Integrator协调的大小。积分器合并在一起的一堆提交,然后运行测试,并部署它们。为这么重型工具接受的工作本身就成为了官僚主义。因此,许多团队将选择运行测试,监控和验证工作代码已经进入生产。

通过让Jenkins作业在主合并之后运行,正如当前使用Integrator的任何人可能都会提到的那样,出现困难的bug是非常常见的。我们还有一个很长的反馈周期,用于扩展和修复integrator中与磁盘填充或过时的基础结构配置相关的问题。我们的队列越来越长,开发人员的体验也越来越差。考虑到这些问题,以及部署交付周期的增长,我们研究了可以挖掘我们的CI选项。

你是什​​么(i)是你得到的

我们需要一种方法来测试我们正在编写的代码,然后再合并到master中。我们需要一个与git和代码分支更紧密集成的解决方案。原来,我们用来存储代码的Gitlab新东西发布了一个集成CI系统.随着它推出的,一些勇敢的开发人员灵魂(BDS)承担了更新Gitlab版本以获取新的CI功能并尝试一下。我想记住下一节,具体而言,这些都是勇敢的开发商灵魂(B)D级s),努力基础设施.

第一个Gitlab跑步者(gitrunners)是针对BDS开发机器的POC。这些dev机器提供给工程师,用于web堆栈开发,或者经常测试Wayfair子网中连接的新功能。这些机器中的GitRunner针对特定的分支运行自动化(单元测试、linting等),而不必将它们一直推到Gitlab和Integrator,并希望一切正常。这允许更快的反馈循环,并且出现了一条显著增强开发人员体验的路径。

然后,我们的BDS团队进一步投入到允许集成器在gitlabci中运行其作业的过程中。在主合并之前,以及在创建集成预合并分支时,许多必要的测试都将针对gitlabci运行。我们有能力运行管道,显示在一个愉快的和可访问的可视化。

我们的团队很高兴,我们的组织在这个新的基础设施上运行了很好。一阵子。慢慢但肯定地,我们的Jenkins和Integrator Debacle类似的线程,我们的构建和部署的交付时间更长且更长。在Jenkins的情况下,我们在应用程序层周围有很少的控制,开发人员会看到填充磁盘,或者缓存未清除。同样的问题揭示了Gitlab代理商,额外的不稳定,Gitrunders没有通过基础设施管理员,而是由WebStack开发人员站起来。

热土豆所有权

一般来说,在解决部署问题时,没有人主动拥有原始Jenkins节点。相反,我们反应下在磁盘填充时清除目录,并将其SSH在机器中进行热固定。我们的一些Jenkins因此,我们的需求与开发人员和组织中的需求脱颖而出。我们搬到了Gitlab CI,因为我们希望建立我们的工作流程和必要的修复我们“拥有”的基础设施。

我们从未在特定团队中指定正式的所有权参数、SLA、随叫随到轮换、票证时间或组织一致性,以确保在将Gitlab CI用于部署块时获得高质量的开发人员体验。在某一点上,它依赖于两个节点,没有以任何有意义的方式进行标记(无法知道它们实际做了什么),完全是为了部署生产应用程序的关键过程。如果任何一个节点发生故障,组织中都会有少数人知道是什么让部署处于暂停状态。

这并不是说没有人愿意站起来维护自己的进程。确实有工作流量委托到章鱼,RAN Docker,Docker编写以及需要最少维护的Python工作流程。维护和使用这些工作流程的团队有时愿意拥有这些维护任务,并被赋予他们对他们执行的手段。大多数组织都使用了足够大的应用程序,即没有专门团队维护共享基础设施的申请变得不可行。

较小的应用程序可以创新和解决自己的问题。在集成商和生产部署(用于我们最大的应用程序)的情况下,我们需要一个或多个团队来协调努力。在一点,开发人员经验遭受了如此严重,一个常见的问题流动是:

  • 签入monorepo存储库
  • 运行状态检查(可能需要0.75-1.5小时才能分配和运行一个工作进程)
  • 在测试运行和基本分支过期时,找出部署出去了
  • 合并主控形状
  • 再次运行状态检查
  • 找出你无法加入部署火车,因为你开始的大师改变了

这是一个循环。该循环将阻止人们信任我们的过程,或者想要经常提交代码。更长的生活支舍放大了测试失败的可能性,因此这些测试将失败更频繁.这是我们如何进入Gitlab和Gitlab CI的决策点的一个例子。

然后,突然,GitHub!

虽然这些问题正在发生,并且随着我们开始组织稳定Gitlab和Gitlab CI,Github进入了图片。Gitlab CI在SEV之后导致SEV,我们看到甚至能够检查代码。GitHub提供了许多好处,但我与同事交谈的最佳求和是:

“GitHub将终止您的请求以保持活动状态,Gitlab将终止自身以使您的请求保持活动状态”

在与Gitlab相关的其他原因中,我们最终决定进行切换,这给了我们一个选择。我们是保留Gitlab CI,还是搬到别的地方?

那是我们将在下周留下这个线程的地方。谢谢你的阅读,我希望你喜欢它。如果您有疑问/评论/反馈/想法,请随时让我一行gwhite@wayfair.com..