如何在groovy中动态调度一些串行和一些并行任务?

iibxawm4  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(334)

我有一些代码可以动态地并行调度一堆测试作业。看起来像

config.deploymentTargets.each { deploymentName ->
   config.deploymentTargetsMap[deploymentName][branchName].each { deploymentTargetName ->
      def testContext = "${stageName}.${deploymentTargetName}"
      deployments[testContext] = {
         stage( textContext ) {
            /* set up one test */
         }
      }
   }
}

在某些情况下,我们一次运行10-12个这样的测试,但是这样的测试的数量是动态的。我想改变这一点,使它们以三个“批”运行,因此测试1、2、3作为“测试套件1”连续运行,测试4、5、6作为“测试套件2”连续运行,等等。然后,不同的“测试套件”可以并行运行。我如何重新构造groovy代码来实现这一点?

utugiqy6

utugiqy61#

在修改后的代码中,我创建了一个testSuites数组来存储所有测试上下文。然后,我使用eachWithIndex迭代testSuites数组,并根据batchSize值计算每个测试套件的批号。
我创建了一个parallelStagesMap来存储每个批处理的stage。如果一个批处理在parallelStagesMap中不存在,我会为它创建一个空Map。然后将测试套件作为键添加到相应的批处理中,并将阶段定义分配为其值。
最后,在node块中,我有一个名为"Parallel Test Suites"的阶段,其中使用并行步骤并传递parallelStagesMap,以根据定义的批次并行运行测试套件。
通过这种重组,测试将在每个批处理中串行运行(一次三个),不同的测试套件将并行运行。
我试着修改你的代码:

def batchSize = 3 // Number of tests to run in each batch

def testSuites = []
config.deploymentTargets.each { deploymentName ->
  config.deploymentTargetsMap[deploymentName][branchName].each { deploymentTargetName ->
    def testContext = "${stageName}.${deploymentTargetName}"
    testSuites.add(testContext)
  }
}

def parallelStages = [:]
testSuites.eachWithIndex { testSuite, index ->
  def batchNumber = (index / batchSize) + 1
  if (!parallelStages["Batch ${batchNumber}"]) {
    parallelStages["Batch ${batchNumber}"] = {}
  }
  parallelStages["Batch ${batchNumber}"][testSuite] = {
    stage(testSuite) {
      /* set up one test */
    }
  }
}

node {
  stage("Parallel Test Suites") {
    parallel parallelStages
  }
}

相关问题