Как написать динамический декларативный конвейер, который содержит последовательное задание внутри параллельного задания - PullRequest
0 голосов
/ 18 мая 2019

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

Входными данными будет карта. Каждый список на карте должен выполняться параллельно, а элементы в списке, соответствующие каждому ключу, должны выполняться последовательно.

пример данных: [1: [11,12], 2: [21,22], 3: [31,32]]

На выходе должно быть изображение. Может ли кто-нибудь дать какую-то идею?

enter image description here

Ниже приведен код, который я пробовал.

def stageData = [1:[11,12], 2:[21,22], 3:[31,32]];

def getDeployStages1(stageData){
    Map deployStages = [:]
    stageData.each{ key, stgValue ->
        List stgs = []
        stgValue.each{ value ->           
            deployStages.put("${value}", {
                echo "${value}"
            })
        }        
    }
    return deployStages;
}

def getDeployStages2(stageData){
    Map deployStages = [:]
    stageData.each{ key, stgValue ->
        List stgs = []
        stgValue.each{ value ->
            stgs.add(stage("${value}"){
               echo "${value}"
            })           
        }
        deployStages.put("${key}", stgs)
    }
    return deployStages;
}

pipeline {
    agent any
    stages {
        stage ("deploy1") {
            steps {
                script {
                     parallel getDeployStages1(stageData)
                }
            }
        }
        stage ("deploy2") {
            steps {
                script {
                    parallel getDeployStages2(stageData)
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 20 мая 2019

Согласно этой документации вы можете вкладывать стадии следующим образом

pipeline {
    agent none

    stages {
        stage("build and deploy on Windows and Linux") {
            parallel {
                stage("windows") {
                    agent {
                        label "windows"
                    }
                    stages {
                        stage("build") {
                            steps {
                                bat "run-build.bat"
                            }
                        }
                        stage("deploy") {
                            when {
                                branch "master"
                            }
                            steps {
                                bat "run-deploy.bat"
                            }
                        }
                    }
                }

                stage("linux") {
                    agent {
                        label "linux"
                    }
                    stages {
                        stage("build") {
                            steps {
                                sh "./run-build.sh"
                            }
                        }
                        stage("deploy") {
                             when {
                                 branch "master"
                             }
                             steps {
                                sh "./run-deploy.sh"
                            }
                        }
                    }
                }
            }
        }
    }
}

Это должно привести к следующему потоку enter image description here

Чтобы применить это в вашем случае, вы можете упростить ваши функции, чтобы они возвращали только элементы, которые должны быть последовательными (только значения).

pipeline {
    agent any
    stages {
        stage ("parallel") {
        parallel {
        stage ("deploy1") {
            stages {
                 def list = getDeployStages1(stageData)
                 for (int i=0; i < list.size(); i++) {
                      stage(i) {
                          echo("${list[i]}")
                      }
            }
        }
        stage ("deploy2") {
            stages {
                //similar
            }
        }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...