выполнение одной и той же задачи на нескольких агентах в моем декларативном конвейере Jenkins

У меня есть блок типа:

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()
    }
}

Я хочу запустить ту же задачу, что-то вроде цикла, просто изменив метки. Я хочу устранить избыточность, насколько это возможно.


person vmwgeek    schedule 31.05.2018    source источник


Ответы (2)


Взгляните на этот ответ: 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])
            }
        }
    }
}
person Vasiliki Siakka    schedule 01.06.2018
comment
ответ дает исключение для def i и stackoverflow.com/a/48421660/9498358 дает хороший результат. - person np2807; 02.03.2021

Принятый ответ не работает. Особенно часть 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)
                    }
                }
            }
        }
    }
}
person Petr V.    schedule 05.02.2019
comment
можем ли мы добавить более одной метки, используя nodesByLabel? Мое намерение состоит в том, чтобы создать и выполнить тот же этап, добавленный в функцию «generateStage». - person np2807; 24.02.2021
comment
Это действительно работает, но у меня странная проблема; массив, который я получаю, начинается с запятой [, VM1, VM2], что приводит к запуску generateStage на случайном агенте, у которого нет метки, есть идеи? - person Epligam; 29.04.2021