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

У меня есть список элементов, каждый из которых должен пройти два этапа, при этом для каждого из элементов этапы должны идти один за другим, но элементы могут выполняться параллельно. Итак, я попытался создать вложенные параллельные этапы для каждого элемента в списке, поэтому все элементы будут выполняться параллельно, и для каждого из них этапы будут выполняться один за другим, когда я пытался сделать это без цикла (только для 2 пункта из моего списка) получилось так:

stage('nested parallel stage') {
    parallel {
        stage("stages for item1") {
            steps {
                script {
                    stage("stage1 for item1 ") {
                        sh "echo stage 1 for item1"
                    } //stage 1
                    stage("stage 2 for item1") {
                        sh "echo stage 2 to item1"
                    } // stage 2
                } //script
            } // steps
        } // stage
        stage("stages for item2") {
            steps {
                script {
                    stage("staqge1 for item 2") {
                        sh "echo stage 1 for item2"
                    } //stage 1
                    stage("stage 2 for item2") {
                        sh "echo stage 2 to item2"
                    } // stage2
                } //script
            } // steps
        } // stage
    } //parallel
} // nested parallel stage

Это работало без каких-либо проблем. Но когда я попытался сделать это в цикле, вот так:

def itemsMap = getitemsMap ()
def parallelItemsStages = itemsMap.collectEntries{
    [ "${it.value.item}": {
            stage("stages for ${it.value.item}") {
                steps{
                    script {
                        stage("stage 1 for ${it.value.item}") {
                            sh "echo stage 1 for ${it.value.item}"
                        } //stage 1
                        stage("stage 2 for ${it.value.item}") {
                            sh "echo stage 2 for ${it.value.item}"
                        } // stage 2
                    } // script
                } // steps
            } // stage
        } // nested stages
    }] // collectEntries
} // collectEntries
parallel parallelItemsStages

Я получил эту ошибку:

ava.lang.NoSuchMethodError: No such DSL method 'steps' found among steps

person yiaca    schedule 24.11.2020    source источник
comment
Ваш синтаксис выглядит немного не так. Разве за itemsMap.collectEntries не должны следовать открывающие скобки? Кроме того, ошибка не имеет смысла, поскольку вы нигде не объявили блок steps.   -  person gigalul    schedule 24.11.2020
comment
Там, где раньше у вас было stage { steps {, теперь у вас stage { stages {. Может быть, это виновник?   -  person MaratC    schedule 25.11.2020
comment
Плохо... это было stage { steps {, а затем я изменил его на stage { stages {, но получил ту же ошибку.. Кроме того, насколько мне известно, скобки для itemsMap.collectEntries не нужны, но я добавил и получил те же результаты   -  person yiaca    schedule 25.11.2020


Ответы (2)


Пытаюсь понять getitemsMap(); Могу я спросить, какова роль def itemsMap = getitemsMap()

person Eerama19    schedule 26.11.2020
comment
Эта карта содержит некоторые метаданные моих элементов, и это то, что я сделал параллельный цикл над своими элементами и сгенерированными этапами, но это сработало только для одного этапа для каждого элемента. - person yiaca; 27.11.2020
comment
Привет, @yiaca, извините за опоздание. Надеюсь, вы решили свою проблему, если нет, я попытался выполнить скрипт на своем конце и обнаружил следующую ошибку: java.lang.NoSuchMethodError: Нет такого метода DSL ' getitemsMap' найден среди шагов. Я считаю, что мне нужны дополнительные данные здесь, глядя на ошибку, я бы рекомендовал попробовать что-то вроде ниже - person Eerama19; 04.12.2020
comment
включение оператора sh в шаги, которые ожидаются stage("stage 1 for ${it.value.item}") { steps { sh "echo stage 1 for ${it.value.item}" } //steps at stage 1 } //stage 1 - person Eerama19; 04.12.2020

попробуй это:

def itemsMap = getitemsMap ()
def parallelItemsStages = itemsMap.collectEntries{
    [ "${it.value.item}": {
            script {
                stage("stage 1 for ${it.value.item}") {
                    sh "echo stage 1 for ${it.value.item}"
                } //stage 1
                stage("stage 2 for ${it.value.item}") {
                    sh "echo stage 2 for ${it.value.item}"
                } // stage 2
            } // script
        } // nested stages
    }] // collectEntries
} // collectEntries
parallel parallelItemsStages

это сработало для меня только что :)

person Ahmed Magdy    schedule 26.03.2021