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

quangthang10d4

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

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

我想在所有3个节点上并行运行作业,以清理它们上的工作区文件夹。为此,我编写了这个Jenkins脚本

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上运行

清理工作区..

我在代码中做错了什么?请帮忙。

瓦西里基·西亚卡(Vasiliki Siakka)

节点步骤正常运行,遇到的问题与定义任务的方式有关。在for循环中,您要分配此闭包:

          {
            node(target){
                script {
                    cleanWs()
                }
            }

tasks[target]

在执行闭包之前,闭包内部的代码不会得到评估。因此,即使您node(target)在for循环中分配target值,也不会在parallel tasks运行(即执行闭包时)之前评估的值这在for循环完成运行之后发生,因此target的值是节点列表中最后一个节点的名称。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何限制并行作业

如何在Jenkins声明式管道中检测哪个并行阶段失败?

如何在声明式管道中获取下游作业的build_number?

如何允许从属节点运行并行作业?

如何在Google Play控制台中将应用限制为特定的Android版本

如何在Python 2.7中将用户输入限制为特定的整数,并跟踪异常?

如何在谷歌地图Javascript api中将标记限制为特定城市?

如何在相同标签下并行执行不同请求在不同从属上的作业执行

如何在Oracle SQL中将结果限制为1行

如何在Woocommerce中将页面限制为用户?

并行示例Jenkinsfile声明式管道失败

Jenkins声明式管道并行阶段

Jenkins 声明式管道中的并行项

如何在声明式管道中处理全局变量?

如何在声明式管道中使用NodeLabel参数插件

如何在 Jenkins 声明式管道中循环参数值

如何使管道作业等待所有触发的并行作业?

如何在 AzureDevops 托管管道上并行运行 powershell 作业

如何在 azure 管道中使用“公共项目的无限分钟和并行作业”

从属性文件加载属性并使它们在整个作业/管道中可用-Jenkins声明性语法

如何仅在swiftUI中将拖动手势限制为特定帧

Jenkins声明式管道并行步骤执行程序

无法从声明性管道触发自由式作业

如何在Spark Standalone中将处理限制为指定数量的内核

如何在 vb 中将输入框限制为 11 个数值

如何在Laravel 5.7中将数据输入限制为数据库

如何在Doctrine中将关联限制为另一个关联的子集?

如何在fabricjs中将圆形/矩形的大小限制为某些半径/宽度/高度?

如何在codeigniter中将上传图片比例限制为16:9?