在Jenkins中锁定并行阶段

在Jenkins中锁定并行阶段,jenkins,groovy,jenkins-plugins,jenkins-pipeline,Jenkins,Groovy,Jenkins Plugins,Jenkins Pipeline,我们试图编写一个声明性的Jenkinsfile构建脚本,以便在每个阶段中并行运行几个步骤,但是我们需要防止多个构建同时运行,因为它们依赖于相同的资源。因此,我们尝试使用来锁定所有阶段,这样一个构建可以在另一个构建尝试使用相同资源之前完全完成 但是,我们发现锁定阶段需要,并且并行步骤只能包含在顶级阶段中: WorkflowScript:24:并行阶段或分支只能包含在顶级阶段中 基本上,我们要做的是: #!/usr/bin/env groovy pipeline { agent any

我们试图编写一个声明性的Jenkinsfile构建脚本,以便在每个阶段中并行运行几个步骤,但是我们需要防止多个构建同时运行,因为它们依赖于相同的资源。因此,我们尝试使用来锁定所有阶段,这样一个构建可以在另一个构建尝试使用相同资源之前完全完成

但是,我们发现锁定阶段需要,并且并行步骤只能包含在顶级阶段中:
WorkflowScript:24:并行阶段或分支只能包含在顶级阶段中

基本上,我们要做的是:

#!/usr/bin/env groovy

pipeline {
    agent any

    stages {
        stage('parent') {
            options {
                lock('resource')
            }
            stages {
                stage('build') {
                    steps {
                        parallel( 
                            'app1': { build("app1") },
                            'app2': { build("app2") },
                        )
                    }
                }

                stage('deploy') {
                    steps {
                        parallel(
                            'app1': { deploy("app1") },
                            'app2': { deploy("app2") },
                        )
                    }
                }
            }
        }
    }
}

是否有任何解决办法来实现这种行为?

这能解决您的问题吗

pipeline {
    agent any
    options {
        lock('resource')
    }
    stages {
        stage('build') {
            parallel {
                stage('app1') {
                    steps {
                        echo("build app1")
                    }
                }
                stage('app2') {
                    steps {
                        echo("build app2") 
                    }
                }
            }
        }
        stage('deploy') {
            parallel {
                stage('app1') {
                    steps {
                        echo("deploy app1")
                    }
                }
                stage('app2') {
                    steps {
                        echo("deploy app2") 
                    }
                }
            }
        }
    }
}
您可能需要更新到
这将锁定整个作业的资源。如果您想为每个并行阶段锁定资源,我建议这些阶段不是并行的

不幸的是,可能需要在跨构建共享的“全局”资源上进行锁定,比如远程测试环境。也就是说,不是针对同一构建的其他阶段进行保护,而是针对使用相同资源的其他构建进行保护。同样不幸的是,Jenkins管道的语法文档不足,似乎不允许这样做。