2015-02-24 48 views
7

我正在测试Jenkins以查看它是否适合我们的构建和测试框架。我发现詹金斯及其可用插件适合我们的大部分需求。除了我似乎无法找到如何执行某种特定任务的帮助。如何与詹金斯并行多次运行相同的工作?

我们正在为嵌入式设备创建应用程序。我们有100个需要在这些设备上运行的测试。如果我们在构建完成后在一台设备上运行所有测试,则需要几个小时才能获得结果。但是,如果我们在100个并行设备上运行测试,那么我们可以在更短的时间内获得结果。

所有的测试都有非常相似的起点。使用设备的IP地址来运行测试脚本,并使用用户名/ pw调用测试脚本。该脚本将在设备上进行必要的测试,并为每个测试项目报告回传/失败。

我觉得这样的长/痛苦的方式是写在詹金斯100个职位,每个将是一个不同的测试脚本直接(与上述参数)和并行使用可用的插件运行这些。然而,从长远来看,保持所有这些工作将非常困难。

因此,更好的方法是创建一个可以带参数的Job(我们称之为child_tester),例如:测试脚本名称,设备的IP地址,用户名/ pw等等。然后使用另一个作业(让我们称之为mother_tester)用不同的IP地址调用child_tester作业100次并且并行运行它们。我需要一些方法来累积child_tester作业的每个单独运行的所有测试结果,并将它们报告给mother_tester。

我的问题是有一个插件或在詹金斯完成此任何方式?我查看了名为“Build Flow”,“Parallel Test Executor”和“Parameterized Trigger”的插件信息。但是,他们似乎不符合我的需求。

谢谢你的帮助。

回答

10

我知道你已经看了到构建流程插件,但我不知道为什么你被解雇了。也许你可以指出我提案中的漏洞。

假设你的系统中有足够的执行器并行运行作业,我认为Build Flow pluginBuild Flow Test Aggregator plugin可以做你想做的。

  • Build Flow插件支持running jobs in parallel。我没有看到任何理由为什么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) 

平行传递的列表被调用构建封闭件的列表具有独特的参数。我必须确保在关闭功能之外定义作业参数,以确保作业将分开计划。

我在Jenkins邮件列表中挑选了另一个answerthis thread的语法。

+0

当并行运行相同的作业名称时,构建流程插件不起作用。例如,我的生成流看起来像这样: 平行( {建立( “FreestyleTest1”)}, {建立( “FreestyleTest1”)} ) 然而,在这种情况下,输出的样子: 平行{ 附表工作FreestyleTest1 安排工作FreestyleTest1 构建FreestyleTest1#29开始 构建FreestyleTest1#29开始 FreestyleTest1#29完成 FreestyleTest1#29完成 } 作业只运行一次。如果我要将其中一项工作改为另一项工作,那么它们都会并行运行。 – Ash 2015-02-24 23:22:18

+0

@垃圾,有趣。在构建流程0.16的Jenkins 1.580.2中,我可以使用不同参数计划4次相同的子作业,并且子作业同时运行4次。 – 2015-02-25 00:08:33

+0

谢谢你的例子和细节。我发现如果我为子作业提供不同的参数/值,那么实际上会执行多个子作业。它可能是一个插件错误。但是,工作仍不能平行进行。防爆输出:平行{ 安排工作FreestyleTest1 安排工作FreestyleTest1 构建FreestyleTest1#36开始 FreestyleTest1#36完成 建立FreestyleTest1#37开始 FreestyleTest1#37完成 } .....詹金斯状态板上显示,37正在等待在36节结束时,即使节点有2个以上的执行器空闲。 – Ash 2015-02-25 00:58:56

1

请确保管理Jenkins - >管理节点设置中的执行者数量多于MultiJob项目中单个作业的数量。 默认情况下,我猜它是2.因此,我们需要增加它。