使用Jenkins管道在不同节点上并行运行相同阶段

时间:2020-01-23 10:00:13

标签: jenkins jenkins-pipeline

本文中介绍了一种在不同节点上并行执行步骤/后处理的方法: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 个答案:

答案 0 :(得分:2)

您可以创建动态舞台,但对于您的情况不需要

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

答案 1 :(得分:0)

Declarative Matrix最适合我:

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 blog post中有关声明性矩阵的语录:

在没有矩阵的情况下创建的等效管道将很容易 倍,并且难以理解和维护。