一尘不染

如何与詹金斯并行执行同一作业多次?

jenkins

我正在测试詹金斯,看它是否适合我们的构建和测试框架。我发现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”的插件的信息。但是,它们似乎不符合我的需求。


阅读 172

收藏
2020-07-25

共1个答案

一尘不染

我了解您已经研究了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)

传递给并行的列表是闭包的列表,这些闭包使用唯一的参数调用构建。我必须确保在闭包函数之外定义作业参数,以确保分别安排作业。

2020-07-25