问候Wayfirt工程爱好者:旧,新,并返回。我们今天收集(实际上)收集来自Wayfair历史的故事。我是Gary White,志愿者历史学家,常客。我将与您分享我们作为一个组织采用持续整合的所有旅程。这是两个之一。在第二部分,我会告诉你在Wayfair的艺术家的故事。在这部分(一个)中,你会沉迷于学习Gitlab CI的学习。在我们开始,好的,坏,衰退和最终决定废除我们关键的构建基础设施做一些新的事情。

git init(实验室)

这几天,Git在某种形式中以某种形式的一家公司。像许多公司一样,在Git或Github达到普及之前,Wayfirir很久就创造了。事实上,在我们有一个释放工程团队(以及我们有一个Git服务器之前)之前,我们将通过以下方式进行控制:

  1. 查看“代码安全”的代码
  2. 在本地代码,
  3. 检查代码返回代码安全
  4. 部署

我们使用了一个“视觉源安全”,其中用户检查并锁定文件,所以没有人可以编辑它直到它被选中。在学习缩放这样的模型时,我们正在使用颠覆。颠覆,如果您从未使用过,则是一个很好的版本控制工具,就像许多公司随着时间的推移而被删除的Git。正如我们甚至现在都与新技术一样,我们决定运行概念证明,并确保Gitlab是正确的解决方案。

尽管一个真正令人难以令人忘怀的徽标谷,我们发现Gitlab本身是我们大约六年前的组织规模的精细工具。

整合持续集成

在以前的部署中,我们将使用ftp脚本(codesafe->ftp ftw)用必要的代码更新服务器。之后就不能伸缩了,但在我们需要(已经?)之前。Gitlab CI,我们使用了一个非常有创意的部署工具:部署工具。部署工具将把安全代码中的更改推送到生产环境中。合并代码到代码安全,部署,不破坏任何东西。

在那些日子里,测试是在ONU上的:

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

对我们来说,在未来,我们现在看到CI / CD管道同样重要,这是一个辉煌的问题。虽然部署质量的不一致现在对我们来说是明显的,但它有一段时间了!随着我们组织的规模增长,它越来越明显,我们需要自动化和质量门检查我们的生产部署。请记住,在我们有任何一个团队的人只能监控/管理部署之前,这很好。发布工程,火车指挥,人团队,以确保我们部署的质量?这些团队当时并不存在。Foks不在那里合并/运行测试/保持网站上24/7。

我们根据我们的需要建立了实用的基础设施,并且我们很多必要的部署自动化进入了Jenkins的工作。然后我们增加了规模和用例,我们需要对部署工具进行更多的监督和选择。我们继续发现需要一个统一的系统用例:识别和监控改进测试和部署,部署集成和Windows应用程序的可用性改进,对于python的部署,版本管理和审核我们的管道,并将控制我们的自动化的开发人员,等等。

当我们需要为单个提交运行测试时,我们的需求中发现了一个大漏洞。我们的詹金斯·乔布斯团队已经扩大到一个规模,必须借助一个比部署工具更有创意的工具来协调,这个工具名为Integrator。集成者将一组提交合并在一起,然后运行测试并部署它们。让乔布斯接受这样一个沉重的工具,本身就是一种官僚作风。因此,许多团队会选择运行测试、监视和验证工作代码已经进入了生产环境。

通过让Jenkins作业将在我们有主合并后运行,因为目前使用Integrator可能有关的任何人都可以联系起来,因此难以出现的错误是非常常见的。我们还有一个漫长的反馈周期,用于缩放和修复与填充磁盘相关的集成商中的问题或过时的基础架构配置。我们得到了更长且较长且更长的队列,开发人员体验变得更糟,更糟糕而且更糟。通过这些问题,以及部署的提前时间生长,我们调查了可以挖掘我们的CI的选择。

你所得到的就是你所得到的

我们需要一种方法来获得我们在掌握掌握之前进行测试的代码。我们需要一个更紧密地与Git集成的解决方案,以及我们的代码分支。事实证明,我们使用的新Gitlab用于存储代码正在发布集成CI系统。随着它的推出,一些勇敢的开发者灵魂(BDS)承担了更新Gitlab版本的任务,以获得新的CI特性并试用它。下一节我想特别指出,这些人很勇敢开发人员灵魂(B.D.,工作基础设施

首先Gitlab跑步者(Gitrunders)是针对BDS Dev机器的POC'd。这些DEV机器被提供给工程师,并用于Web Stack开发,或者经常用于在Wayfair子网中连接的新功能。这些机器中的Gitrunners对特定分支的自动化(单元测试,暗示等),而不是必须一直推向Gitlab,以及集成商,并希望一切效果。这允许更快的反馈循环,并且出现了一条路径,以提高开发人员体验。

然后我们的BDS团队进一步投入了允许集成商在Gitlab CI中运行它的工作的过程。在主合并之前,创建Integrator Pre-Merge分支时,将对Gitlab CI运行许多必要的测试。我们有能力运行愉快和可观的可视化中显示的管道。

我们的团队很高兴,我们的组织在这个新的基础架构上运行得很好。一段时间。缓慢但稳定地,类似于我们的Jenkins和Integrator崩溃,我们的构建和部署的交付时间越来越长。在Jenkins的例子中,我们在应用程序层的控制非常少,开发者会看到磁盘被填满,或者缓存没有被清理。同样的问题也暴露在了Gitlab的代理上,伴随着额外的不稳定性,gitrunners不是通过基础设施管理员建立的,而是由webstack开发人员建立的。

热的Potatzhiper

一般来说,当需要修复部署问题时,没有人对原始Jenkins节点的主动所有权。相反,我们反应性地当磁盘填满时清理目录,并通过ssh到计算机进行热修复。因此,我们的一些Jenkins与我们作为开发人员和组织中的需求脱节了。我们搬到Gitlab CI是因为我们想在我们“拥有”的基础设施中构建我们的工作流程和必要的修正。

我们从未指定正式的所有权参数,SLA的呼叫旋转,票务时间或在特定团队中的组织对齐,以确保使用Gitlab CI进行部署块的质量开发人员体验。在一点,根据两个节点,不以任何有意义的方式标记(无需告诉他们实际上所做的),完全是部署我们的生产应用的关键过程。如果任一节点下降,组织中有一位少数人甚至会理解持有的部署是什么。

这并不是说没有人愿意站出来维护他们自己的流程。确实存在委派给Octopus、运行Docker、Docker Compose和Python的工作流,这些工作流需要最少的维护。维护和使用这些工作流的团队有时愿意拥有这些维护任务,并被给予在这些任务上执行的方法。大多数组织都使用足够大的应用程序,因此在没有专门团队的情况下维护共享基础设施变得不可行的。

较小的应用程序可以创新并解决它们自己的问题。在集成器和生产部署的情况下(用于我们最大的应用程序),我们需要一个或多个团队来协调工作。在某一时刻,开发人员的体验受到了严重的影响,一个常见的问题流程是:

  • 登记到Monorepo存储库
  • 运行状态检查(可以从.75-1.5小时内使用,以获得分配和运行的工人)
  • 找出在测试运行和您的基本分支过时时部署已经发出
  • 合并主人
  • 运行状态再次检查
  • 发现您无法加入deploy train是因为在开始时master发生了更改

这是一个循环。这种循环会使人们不再信任我们的流程,或者不愿意频繁地提交代码。较长的分支寿命放大了测试失败的可能性,因此这些测试将会失败甚至更频繁。这是我们在Gitlab和Gitlab CI问题上做出决定的一个例子。

然后,突然,github!

当这些问题发生时,当我们开始围绕着稳定Gitlab和Gitlab CI进行组织时,GitHub也加入了进来。Gitlab的CI导致了一个接一个的SEV,我们甚至在代码签入方面都发现了问题。GitHub提供了很多好处,但在与其他工程师的交谈中,我得到的最好总结是:

“GitHub将杀死您的请求保持活力,Gitlab将杀死自己以保持您的要求”

除了与Gitlab相关的其他原因之外,我们最终决定制作开关,使我们留下了一种选择。我们保留gitlab ci,还是搬到别的东西?

这就是我们下周要讨论的话题。谢谢阅读,我希望你喜欢它。如果你有问题/评论/反馈/想法,请随时写信给我gwhite@wayfair.com