优先处理较旧的管道,而不是更新

时间:2017-02-14 12:23:30

标签: 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"
    }
}

通常情况下,当只有一个正在进行的运行时,这可以正常工作。即它运行四个并行任务,然后执行聚合部分。但是在高负载期间,此设置失败。让我们考虑以下场景:我们有一个Jenkins实例和一个执行器:

  1. 我们有一份如上定义的工作
  2. 我们为这项工作开始两次并发运行(中间几秒钟),运行#1和#2。
  3. 我们将立即在队列中有8个子任务,每次运行有4个任务,让我们称之为#1[1]#1[2]#1[3],{{1} },#1[4]#2[1]#2[2]#2[3]
  4. Jenkins将开始执行第一个任务#2[4],我们将在队列中执行七个任务。
  5. 此后,我们执行#1[1]#1[2]#1[3]
  6. 此时#1[4]的管道脚本可以继续并调度聚合子任务,#1
  7. 下一个Jenkins将执行#1-Aggr#2[1]等等
  8. 最后将执行#2[2]#1-Aggr
  9. 这确实存在问题,因为很多时间可以在作业首次启动和聚合任务调度之间传递。在执行聚合子任务之前,必须完成在其间安排的较年轻运行的所有子任务。最终结果是我们有很多正在进行的运行和未完成的运行。

    那么有什么方法可以改变这种行为?例如。根据运行开始时间而不是任务到达队列时对队列进行排序?通常(在管道之前)这不是一个问题,因为这两个指标是相同的,但对管道来说不是这样。

    我们当前的解决方法是使用专用节点进行聚合步骤。这种解决方案的缺点是负载平衡很难,我们依赖于标签或特定节点。

0 个答案:

没有答案