【问题标题】:running the same task on multiple agents in my Jenkins declarative pipeline在我的 Jenkins 声明式管道中的多个代理上运行相同的任务
【发布时间】:2018-05-31 16:51:15
【问题描述】:

我有一个类似的块:

stage('Clone on win10x64-b-ut') {
    agent {
        node {
            label 'win10x64-b-ut'
        }
    }
    steps {
        gitClone()
    }
}    

stage('Clone on win81x64-b-ut') {
    agent {
        node {
            label 'win81x64-b-ut'
        }
    }
    steps {
        gitClone()
    }
}

我想通过更改标签以有点像循环的方式运行相同的任务。我想尽可能地消除冗余。

【问题讨论】:

    标签: jenkins jenkins-pipeline jenkins-declarative-pipeline


    【解决方案1】:

    看看这个答案:https://stackoverflow.com/a/48421660/9498358

    如果您不想并行运行阶段(如在链接的答案中),您可以在脚本块内添加一个 for 循环,因此它看起来像这样:

    def generateStage(nodeLabel) {
        return {
            stage("Clone on ${nodeLabel}") {
                agent {
                    node {
                        label nodeLabel
                    }
                }
                steps {
                    gitClone()
                }
            } 
        }
    }
    
    // ...
    
    stage('Clone') {
        steps {
            script {
                def allNodes = [win10x64-b-ut', 'win81x64-b-ut']
    
                for (def i = 0; i < allNodes[i]; i++) {
                    generateStage(allNodes[i])
                }
            }
        }
    }
    

    【讨论】:

    【解决方案2】:

    接受的答案不起作用。特别是 def 部分。

    这是有效的:

    def generateStage(nodeLabel) {
        stage("Runs on ${nodeLabel}") {
            node(nodeLabel) {
                sh 'hostname'
            }
        }
    }
    
    pipeline {
        agent {
            node {
                label '!docker'
            }
        }
        stages {
            stage('Run') {
                steps {
                    script {
                        nodes = nodesByLabel(label: 'docker')
    
                        for (node in nodes) {
                            generateStage(node)
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 我们可以使用nodesByLabel添加多个标签吗?我的意图是创建和执行添加到“generateStage”函数中的相同阶段。
    • 这确实有效,但我有一个奇怪的问题;我以逗号 [, VM1, VM2] 开头的数组导致 generateStage 在没有标签的随机代理上运行,有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    相关资源
    最近更新 更多