【问题标题】:How to run the same job multiple times in parallel with Jenkins?如何与 Jenkins 并行运行同一个作业多次?
【发布时间】:2015-04-26 15:10:40
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

标签: jenkins parallel-testing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    假设您的系统中有足够的执行程序来并行运行作业,我认为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 的语法。

    【讨论】:

    • 同名作业并行运行时,构建流程插件不起作用。例如,我的构建流程如下所示: parallel ( {build ("FreestyleTest1")}, {build ("FreestyleTest1")} ) 但是,在这种情况下,输出如下所示: parallel { Schedule job FreestyleTest1 Schedule job FreestyleTest1 Build FreestyleTest1 #29 开始构建 FreestyleTest1 #29 开始 FreestyleTest1 #29 完成 FreestyleTest1 #29 完成 } 作业只运行一次。如果我要将其中一项作业更改为另一项作业,那么它们都会并行运行。
    • @Ash,很有趣。在带有 Build Flow 0.16 的 Jenkins 1.580.2 中,我可以用不同的参数安排同一个子作业 4 次,并且子作业并行运行 4 次。
    • 感谢您提供的示例和详细信息。我发现如果我为子作业提供不同的参数/值,那么实际上会执行多个子作业。这可能是一个插件错误。但是,作业仍然不能并行运行。 Ex output: parallel { Schedule job FreestyleTest1 Schedule job FreestyleTest1 Build FreestyleTest1 #36 started FreestyleTest1 #36 completed Build FreestyleTest1 #37 started FreestyleTest1 #37 completed }.....Jenkins 状态板显示 37 正在等待 36 完成,即使该节点有超过 2 个 executor 空闲。
    • 哦,我也在运行 Jenkins 1.599 和 Build Flow Plugin 0.17
    • @Ash,您能否验证您的 Freestyle Test1 作业是否配置为“执行并发构建”?看起来这项工作对我来说是并行执行的,所以我所能做的就是猜测对你来说有什么不同。
    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多