jenkins - 在 Jenkins 中锁定并行阶段

标签 jenkins groovy jenkins-plugins jenkins-pipeline

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

但是,我们发现锁定阶段需要 nesting the stages in a parent并且并行步骤只能包含在顶级阶段: 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") 
                    }
                }
            }
        }
    }
}

您可能需要更新到 latest pipeline code 这会锁定整个作业的资源。如果您想锁定每个并行阶段的资源,我建议阶段不并行

关于jenkins - 在 Jenkins 中锁定并行阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52535044/

相关文章:

linux - Jenkins maven 构建在 linux 机器中失败

api - 是否有任何 Jenkins API 来获取 Artifact 名称并下载它?

git - 每 2 小时触发一次 Jenkins 构建,但前提是有 git 提交

java - 来自 Groovlet (Groovy Servlet) 的 JSP PageContext

spring - grails:spring:resources.groovy - 使用和不使用 ref() 引用 bean 之间有什么区别

c# - 如何将 Jenkins s3 发布插件用于每个构建的相同位置?

android - 为工作区中的每个项目创建 ant build.xml 文件

git - Jenkins:从另一个存储库而不是我要构建的存储库加载 Jenkinsfile

python-2.7 - 如何使用 python-jenkins 检索 jenkins 作业的最后一个控制台输出?

json - Jenkins:使用声明性语法从 Jenkinsfile 导入外部包