两阶段Jenkins管道脚本不会锁定到所需的节点

时间:2017-08-22 21:18:19

标签: jenkins jenkins-pipeline

我有一个管道脚本,我想在两台不同的构建机器上启动并行构建,一旦完成所有操作,执行一些运行后的活动,例如打开和发布测试结果,从所有人创建存档生成的二进制文件和库等

它基本上看起来像这样,其中' master'是一台MacOS机器,我们有一台单独的Windows构建机器:

// main run stuff
parallel (
    "mac" : {
        node ('master') {                
            for (job in macJobs) {
                job.do()
            }
        }
    },
    "windows" : {
        node ('windowsMachine') {                
            for (job in windowsJobs) {
                job.do()
            }
        }
    }
}

node('master') {
    // post-run stuff        
}

如果我使用此脚本启动单个构建,则它完成没有问题。

但是,如果第二个构建开始,而第一个构建仍然在parallel块中工作(即它的轮询SCM并且有人在第一个构建仍在进行时进行了推送),那么运行后块在第二个作业的parallel块完成之前,它不会被执行。

显然是一个优先级队列,基于谁首先请求节点,但是我想在Jenkins移动到下一个节目之前完成一个完整的脚本运行,所以我们不要这样做。 t最终会在运行后的区块堆积工作,这通常只需要几秒钟就可以完成......

如何修改脚本来执行此操作?我尝试将它全部包装在一个stage块中,但没有运气。

1 个答案:

答案 0 :(得分:0)

我可能会猜测问题的一部分在于你的运行后的东西与你的一个并行任务共享你的主节点。特别是如果您的主节点只有一个或两个执行程序,这肯定会使它具有多个并发构建的100%负载。

如果这听起来可能是您问题的一部分,您可以尝试为运行后的东西提供一个专用节点,以保证可用性,而不受触发构建的影响。或者增加主节点上可用的执行程序,以保证即使有几个并发构建,仍然有可用于这些后运行的执行程序。

詹金斯并不真正关心要执行的块的来源。因此,如果您有两个作业同时运行,并且每个作业都在两个单独的块中使用主节点。在达到第二个块之前,每个作业的第一个块很可能会一起执行。如果您的执行程序只有两个执行程序可用,那么您甚至可能最终得到该节点的缺乏队列,但至少,执行程序必须在第二个程序段中的任何一个开始之前可用。