如何与Jenkins并行多次运行相同的作业?

时间:2015-02-24 20:04:01

标签: jenkins parallel-testing

我正在测试Jenkins,看它是否适合我们的构建和测试框架。我发现Jenkins及其可用的插件符合我们的大部分需求。除了我似乎无法找到如何做一种特定类型的任务的帮助。

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

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

我认为这样做的漫长/痛苦的方法是在Jenkins中编写100个作业,每个作业将直接使用不同的测试脚本(使用上述参数)并使用可用的插件并行运行。但是,从长远来看,保持所有这些工作将是非常困难的。

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

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

2 个答案:

答案 0 :(得分:12)

我知道你已经查看了Build Flow插件,但我不确定你为什么要解雇它。也许你可以指出我提案中的漏洞。

假设您的系统中有足够的执行程序来并行运行作业,我认为Build Flow pluginBuild Flow Test Aggregator plugin可以执行您想要的操作。

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

传递给parallel的列表是一个闭包列表,它使用唯一参数调用构建。我必须确保在闭包函数之外定义作业参数,以确保单独调度作业。

我在Jenkins邮件列表上的另一个answerthis thread处理了语法。

答案 1 :(得分:3)

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