jenkins - 如何与 Jenkins 并行运行相同的工作多次?

标签 jenkins parallel-testing

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

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

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

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

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

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

最佳答案

我知道您已经查看了 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 
    }
    

    作业历史记录显示,所有四个作业都在几秒钟内被调度。但是作业构建步骤包含人为延迟( sleep ),这会阻止任何单个构建快速完成。

    更新 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 的列表是一个使用唯一参数调用构建的闭包列表。我必须确保在闭包函数之外定义作业参数,以确保单独安排作业。

    我抄袭了另一个 answer 的语法和 this thread在 Jenkins 邮件列表中。

    关于jenkins - 如何与 Jenkins 并行运行相同的工作多次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28705222/

    相关文章:

    jenkins - 如何使用 Jenkins 中的 Bitbucket Team/Project 插件扫描项目中的存储库

    java - 如何将 Jenkins 构建部署到本地文件系统上的 Maven 存储库中

    java - 如何在 Groovy Jenkins 管道中使用全局外部 Java 库中的方法?

    ruby-on-rails - Rails parallel_tests 与 RSpec 请求规范 : Address already in use error

    ruby-on-rails - 并行测试 Rails 应用程序的 JRuby 友好方法

    linux - 当 "jenkins"用户执行带有正则表达式的任务时,ansible 会引发错误

    github - 在 GitHub 中针对拉取请求显示 Jenkins 管道状态

    c# - NUnit 并行运行测试类别

    c# - SpinWait.SpinUntil 在等待 Selenium 元素存在时花费比超时更长的时间退出

    cucumber - 使用 Gems 或 Jenkins(或两者)在多台机器上并行 Cucumber BDD 测试