Jon*_*n S 6 jenkins jenkins-pipeline
简而言之,有没有办法根据构建/运行年龄而不是队列中的多长时间对Jenkins队列进行排序?
在一些背景知识中,我们有一个管道脚本可以并行执行多个任务,最后有一个步骤可以聚合并行任务的结果.这是一个简化版本:
stage ('Do Parrallel stuff') {
def par = [:]
for (int i = 0; i < 4; i++) { par[i] = {sleep(10)} }
parallel par;
}
stage ('Aggregate') {
node {
echo "Aggregating stuff"
}
}
Run Code Online (Sandbox Code Playgroud)
通常情况下,当只有一个正在进行的运行时,这工作正常.即它运行四个并行任务,然后执行聚合部分.但是在高负载期间,此设置失败.让我们考虑以下场景:我们有一个Jenkins实例和一个执行器:
#1[1],#1[2],#1[3],#1[4],#2[1],#2[2],#2[3]和#2[4]#1[1]我们将在队列中有七个任务.#1[2],#1[3]和#1[4].#1可以继续并调度聚合子任务,#1-Aggr#2[1],#2[2]依此类推#1-Aggr,#2-Aggr将被执行这确实存在问题,因为很多时间可以在作业首次启动和聚合任务调度之间传递.在执行聚合子任务之前,必须完成在其间安排的较年轻运行的所有子任务.最终结果是我们有很多正在进行的运行和未完成的运行.
那么有什么方法可以改变这种行为?例如,根据运行开始时间而不是任务到达队列时对队列进行排序?通常(在管道之前)这不是问题,因为这两个指标是相同的,但是对于管道而言并非如此.
我们当前的解决方法是使用专用节点进行聚合步骤.这种解决方案的缺点是负载平衡很难,我们依赖于标签或特定节点.