我如何等待Jenkins文件中的所有执行程序" parallel"块?

时间:2018-03-03 19:43:18

标签: jenkins groovy parallel-processing jenkins-pipeline

我刚接触Jenkins并配置其脚本,所以如果我说任何愚蠢的话,请原谅我。

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

简化,我的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"
            }
        }
    }]
}

有什么方法可以实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

你可以做的是添加一个全局计数器来计算已完成任务的数量,你需要指示每个具有岗位职位的任务等到计数器等于任务总数,然后你可以先做发布任务部分。像这样:

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"
            }
        }
    }]
}

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