Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing 如何在声明性管道中将并行作业限制为特定从属作业_Parallel Processing_Jenkins Pipeline_Jenkins Plugins_Master Slave_Jenkins Slave - Fatal编程技术网

Parallel processing 如何在声明性管道中将并行作业限制为特定从属作业

Parallel processing 如何在声明性管道中将并行作业限制为特定从属作业,parallel-processing,jenkins-pipeline,jenkins-plugins,master-slave,jenkins-slave,Parallel Processing,Jenkins Pipeline,Jenkins Plugins,Master Slave,Jenkins Slave,我有3个节点:A,B,C 在这些节点中的每一个上,我都设置了一个Jenkins从机,它有自己的根目录 它们都有以下标签:test&&database&&mysql 我想在所有3个节点上并行运行一个作业,以清理它们上的工作区文件夹 为了达到这个目的,我写了这个詹金斯的剧本 def labels = "test && mysql && database" def getNodesName(labels){ def targets = [] def n

我有3个节点:A,B,C

在这些节点中的每一个上,我都设置了一个Jenkins从机,它有自己的根目录 它们都有以下标签:test&&database&&mysql

我想在所有3个节点上并行运行一个作业,以清理它们上的工作区文件夹 为了达到这个目的,我写了这个詹金斯的剧本

def labels = "test && mysql && database"

def getNodesName(labels){
    def targets = []
    def nodes = Jenkins.instance.getLabel(labels).getNodes()
    for(node in nodes){
        targets.add(node.getNodeName())
    }
    return targets
}

def nodes = getNodesName(labels)

def cleanWSTasks(targets){
    tasks = [:]
    for(target in targets){
        tasks[target] = {
            node(target){
                script {
                    cleanWs()
                }
            }
        }
    }
    return tasks
}

pipeline{
    agent none

    stages{

        stage ('Clean Workspace'){
            steps{
                script{
                    parallel cleanWSTasks(nodes)
                }
            }
        }

    }
}
因此,我认为对于cleanWsTasks函数中的node(target),我已经告诉Jenkins仅在我想要的特定目标节点上限制任务的执行。这样,所有3个节点将同时开始清理自己的工作空间

然而,我看到的是,只有1个节点执行了清理工作区的任务,并且执行了3次

例如,它显示:

正在中的节点A上运行

清理工作区

正在中的节点A上运行

清理工作区

正在中的节点A上运行

清理工作区


我在代码中做错了什么?请提供帮助。

节点步骤工作正常,您遇到的问题与如何定义任务有关。 在for循环中,您将分配此闭包:

          {
            node(target){
                script {
                    cleanWs()
                }
            }
任务[目标]

在执行闭包之前,闭包中的代码不会得到计算。因此,即使在for循环中分配
节点(目标)
目标
的值也不会得到计算,直到
并行任务
运行,也就是执行闭包时。这发生在for循环完成运行之后,因此
target
的值是节点列表中最后一个节点的名称

解决这个问题的一个简单方法是在for循环中创建一个等于target的变量,并在闭包中使用该变量,因为您将强制对
target
的求值发生在for循环中,而不是在闭包运行时。 看起来是这样的:

def cleanWSTasks(targets){
    tasks = [:]
    for(target in targets){
        def thisTarget = target
        tasks[thisTarget] = {
            node(thisTarget){
                script {
                    cleanWs()
                }
            }
        }
    }
    return tasks
}

哦,天哪,我不知道这是怎么回事!非常感谢你,它成功了!