首页 > 解决方案 > Jenkins 流水线和 Groovy。并行迭代事物直到它们完成

问题描述

我正在勾勒出一个 Jenkins 管道。我可以在 5 个并行节点上以 8 组为一组运行测试,直到测试完成。

下面我将其简化为在 3 个节点上执行 8 个组。

我想知道我是否可以在管道中循环阶段以完成它们,直到我完成每个阶段。

TESTS.collate(8).collate(3).each {
  parallel {
    stage('run tests 1') {
      agent { label 'node1' }
      runTests(it[0])
    }
    stage('run tests 2') {
      agent { label 'node2' }
      runTests(it[1])
    }
    stage('run tests 3') {
      agent { label 'node3' }
      runTests(it[2])
    }
  }
}

标签: jenkinsjenkins-pipeline

解决方案


这是我的 Jenkinsfile 的相关部分

                def splitNBTests = NB_TESTS.split("\n").toList().collate(7)
                println(splitNBTests)
                if (!params.runCukes) {
                    echo "SKIPPING NEW BUSINESS RUN IN OZ JOB DUE TO DISABLED PARAMETER"
                } else {
                    SUITE_RUN_ID = UUID.randomUUID().toString()
                    def commands = splitNBTests.collect { def testsForNode ->
                        createCmdLineForCukes(testsForNode, PROFILE)
                    }
                    try {
                        TAGS = '"@regression ~@wip"'
                        SCENARIO_COUNT = "${DIRECTORY_CHANGE} && bundle && bundle exec rake run_scenario_count[${TAGS},${PROFILE}] SUITE_RUN_ID=${SUITE_RUN_ID}"
                        sh(returnStdout: true, script: SCENARIO_COUNT)
                        def stepsForParallel = [:]
                        commands.toList().eachWithIndex { def myCommand, int i ->
                            stepsForParallel["RunTests${i}"] = {
                                stage("RunTests${i}") {
                                    node {
                                        label 'grange-jenkins-slave'
                                        sh("mount -a")
                                        sh(myCommand)
                                    }
                                }
                            }
                        }
                        parallel stepsForParallel

我在 Kubernetes 上有我们的 Jenkins Master,它带有 Kubernetes 插件来动态扩展从属 pod。对于我们当前的回归运行,如果我们在每个节点上运行 7 个测试,这可能会产生大约 24 个节点,但我们现在限制它一次运行 10 个。

我所说的“白名单”是在进行中的脚本批准下。我目前将其设置为staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods getAt java.lang.Object java.lang.String.

我猜这应该被锁定多一点。提示赞赏。我从 Ruby 来到 Groovy,并用最少的时间来真正学习 Groovy。我会说它足够相似,从 Groovy 社区获得帮助肯定很有用,这样我就可以了解 Groovy 相当于#each_sliceRuby 中的#collate. 谢谢!


推荐阅读