Как l oop параметризовать параллельные этапы в декларативном конвейере Jenkins? - PullRequest
0 голосов
/ 20 февраля 2020

Как l oop параметризовать параллельные этапы в декларативном конвейере Jenkins? (Или сценарий конвейера, если декларативный не может)

Вот мой простой псевдо-пример. Как выполнить l oop ('deploy serverN') этапов?

Массив может иметь переменные 1..n.

Я не хотел бы дублировать код. Должен быть выход в трубопровод Дженкинса ?? Или я должен использовать матрицу. Я пробовал несколько, но безуспешно.

@Library('adm-jenkins-lib@trunk')

def SERVERS = ['server1.com','server2.com',...]

deployPipeline([servers: SERVERS, manage_tasks: TASKS])

...
def call(Map params) {  
    pipeline {
        agent any
        environment {
        }
        stages {
            stage ('common task') {
            }       
            stage ('Deploying..') { 
                parallel {
                    stage ('deploy server1') {
                        stages {
                            stage ('deploy tasks #1') {
                                steps { ... }
                            }
                            stage ('deploy tasks #2') {
                                steps { ... }
                            }
                        }
                    stage ('deploy server2') {
                        stages {
                            stage ('deploy tasks #1') {
                                steps { ... }
                            }
                            stage ('deploy tasks #2') {
                                steps { ... }
                            }
                        }
                    }
                }
            }
        }
    }
}

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

            stage ('deploy serverX') {
                when { expression { params.manage_tasks =~ /task01/ } }
                steps {
                    script {
                        servers = params.servers
                        servers.each { server ->
                            deploys[server] = {
                                sh "run task#1 stuff.."
                            }
                        }
                        parallel deploys
                    }
                }
            }

В Синем океане это должно выглядеть так (но создается динамически): В Синем океане оно должно выглядеть так

1 Ответ

0 голосов
/ 02 марта 2020

У меня есть решение:

Обновите Blue Ocean по крайней мере до версии 1.22, чтобы правильно видеть конвейер.

Установите библиотеку https://github.com/comquent/imperative-when, как предложено @ zett42.

Этот пример представляет собой конвейерный сценарий. (Я не нашел решения для декларативного конвейера)

@Library('adm-jenkins-lib@trunk') _

properties([
    parameters([
        string(name: 'countTotal', defaultValue: '4'),
        choice(name: 'servers', choices: ['all', '1', '2','3','4'], description: 'Run on specific platform'),
        choice(name: 'manage_steps', choices: ['all_tasks','common_task','deploy_task','test_task'], description: 'Choose task')
    ])
])

node{
    stage('common task'){
        when(params.manage_steps ==~ /common_task|all_tasks/) {
            sh "echo common task"   
        }
    }
    def stages = [failFast: true]
    for (int i = 1; i < params.countTotal.toInteger()+1; i++) {
        if (params.servers == 'all' || params.servers == i.toString() )
        {
            def vmNumber = i //alias the loop variable to refer it in the closure
            stages["server${vmNumber}"] = {
                stage("deploy ${vmNumber}") {
                        when(params.manage_steps ==~ /deploy_task|all_tasks/) {
                        sh "echo deploy; sleep 5"
                  }
                }
                stage("test ${vmNumber}") {
                        when(params.manage_steps ==~ /test_task|all_tasks/) {
                        sh "echo testing; sleep 5"
                        }
                }
            }
        }
    }
    parallel stages
}


Пример BlueOcean Pipeline1 Пример BlueOcean Pipeline2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...