我正在测试詹金斯,看它是否适合我们的构建和测试框架。我发现Jenkins及其可用的插件可以满足我们的大多数需求。除了我似乎无法找到有关如何执行一种特定类型任务的帮助。
我们正在为嵌入式设备创建应用程序。我们需要在这些设备上运行100项测试。如果我们在构建后在一台设备上运行所有测试,那么将需要几个小时才能获得结果。但是,如果我们在100个设备上并行运行测试,则可以在更短的时间内获得结果。
所有测试都将具有非常相似的起点。使用设备的IP地址调用测试脚本以运行测试,并使用用户名/ pw。该脚本将在设备上进行必要的测试,并报告每个测试项目的通过/失败结果。
我认为这样做的漫长/痛苦的方式是在Jenkins中编写100个作业,每个作业将直接是不同的测试脚本(具有上述参数),并使用可用的插件并行运行这些作业。但是,从长远来看,维持所有这些工作将非常困难。
因此,执行此操作的更好方法是创建一个Job(可以将其称为child_tester),该Job可以采用以下参数:测试脚本名称,设备的IP地址,用户名/密码等。然后使用另一个Job(让我们调用) (使用mother_tester)来使用不同的IP地址调用child_tester作业100次,然后并行运行它们。我需要某种方式来累积child_tester作业的每个单独运行的所有测试结果,并将其报告给mother_tester。
我的问题是在Jenkins中是否有插件或完成此任务的任何方式?我研究了名为“ Build Flow”,“ Parallel Test Executor”和“ Parameterized Trigger”的插件的信息。但是,它们似乎不符合我的需求。
我了解您已经研究了Build Flow插件,但是不确定您为什么不使用它。也许您可以指出我的建议中的漏洞。
假设系统中有足够的执行程序来并行运行作业,我认为Build Flow插件和Build Flow Test Aggregator插件可以满足您的要求。
Build Flow插件支持并行运行作业。我看不出Build Flow无法安排您的“子”作业与不同参数并行运行的任何原因。
Build Flow Test Aggregator从Build Flow作业的预定版本中获取测试结果,因此您的“子”作业将需要发布自己的测试结果。
您将需要配置“子”作业,以便可以通过在作业配置中选中“如有必要,执行并发构建”来并行运行。
无论提供与嵌入式设备的连接的任何一组从站,都将需要足够的执行程序来并行运行您的作业。
更新 :具有简单的构建流程定义:
parallel ( { build("dbacher flow child", VALUE: 1) }, { build("dbacher flow child", VALUE: 2) }, { build("dbacher flow child", VALUE: 3) }, { build("dbacher flow child", VALUE: 4) } )
我得到的输出:
parallel { Schedule job dbacher flow child Schedule job dbacher flow child Schedule job dbacher flow child Schedule job dbacher flow child Build dbacher flow child #5 started Build dbacher flow child #6 started Build dbacher flow child #7 started Build dbacher flow child #8 started dbacher flow child #6 completed dbacher flow child #7 completed dbacher flow child #5 completed dbacher flow child #8 completed }
作业历史记录显示所有四个作业都在几秒钟之内安排好。但是作业构建步骤包含人为延迟(睡眠),这将阻止任何单个构建快速完成该工作。
更新2 :这是一个从另一个数据结构动态生成并行任务列表的示例:
// create a closure for the deploy job for each server def paramValues = (1..4) def testJobs = [] for (param in paramValues) { def jobParams = [VALUE: param] def testJob = { // call build build(jobParams, "dbacher flow child") } println jobParams testJobs.add(testJob) } parallel(testJobs)
传递给并行的列表是闭包的列表,这些闭包使用唯一的参数调用构建。我必须确保在闭包函数之外定义作业参数,以确保分别安排作业。