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

How to run the same job multiple times in parallel with Jenkins?

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

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

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

我认为 long/painful 这样做的方法是在 Jenkins 中编写 100 个作业,每个作业将直接是一个不同的测试脚本(使用上述参数)并且 运行 这些使用可用插件并行进行。然而,长期 运行 维持所有这些工作将非常困难。

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

我的问题是在 Jenkins 中是否有插件或任何方法可以实现此目的?我查看了名为 "Build Flow"、"Parallel Test Executor" 和 "Parameterized Trigger" 的插件的信息。但是,它们似乎不符合我的需求。

我知道您已经研究过 Build Flow 插件,但我不确定您为什么不考虑它。或许你可以指出我提案中的漏洞。

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

  • Build Flow 插件支持 running jobs in parallel。我看不出 Build Flow 无法将您的 "child" 作业与不同参数并行安排到 运行 的任何原因。

  • 构建流程测试聚合器从构建流程作业的计划构建中获取测试结果,因此您的 "child" 作业需要发布自己的测试结果。

  • 您将需要配置您的 "child" 作业,以便它可以 运行 通过检查作业配置中的 "Execute concurrent builds if necessary" 并行。

  • 无论哪一组从站提供与嵌入式设备的连接,都需要足够的执行器来并行 运行 您的作业。


更新:使用简单的构建流程定义:

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 邮件列表中另一个 answer and this thread 的语法。

请确保Manage Jenkins -> Manage Nodes 设置中的executor数量大于MultiJob项目中单个作业的数量。 默认情况下我猜它是 2。因此我们需要增加它。