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

Ash*_*Ash 10 parallel-testing jenkins

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

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

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

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

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

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

Dav*_*her 12

我知道你已经查看了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) }
)
Run Code Online (Sandbox Code Playgroud)

我得到输出:

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 
}
Run Code Online (Sandbox Code Playgroud)

作业历史记录显示所有四个作业都在几秒钟内安排.但是,作业构建步骤包含一个人工延迟(睡眠),可以防止任何单个构建快速完成.


更新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)
Run Code Online (Sandbox Code Playgroud)

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

我在Jenkins邮件列表上的另一个答案这个帖子中抄写了语法.

  • @Ash,您能否验证您的 Freestyle Test1 作业是否配置为“执行并发构建”?看起来这项工作对我来说是并行执行的,所以我所能做的就是猜测对你来说有什么不同。 (2认同)