运行 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 个这样的任务,直到它们全部完成。
我正在使用带有声明性管道的 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 个这样的任务,直到它们全部完成。