我正在将Jenkins与声明性管道一起使用。我有一台Jenkins机器,它有8个内核并行运行任意数量的步骤(例如20个)。问题是太多任务并行运行,并且某些测试由于超时问题而失败。
我需要一种方法让Jenkins并行运行20个测试,但一次只能运行8个。这样,我将给它较长的运行步骤,然后是更快的步骤。一旦完成较长的步骤之一,它应立即开始下一个步骤,而其他七个仍在运行。像这样,但一次只有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()
}
}
}
...
如果仅在主代理或单个代理上运行构建,则可以使用上述方法将测试分为多个阶段:stage('test 1-8') ... stage('test 9-16')
等