我刚接触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"
}
}
}]
}
有什么方法可以实现这个目标吗?
答案 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"
}
}
}]
}
请注意,具有发布任务部分的每个任务都将阻止执行程序,直到完成所有其他并行任务并且可以执行发布部分。如果您有大量执行程序或任务很短,那么这可能不是问题。但是如果你有很少的执行者,它可能会导致拥堵。如果您的执行者数量少于或等于需要后期工作的并行任务总数,那么您可能会遇到死锁!