如何在“post”部分的 jenkins 管道中使用“parallel”选项?

cad*_*eha 6 groovy jenkins jenkins-pipeline

我查看了许多管道示例以及如何在管道脚本中编写后期构建部分。但一直没有得到我想要的答案。我有 4 个作业 - 比如说作业 A、B、C 和 D。我希望作业 A 首先运行,如果成功,它应该并行触发作业 B、C、D。如果作业 A 失败,它应该只触发作业 B。如下所示:

pipeline {
    agent any

stages {
    stage('Build_1') {
        steps {
            sh '''
               Build Job A
            '''
        }
    }

post {
    failure {
        sh '''
            Build Job B
        '''
    }
    success {
         sh '''
             Build Job B,C,D in parallel
         '''
    }
}
}
Run Code Online (Sandbox Code Playgroud)

我尝试在帖子部分使用“并行”选项,但它给了我错误。有没有办法在帖子“成功”部分并行构建作业 B、C、D?

提前致谢!

Noa*_*mer 6

只要将并行关键字封装在脚本块内,并行关键字实际上就可以在后置条件内工作,因为脚本块只是脚本化管道的后备,这将允许您在任何需要的地方运行并行执行步骤。
以下应该可以正常工作:

pipeline {
    agent any
    stages {
        stage('Build_1') {
            steps {
                //  Build Job A
            }
        }
    }

    post {
        failure {
            // run job B
            build job: 'Job-B'
        }
        success {
            script {
                // run jobs B, C, D in parallel 
                def jobs = ['Job-B', 'Job-C', 'Job-D']
                parallel jobs.collectEntries { job ->
                    ["Building ${job}" : {
                        build job: job
                    }]
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这只是一个示例,build可以根据您的需要将特定参数或配置(针对关键字)添加到每个作业执行中。


Phi*_*lip 3

错误消息对此非常清楚:

使用了无效的“并行”步骤 - 在此上下文中不允许 - 并行步骤只能用作阶段步骤中唯一的顶级步骤

目前,更具限制性的声明性语法不允许在帖子部分使用并行。

如果您不想切换到脚本语法,另一个可行的选项是:在第二阶段并行构建作业 B、C、D,并将失败条件移至第一阶段的后期部分。因此,如果 A 成功,作业 B、C、D 将运行。如果 A 不成功,则仅运行作业 B。

pipeline {
    agent any

    stages {
        stage('one') {
            steps {
                // run job A
            }   
            post {
                failure {
                    // run job B
                }
            }
        }
        stage('two') {
            steps {
                parallel(
                     // run job B, C, D
                )

            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)