当前位置: 首页 > 知识库问答 >
问题:

如何限制Jenkins跨分支的并发多分支管道构建?

锺离声
2023-03-14

有人知道如何使用跨分支的多分支作业中设置的声明性管道来限制并发构建吗?

每当我们为某个阶段设置代理时,就会分配一个新的执行者。这会导致死锁,例如,当您为尽可能多的分支同时触发生成时,您有执行者。不设置代理会导致阶段随机选择执行者,这是不可接受的,因为某些阶段需要在某些代理上运行。。。

经典的方法不起作用:

  • Throttle并发构建插件不适用于多分支
  • 设置属性([disableConcurrentBuilds()])仅限制每个分支的并发性
  • 锁定步骤需要管道根中的代理无以防止分配执行器,但这阻碍了我们的全局post块执行suff,因为它需要代理,并且显然无法为post块设置代理

共有1个答案

宇文俊明
2023-03-14

这个问题有点老了,我不确定当时是否存在解决方案,但如果在每个阶段都设置了代理,那么它不应该死锁,除非您依赖于另一个使用代理的构建。执行以下部分还将在与相应阶段中指定的代理相同的节点上执行post块。我还在末尾添加了另一个管道post部分,如果您必须为整个管道运行post块,并且需要在前一阶段使用的同一代理上运行它,则可能需要该部分。希望这有帮助!

def agentNameStage2 = null
pipeline {
    agent none
    stages {
        stage("Stage 1") {
            agent { label "somelabel" }
            steps {
                println getContext(hudson.model.Node)
            }
        }
        stage("Stage 2") {
            agent { label "anotherlabel" }
            steps {
                script {
                    def agentStage2 = getContext(hudson.model.Node)
                    println agentStage2

                    // Either use this hack or add whitelist hudson.model.Node getNodeName and use agentStage2.nodeName
                    //agentNameStage2 = agentStage2.nodeName // <-- Best method that needs whitelisting or to run as trusted
                    agentNameStage2 = agentStage2.toString().replaceAll('.*?\\[', '').replaceAll('\\]$', '')
                }
            }
            post {
                always {
                    // Running on an agent with "anotherlabel"
                   println getContext(hudson.model.Node)
                }
            }
        }
    }

    post {
        always {
            script {
                if(agentNameStage2) {
                    // Note this doesn't guarantee the same workspace as was used in the above Stage 2 section
                    node (agentNameStage2) {
                        println "Pipeline post is running on: " + getContext(hudson.model.Node)
                    }
                } else {
                    // Handle else case
                }
            }
        }
    }
}
 类似资料:
  • 问题内容: 我正在利用多分支管道工作流,在Jenkins中将并发构建的数量限制为特定数量,但是在docs或google中找不到任何好的方法。 一些文档说这可以在Jenkinsfile步骤中使用并发来完成,但是我在其他地方也读过,这是不推荐使用的方式。 似乎最近发布了一些用于限制并发通过的东西,但是我找不到它的文档,并且在遵循代码时遇到了麻烦。我唯一发现的PR显示以下内容: 但是我很难让它工作。 是

  • 我正在考虑在Jenkins中将并发构建的数量限制在一个特定的数量,利用多分支管道工作流,但在docs或google中还没有找到任何好的方法来做到这一点。 一些文档说这可以在Jenkinsfile的步骤中使用并发来完成,但我在其他地方也读到这是一种不推荐的方式。 看起来最近发布了一些通过作业属性限制并发性的东西,但我找不到相关文档,而且我在遵循代码方面遇到了问题。我发现的唯一一件公关展示了以下内容:

  • 是否可以将多分支管道限制为一次只构建一个分支? 我有一个管道,它包含签出、构建、测试,然后部署的步骤。部署阶段在特定的机器上复制/执行一些文件,这些工作无法与其他分支作业并行完成。 我尝试过: 但这只限制了基于分支的并发,因此仍然有多个分支将并行运行。 此外,在常规非流水线Jenkins作业中,有一个选项复选框: “必要时执行并发生成” 但这在多分支配置中也不可用。 是否有其他配置来实现这一点,或

  • 对于一个新项目,我想使用Jenkins CI的新管道功能。我们的Git存储库中有几个分支,应该以同样的方式进行测试。它还应该自动跟踪和处理新的分支。因此,我创建了一个多分支管道作业。但它的配置有两个问题: 1) 为了被Jenkins标记为有效,分行需要一个“Jenkinsfile”。如果这不存在,詹金斯将忽略该分支。有没有办法标记与模式匹配的所有分支,而不需要在其中包含此文件? 2) 每个分支都应

  • 我对使用Jenkins文件和GIT插件的Jenkins多分支pipleline有一个问题。 问题是,每次向暂存分支推送都会触发master管道。所需的行为是,推送到暂存分支仅触发用于暂存的管道,而推送到主分支仅触发主管道 这是我的詹金斯档案 我将分享一些日志:这是主分支的日志 这是主分支的日志,但只有暂存有一个新的提交: 注意“已发现更改”,即使主分支上的头未更改 詹金斯·弗。2.190.1 Gi

  • 我有一个Jenkins管道作业(不是多分支管道),管道内的逻辑之一是,当gitlab scm上有一个合并请求时,我想基于触发此生成的合并请求的源分支构建一些东西。 我的问题是,在Jenkinsfile中,我如何动态地获取这个源分支,签出代码,并创建一个工作区,以便在这个分支上运行构建?