如何等待Jenkinsfile“并行”块内的所有执行程序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何等待Jenkinsfile“并行”块内的所有执行程序?相关的知识,希望对你有一定的参考价值。

我是Jenkins的新手并配置它的脚本,所以如果我说任何愚蠢的话,请原谅我。

我有一个脚本化的Jenkins管道,它将代码库的构建重新分配到多个节点,使用包含node块的parallel块实现。现在,问题在于,在构建之后,我想对正在构建的一个节点上构建的文件执行某个操作 - 但仅在所有节点完成之后。基本上,我想要的是类似于barrier,但是在Jenkins的节点之间。

简化,我的Jenkinsfile看起来像这样:

def buildConf = ["debug", "release"]

parallel buildConf.collectEntries { conf ->
    [ conf, {
        node {
            sh "./checkout_and_build.sh"

            // and here I need a barrier
            if (conf == "debug") {
                // I cannot do this outside this node block,
                // because execution may be redirected to a node
                // that doesn't have my files checked out and built
                sh "./post_build.sh"
            }
        }
    }]
}

有什么办法可以实现吗?

答案

您可以做的是添加一个全局计数器来计算已完成任务的数量,您需要指示每个具有后期作业的任务等到计数器等于任务总数,然后您可以执行后期任务部分。像这样:

def buildConf = ["debug", "release"]
def doneCounter = 0

parallel buildConf.collectEntries { conf ->
    [ conf, {
        node {
            sh "./checkout_and_build.sh"

            doneCounter++
            // and here I need a barrier
            if (conf == "debug") {
                waitUntil { doneCounter == buildConf.size() }
                // I cannot do this outside this node block,
                // because execution may be redirected to a node
                // that doesn't have my files checked out and built
                sh "./post_build.sh"
            }
        }
    }]
}

请注意,具有后期任务部分的每个任务都将阻止执行程序,直到完成所有其他并行任务并且可以执行后期部分。如果您有大量执行程序或任务很短,那么这可能不是问题。但是如果你有很少的执行者,它可能会导致拥堵。如果执行者的数量少于或等于需要后期工作的并行任务总数,则可能会遇到死锁!

以上是关于如何等待Jenkinsfile“并行”块内的所有执行程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Google Vision Api 检测块内的所有文本

将所有查询结果转储到 plsql 块内的文件中

如何等待并行任务完成

OpenMP 并行等待

内联块内的文本选择,中间没有空格

如何在 plsql 块内的 SELECT 语句中传递不同的变量值