云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

CDN_数据库管理人员_新注册优惠

小七 141 0

在不到三分钟的时间内运行三个小时的Ruby测试

瀑布图像{填料:5px;边框:1px实心#eee;}.瀑布img:第一种类型{右边距:10px;}.瀑布img:最后一个{衬垫顶部:17px;}在Stripe,我们广泛使用自动化测试来帮助确保我们服务的稳定性和可靠性。我们有广阔的对于我们的API和其他核心服务,我们在在每个git分支上持续集成服务器,而且我们从来没有没有绿色部署测验。在过去的几年里,我们的代码库的规模和复杂性都在增长测试套件的大小也是如此。截至2015年8月,我们有1400多个测试定义了将近15000个测试用例和130000个断言的文件。根据我们的CI服务器,如果运行测试,则需要3个多小时顺序。有一大群工程师在等待测试每做一次改变,运行测试的速度关键的。我们过去使用过许多托管CI解决方案,但是当测试运行时间慢慢过去10分钟时,我们带来了内部测试,给我们更多的控制和实验空间。最近,我们实现了自己的分布式测试运行程序把我们测试的运行时间缩短到三分钟以下。同时其中一些策略是针对我们的代码库和系统的,我们希望分享我们在改进测试运行时所做的事情会有所帮助其他工程组织。分叉执行器我们写测试使用minitest,但我们已经实施了自己的插件在多个CPU上并行执行测试不同的服务器。为了在构建中获得最大的并行性能服务器,我们在不同的进程中运行测试,允许每个进程最大限度地利用计算机的CPU和I/O能力。(我们在Amazon的c4.8X大型实例,每个实例提供36个内核。)最初,我们尝试使用Ruby的线程多个进程,但发现使用大量线程比使用多个进程慢得多。这个即使ruby线程只做些什么,速度也会减慢监视子进程子进程。我们当前的运行程序根本不使用Ruby线程。当测试启动时,我们首先将所有应用程序代码加载到一个单独的Ruby进程,因此我们不必解析和加载所有我们的Ruby代码和gem依赖多次。然后这个进程调用fork a产生N个不同进程的次数所有代码都已预加载并准备就绪。然后,这些工人中的每一个都开始执行测试。当他们执行任务时测试时,我们的自定义执行器进一步分叉:每个进程分叉并执行单个测试文件的值子进程中的测试。子进程编写结果通过管道传递给父对象,然后退出。第二轮分叉提供了一层隔离测试之间:如果测试更改了全局状态,则运行该测试在一个一次性过程中,一旦这个过程完成,所有的东西都会被清理干净退出。在每个文件级别隔离状态也意味着开发人员计算机上的单个测试的行为类似于它们在CI中的行为方式,这是一个重要的调试启示。码头工人自定义分叉执行器生成了许多进程,并创建了一个磁盘上的暂存文件数。我们在Stripe内部运行所有的构建这意味着我们不需要担心清理所有的东西这些进程或这个磁盘上的状态。在一个建筑的最后,所有的状态都是内存中的进程或磁盘将被docker停止清理,每时间。众所周知,管理UNIX进程的树是非常困难的可靠的,而且对于一个分叉的系统来说是很容易的这通常会泄露僵尸进程或流浪工人(尤其是在测试框架本身的开发过程中)。使用像Docker这样的集装箱化解决方案消除了这一点很麻烦,而且不需要编写一堆复杂的清理程序代码。管理构建工作人员为了同时在多台计算机上运行每个构建,我们需要一个系统来跟踪当前正在使用的服务器吗哪些是免费的,并将传入的工作分配给可用的服务器。我们在里面做所有的测试詹金斯的;而不是编写自定义代码来管理工作池,我们(ab)使用Jenkins已调用插件矩阵生成插件。matrix build插件是为需要在多个环境中测试项目的"构建矩阵"。为例如,您可能需要针对库的每个版本构建多个版本的Ruby,并确保每个版本都能正常工作。我们通过配置一个定制的构建轴(称为建立角色,并告诉詹金斯构建角色=领导者,构建角色=工作人员1,BUILD\u ROLE=worker2,依此类推。这使得詹金斯为每个生成同时运行N个作业。与一些其他的Jenkins配置,我们可以确保这些构建在自己的机器上运行。用这个,我们可以詹金斯员工管理、调度和资源优势为实现我们维持一个庞大的相同的工人,并为每个工人分配少量工人建造。NSQ公司一旦有一组工人在运行,我们就决定要运行哪些测试在每个节点上。我们之前的几个测试中使用的一种分割工作的策略跑步者要静态地分割测试。你提前决定哪些工作线程将运行哪些测试,然后每个工作线程只运行那些测试开始结束了。这个策略的一个简单版本对每个测试进行哈希运算,并将结果与工人人数相乘;复杂的版本可以记录每次测试所用的时间,并尝试将测试分成总运行时间相等的组。静态分配的问题是它们极易发生对流浪者。如果你猜错了测试需要多长时间,或者如果一台服务器由于任何原因而短暂地变慢,这是非常容易的一项工作要比其他工作完成得快,这意味着要慢一些,效率较低,测试。我们选择了另一种动态方法,即在实时使用工作队列。我们管理使用nsqd的工人实例。nsq是一个超级简单的队列开发时间一点点我们已经用过了在其他一些地方,所以在这里领养是很自然的。使用Jenkins提供的内部版本号,我们将不同的测试运行。每次运行使用三个队列来协调工作:BUILD\u ROLE=leader的节点编写每个测试需要运行的文件测试。