运行 Jenkins 基于具有声明性管道的核心数量并行执行步骤

Running Jenkins steps in parallel based on number of cores with declarative pipeline

我正在使用带有声明性管道的 Jenkins。 我有一个 Jenkins 机器,它有 8 个内核 运行 并行执行任意数量的步骤(比如 20)。 问题是并行任务太多 运行 并且一些测试由于超时问题而失败。

我需要一种方法来告诉 Jenkins 运行 并行进行 20 次测试,但一次只能进行 8 次测试。 这样,我将首先给它较长的 运行ning 步骤,然后是更快的步骤。一旦它完成了一个较长的步骤,它应该立即开始下一个,而其他 7 个仍在 运行ning。 像这样,但一次只有 8 个:

            steps {
                parallel(
                    runtest1:
                    {
                        dostep()
                    },
                    runtest2:
                    {
                        dostep()
                    },
                    runtest3: 
                    {
                        dostep()
                    },
                    runtest4: 
                    {
                        dostep()
                    },
                    runtest5:
                    {
                        dostep()
                    },
                    runtest6:
                    {
                        dostep()
                    },
                    runtest7:
                    {
                        dostep()
                    },
                    runtest8:
                    {
                        dostep()
                    },
                    runtest9:
                    {
                        dostep()
                    }
                    runtest10:
                    {
                        dostep()
                    },
                    runtest11:
                    {
                        dostep()
                    },
                    runtest12:
                    {
                        dostep()
                    },
                    runtest13: 
                    {
                        dostep()
                    },
                    runtest14: 
                    {
                        dostep()
                    },
                    runtest15:
                    {
                        dostep()
                    },
                    runtest16:
                    {
                        dostep()
                    },
                    runtest17:
                    {
                        dostep()
                    },
                    runtest18:
                    {
                        dostep()
                    },
                    runtest19:
                    {
                        dostep()
                    },
                    runtest20:
                    {
                        dostep()
                    }
                )

            }
        }

今天使用 parallel() 它只会 运行 所有测试然后当它完成所有事情时,它将进入下一阶段 运行 下一个并行步骤。

您的代码将尝试 运行 在同一个代理上并行进行所有这些测试。那可能不是你想要的。您可以尝试 运行 在不同代理上并行执行整个阶段:https://jenkins.io/blog/2017/09/25/declarative-1/

stages {
    stage('Run Tests') {
        parallel {
            stage('Test 1') {
                agent { label "8-core-agent" }
                steps {
                    doTheTest()
                }
            }
            stage('Test 2') {
                agent { label "8-core-agent" }
                steps {
                    doTheTest()
                }
            }
        }
...

如果您只是 运行在 master 或单个代理上构建您的构建,您可能可以使用上述方法将测试分成几个阶段:stage('test 1-8') ... stage('test 9-16')

如果你将 8-core-agent 上的执行者数量设置为 8,Jenkins 应该一次安排 8 个这样的任务,直到它们全部完成。