如何在 Jenkins 声明式管道中实现嵌套并行?

rod*_*dee 5 jenkins jenkins-pipeline jenkins-declarative-pipeline

我有如下声明式管道,它并行运行 2* 和 3* 阶段,粘贴下面的蓝海图。

pipeline {
    agent { label 'my_node' }
    options {
        timestamps()
        parallelsAlwaysFailFast()
    }
    stages {
        stage('1') {
            steps {
                script {
                    step([$class: 'WsCleanup'])
                }
            }
        }
        stage('2') {
            parallel {
                stage("2.1") {
                    steps {
                        script {
                            sh 'echo hi 2.1'
                        }
                    }
                }
                stage("2p") {
                    steps {
                        script {
                            sh 'echo hi 2p'
                        }
                    }
                }
            }
        }
        stage('3') {
            parallel {
                stage('3.1') {
                    steps {
                        script {
                            sh """
                               echo hi 3.1
                            """
                        }
                    }
                }
                stage('3.2') {
                    steps {
                        script {
                            sh """
                                echo "hi 3.2"
                            """
                        }
                    }
                }
            }
        }
        stage('4') {
            steps {
                script {
                    sh "echo end"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但我希望与 2* 和 3* 并行运行 2p,如下所示,有办法吗? 在此输入图像描述

我尝试在并行下使用并行,以并行方式启动2p到2和3,并嵌套并行以运行3.1。和下面的 3.2,但声明性管道不允许嵌套并行。

ycr*_*ycr 9

仅通过语法无法做到这一点DeclarativeScripted但是您可以通过和语法的组合来实现这一点Declarative。需要注意的一件事是,据我所知,目前还没有对嵌套并行阶段的可视化支持。这里有一个针对此的功能请求。

以下是一个示例管道,您可以将其用作您的用例的参考。

pipeline {
    agent any
    options {
        timestamps()
        parallelsAlwaysFailFast()
    }
    stages {
        stage('1') {
            steps {
                script {
                    step([$class: 'WsCleanup'])
                }
            }
        }
        stage('2 AND 3') {
        steps {
            script {
                parallel getWrappedStages()
            }
        }
        }
        stage('4') {
            steps {
                script {
                    sh "echo end"
                }
            }
        }
    }
}

def getWrappedStages() {
    stages = [:]
    stages["Step2.1"] = { stage('2.1') {
        sh """
           echo hi 2.1
        """
        } 
        parallel parallel3xstages()
    }
    stages["Step2.p"] = { stage('2.p') {
        sh """
           echo hi 2.p
        """
        } 
    }
    
    return stages
}

def parallel3xstages() {
  stages = [:]
    stages["Step3.1"] = { stage('3.1') {
        sh """
           echo hi 3.1
        """
        }
    }

    stages["Step3.2"] = { stage('3.2') {
        sh """
           echo hi 3.2
        """
        }
    }
  return stages
}
Run Code Online (Sandbox Code Playgroud)