Как выполнять параллельные вызовы одной и той же функции поэтапно в декларативном конвейере Jenkins - PullRequest
1 голос
/ 02 февраля 2020

Как правильно выполнить функцию в декларативном конвейере параллельно?

В нескольких сообщениях на этом форуме предлагается создать массив и передать массив в «параллельный» или передать функцию в 'параллельно'

Возможно ли создать параллельные этапы декларативного конвейера Jenkins в al oop?

Простое параллельное выполнение в Jenkins для массива

Я предпринял несколько попыток заставить его работать, но он всегда работает в последовательном режиме

Я думаю, что проблема в том, что функция оценивается во время создания массива, даже прежде чем я достигну «параллельного» этапа на стадии.

Я не смог найти решение из официальной документации.

https://jenkins.io/blog/2017/09/25/declarative-1/

Вот как я хотел бы, чтобы это работало, но возможно ли это?

    pipeline {

        agent {
            label "l1" && "l2"
        }

        stages {

            stage ('Prepare Data') {
                // Some code that creates that data object
                // data is an array of maps
                data
            }

            stage ('Build') {
                script {
                    def stepsForParallel = [:]
                    data.each { d ->
                        // name is a key in the data map
                        stepsForParallel["${d['name']}"] = {
                            node {
                                stage("${d['name']}") {
                                    stepsForParallel[execDownStreamJob("DownStreamJobName", d)] = {
                                        println("Executing DownstreamJob")
                                    }
                                }
                            }
                        }
                    }
                    parallel stepsForParallel
                }
            }

        }
    }
}

Функция, приведенная ниже, на самом деле не входит в объем этого вопроса, но я добавил ее на всякий случай это предлагает некоторую ценность. Лучше всего это объясняется в этом посте: { ссылка }

// job is a string
// jobParameters is a hashmap
def execDownStreamJob(job, jobParameters) {

    // Some parsing takes place on hashMap and creates the p object 
    // 'p' is passed to the 'build job' function as a parameter

    def downStreamJobResult = build job: job, parameters: p, propagate: false

    // Some try/catch logic

}

1 Ответ

0 голосов
/ 02 февраля 2020

следующая часть кода действительно странная

, потому что вы пытаетесь присвоить stepsForParallel дважды

    stepsForParallel["${d['name']}"] = {
        node {
            stage("${d['name']}") {
                stepsForParallel[execDownStreamJob("DownStreamJobName", d)] = {
                    println("Executing DownstreamJob")
                }
            }
        }
    }

я считаю, что это должно выглядеть так (не могу проверить это правильно сейчас):

    script {
        def stepsForParallel = data.collectEntries{ d ->
            ["${d.name}", 
                {
                    stage("${d.name}") {
                        println "DownstreamJob ${d.name} start")
                        execDownStreamJob("DownStreamJobName", d)
                        println "DownstreamJob ${d.name} end")
                    }
                }
            ]
        }
        parallel stepsForParallel
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...