Jenkinsfile: Как предоставить функцию для «параллельного» блока вместо предопределенной карты? - PullRequest
0 голосов
/ 11 февраля 2020

Этот действительно полезный ответ , получил мне 95% пути. Используя это решение, я могу запустить n этапы сборки параллельно. Однако карта параллельных этапов по существу жестко запрограммирована. Я хочу иметь возможность создавать его динамически. Первым шагом в этом процессе является изменение parallelStagesMap с карты на функцию, которая возвращает карту.

К сожалению, это небольшое изменение приводит к сбою сборки без каких-либо явных журналов ошибок, связанных с синтаксисом.

Как я могу выполнить sh это? Я использую искаженный синтаксис Groovy? Буду благодарен за любую помощь.

def jobs = ["JobA", "JobB", "JobC"]

def parallelStagesMap() {                 // This is now a function that returns a map.
    return jobs.collectEntries {
        ["${it}" : generateStage(it)]
    }
}
def generateStage(job) {
    return {
        stage("stage: ${job}") {
            echo "This is ${job}."
            sh script: "sleep 15"
        }
    }
}

pipeline {
    agent any

    stages {
        stage('parallel stage') {
            steps {
                script {
                    parallel parallelStagesMap()      // I call the function here.
                }
            }
        }
    }
}

1 Ответ

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

Я получил рабочее решение! Это не идеально, потому что я хотел бы извлечь часть jobs.collectEntries в свою собственную функцию, но теперь я могу определять содержимое моих параллельных этапов в строке, а не в верхней части файла!

Я пытался написать функцию, соответствующую той же сигнатуре, что и Map.collectEntries: ({ Closure -> Map }), но сборка Jenkins завершается неудачно без каких-либо журналов, как только она попадает в мою функцию. Если кто-то сможет решить это, я буду благодарен.

def jobs = ["JobA", "JobB", "JobC"]

pipeline {
    agent any

    stages {
        stage('parallel stage') {
            steps {
                script {
                    parallel jobs.collectEntries { j ->
                        ["${j}" : { job -> return {
                            stage("stage: ${job}") {
                                echo "This is ${job}."
                                sh script: "sleep 15"
                            }
                        }}(j)]
                    }
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...