|
容器已经占领了整个世界,我,作为这个世界的一员,对这个新的容器“霸主”表示热烈的欢迎。
然而,目前它们确实给我以及我所在 Rioter 的 Pipeline Engineering 团队带来了非常有趣的挑战。我的名字叫Maxfield Stewart,我是 Riot 的一名工程师。我的团队专注于构建流水线——包括各个方面,从代码检测到归档文件部署,有时还有其他方面。如果持续交付(continuous delivery)是一首主题曲,那么我们就是在用阿卡贝拉风格吟唱它。因为我们采用了类似云的环境来管理 Riot 一个最大的内部服务器群组和虚拟机集群。我们最大的阻碍就是“构建群组”——这在几年前只是一个构建英雄联盟(League of Legends)游戏客户端的小集群,但是,现在已经是一个聚集了物理机和虚拟机的庞大“怪物”。
最近,我们快速的在这个复杂的环境中添加了Docker容器。我们是如何将容器与经典的构建群组栈(一个越来越像基于云的自服务工作引擎)进行整合?我们是否能够使用Dockerfiles来定义构建环境,并与我们通用的一些开源架构进行整合?我们是否能够摆脱传统的虚拟机云而拥抱一个容器的未来?
在很长一段时间内,类似这样的问题不胜枚举,就像是 Ashe(译者注:寒冰射手艾希,英雄联盟中的一个英雄)的箭。在这一系列的博文中,我将向大家介绍我的团队是如何走过并尝试解决这些问题的。在第一篇博文中,我提供了一些相关的背景来说明我们是从什么地方过来的以及为什么我们想这么做。在后续的文章中,我将分享一些我们在解决 Jenkins 与Docker相关问题的具体方法。这些教程的第一篇是基础介绍,你可以在这里找到。如果你对学习使用容器创建构建群组、激发持续交付、让工程师更快的交付感兴趣,那这一系列文章就非常适合你。但是请做好准备:在这段时间内,我将由浅入深的介绍相关的内容。同时,我也希望这个系列能成为一个非常好的对企业级Docker的介绍。
首先,回到一年前,我们在英雄联盟中引入持续交付。在这之前,我们努力为英雄联盟的玩家提供一个有规律的发布,但是我们的工具总是出问题。所以我们投资于自动化——从构建流水线(pipeline)到测试环境的创建,并在转换中获取巨大的收益,包括一致性交付,构建时间及团队完成整体工作的能力。英雄联盟从一天几次可行构建提高到每天30次构建。
一次英雄联盟的构建绝对不是开玩笑的。它包含了超过150个独立的任务,需要构建我们所关心的每个英雄联盟的特征。构建包括各种形式和尺寸,从传统的调试构建到各种形式的未来内容构建,还包括全球合作者,如腾讯(Tencent)和竞舞台(Garena)。我们能够追踪每一次构建,它去了哪儿,它会部署到什么样的测试环境,它运行了什么测试,PBE(公开测试服)以及有几个点击按钮的产品。我们实现了可以通过几个按钮就能创建测环境,我们能在几周内将20个内部测试环境提高到70个以上。我们超过了450台虚拟机!更甚的是,英雄联盟的代码只是我们构建的一小部分,该群组运行了超过 3,300 个构建任务,支撑了 Riot 的所有工程团队。
然而,这个过程仍不完美:有时一些老的工具需要垫片和桥来保证所有的软件共同工作。在向持续交付的迁移中,我们总结了四条基本原则,这些原则至今仍然保留着:
我们认为工程团队必须能够完整的拥有他们自己的技术栈,构建环境的控制权需要下放到管理级别。
我们认为配置和代码同等重要。在任何可能的时间里,团队都应该维护他们的构建流水线以及源代码控制环境。
我们相信每次工程师执行一次构建,他们需要在部署配置中创建一个可交付的版本。一次“构建”不仅仅是代码编译,它是一套完整可部署的归档文件。
我们认为交付是一个产品决策。产品团队在按下按钮的地方,需要能够部署和看到最新的可交付版本。
为了实现这些目标,我们需要一个世界级的技术栈来实现这一系列的概念。我们第一个选择是从头开发一套完整的自己的构建工具。第二个选择是购买其他人的的构建工具来完成任务。第三个选择是使用开源项目,然后定制解决方案以满足我们的需求。
我们选择了第三种方案。这篇文章中我不想比较和对比各种 CI 工具。但是,我们最终认为使用开源工具并对它进行修改以满足我们的需求是一种最好的折中选择:既有大的开放式合作群体,又能自由轻易地做适当的修改。
结果,我们的技术栈在完成这项任务上出乎意料的简单:
Jenkins (开源版本)
Jenkens插件 Job DSL
Jenkeins插件 Build Flow plugin
工程师创造性的组合我们的各种组件
由于 Jenkins 的灵活性及开源特性,并且能够很轻松的完成许多基本的构建操作,所以我们选择并一直使用 Jenkins。从一个较高的层次来分析,Jenkins 能够很容易的创建一次满足我们持续交付的需求的流水线构建(如上所述)。作为一个被广泛使用的开源工具,我们也有一个充满活力的社区,并与之合作。相对于从头开始开发定制工具,工程团队可以使用开放的标准实现。这个非常有帮助,但是也存在风险。这些标准不断进步,这样技术就成为了一个移动的目标:昨天还是非常好的一个主意,可能明天就成为一个坏主意了。但是,只要将正确选择插件和一些简单工程诀窍相结合,我们就能用非常小的代码和配置,以非常小的代价来实现全自动化的持续交付链。
但是,Docker的作用在什么地方?让我们回到上面提到的持续交付的其中一条核心原则。最近,我团队攻克的一个挑战,就是每个人可以拥有自己的构建环境。在这之前,我们评估一些工具,类似于 Packer.io,这些工具可以让工程师为他们的虚拟机定义单独的镜像,然后给指定的产品团队设置群组的根访问权限来设置安全屏障。我们本质上是设计了一套通过工作流引擎包装内部云的系统,在这里指的是 Jenkins。我们探讨了常用的配置管理选项(如 Puppet 和 Chef)来补充虚拟云的解决方案,以便工程师能控制这些机器。
这时候Docker出现了
有一件事情变得非常明显:相比我们所拥有的其他任何工具,我们能够更容易的维护一份Dockerfile文件。容器,我们已经对它有了一段时间的了解,通过Docker,我们能够轻易实现上面的功能。如果能将我们构建环境所有权的方式与Docker的Dockerfiles概念相结合,我们将进入工程的天堂。
一个Docker/Jenkins 配置模型
Docker是一个非常优秀的解决部署问题的工具。虽然我们这里的重点是如何用它来辅助工作流引擎,构建系统和流水线,但是我们也很快的将它作为部署的工具和方法来熟悉。Riot 运行许多微服务和容器+微服务,有点像花生黄油和巧克力。由于Docker已经成了一种“事实(tm)”,我们也开始对其进行更进一步的探索,看它是否也能解决其他问题。
Pipeline Engineering 团队的梦想变得非常明显:我们想创建一个流水线生成器,它能够对给定技术的框架代码实现动态的螺旋式持续交付流水线,这本质上是一种根据需要的按键式构建环境。以前,我们是自动调节虚拟机,现在,我们相信能够使用Docker容器来创建完整的构建流水线。
需要清楚的是,Docker不是一个完美的整体解决方案。它还不能解决 Windows 环境下的构建问题,它可能也解决不了 OSX 下的构建问题。也不是每个我们现在使用的工具都表现的很好,或者是能考虑作为其他平台的选择。但是,Docker在 Linux 下为我们在问题的解决上带来了巨大的飞跃。在 Riot,我们在平台和后端的工程上做了大量的工作。几乎所有的功能,包括微服务上的核心后端服务几乎都运行在 Linux上。因此,提高解决方案的空间是非常值得花时间的。
我们已经开始探索Docker,并将其加入到当前的构建栈中,也获得了一些早期的胜利。我们在 Jenkins 的开发环境中创建一个按钮来将其部署到容器中,以此来提高我们所做的所有测试和调试。一开始,我们使用容器来运行一个小的群组(大约 500 个任务)作为构建环境,使用它们的团队获得关于自身的正面反馈,并提高了迭代速度。事实上,我们已经看到如下的一些结果:
创建基于 Linux 的微服务和网站的工程师们,现在可以通过程序的方式来定义自己的构建环境。
工程师在本地构建环境中的工作方式可以与构建群组上的工作方式保持一致(在以后的博客中我会教你怎么做这件事情)。
动态分配资源,这意味着我们可以整体上减少计算机资源的消耗,从而获得更好的经济效益。
一台虚拟机可以同时为四个不同的团队和300+构建任务(这些工作以前需要8台不同的虚拟机来处理)提供服务。
总的来说,这篇博客只是这一系列深入这些主题的一个简介。该系列将根据其进度覆盖多个领域,这些教程的大部分文章都会包含示例和源代码。开始,我们将看一下如何通过Docker来部署 Jenkins,其中包含了一些经验教训和最佳实践。我们通过真实的应用作为示例,能够为你掌握Docker的基本原则建立坚实的基础。接下来,我们将会探索容器构建环境的一些选项以及我们在 Riot 中经历过的几件事情,但这不属于大规模 Jenkins 生态系统的一部分。最后,我们跟随着 Pipeline Engineering 团队来探索实现整体目标的最终方式,并探究我们创建或一路过来修改的工具。
作为它的核心,这一系列的主题是流程。正如之前所述,我们知道我们想要什么:使用Docker容器的开发团队自定义构建环境,并拥有和维护自身的一份Dockerfile文件。我们想要预先为已知技术栈生成构建流水线,这样团队就可以运行他们第一天创建的代码库中的程序,以保证持续交付。对于如何完成这些功能,我们已经有了一些想法,但是我们的过程是不断迭代和发现的,这篇博客将会跟进整个过程。
我们的目标是与更广阔的世界来分享我们的发现以及遇到的困难。我在这里写下的许多东西真的不是什么大秘密,但是确实也很难在一个地方发现。我希望这个系列能回馈给社团,同时作为回报,我们能够获得对我们采取的方式的评论和意见。通过对话,我们能学到更多的东西!
via:杰微刊
相关阅读:如何构建英雄联盟这样的毫秒级游戏
声明:游资网登载此文出于传递信息之目的,绝不意味着游资网赞同其观点或证实其描述。
|
|