Выполнять одни и те же этапы параллельно на разных узлах с конвейером Jenkins - PullRequest
0 голосов
/ 23 января 2020

Существует способ выполнить шаги / пост-действия на разных узлах параллельно, описанные в этой статье: https://jenkins.io/blog/2017/09/25/declarative-1/

     stage('Run Tests') {
        parallel {
            stage('Test On Windows') {
                agent {
                    label "windows"
                }
                steps {
                    bat "run-tests.bat"
                }
                post {
                    always {
                        junit "**/TEST-*.xml" // DUPLICATE CODE
                    }
                }
            }
            stage('Test On Linux') {
                agent {
                    label "linux"
                }
                steps {
                    sh "run-tests.sh"
                }
                post {
                    always {
                        junit "**/TEST-*.xml" // DUPLICATE CODE
                    }
                }
            }
        }
    }

Есть ли возможность выполнить одинаковые этапы на нескольких узлах без дублирования кода ?

Примерно так:

     stage('Run Tests') {
        parallel {
            stage("Test On ${NODE_NAME}") {
                agents {
                    label "windows"
                    label "linux"
                }
                steps {
                    // do test steps
                }
                post {
                    always {
                        junit "**/TEST-*.xml"
                    }
                }
            }
        }
    }

Ответы [ 2 ]

2 голосов
/ 23 января 2020

Вы можете создавать динамические c этапы, но для вашего случая не требуется

pipeline {
    agent any
    stages {
        stage ("Test") {
            steps {
                script {
                    testStages = ["Windows", "Linux"].collectEntries {
                        ["${it}" : runTests(it)]
                    }
                    parallel testStages
                }   
            }
        }
    }
}

def runTests(def name){
    return {
        node(name) {
            stage("Run on ${name}") {
                script {
                    command = "run-tests"
                    try {
                        switch(name.toLowerCase()) {
                            case "windows": 
                                command += ".bat" 
                                break;

                            case "linux": 
                                command += ".sh" 
                                break;
                        } 

                        echo command
                    } catch (Exception ex) {
                        echo ex
                    } finally {
                        echo "post ${name}"
                    }
                }
            }
        }
    }
}

enter image description here

0 голосов
/ 29 января 2020

Декларативная матрица работал лучше всего для меня:

pipeline {
    agent none
    stages {
        stage('BuildAndTest') {
            matrix {
                agent {
                    label "${PLATFORM}-agent"
                }
                axes {
                    axis {
                        name 'PLATFORM'
                        values 'linux', 'windows'
                    }
                }
                stages {
                    stage('Test') {
                        steps {
                            echo "Do Test for ${PLATFORM}"
                        }
                    }
                }
                post {
                    always {
                        junit "**/TEST-*.xml"
                    }
                }
            }
        }
    }
}

Этот конвейер будет выполнять определенные этапы вкл. действия пост-сборки на обеих платформах без никакого дублирования кода.

Цитата из сообщения в блоге Jenkins о декларативной матрице:

Эквивалент конвейер, созданный без матрицы, легко будет в несколько раз больше, и его будет сложнее понять и поддерживать.

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