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

在jenkins中并行运行两个管道时出现死锁

公孙成仁
2023-03-14

目前我有以下问题。我已经编写了一个Jenkinsfile来在管道中构建我的存储库。每个存储库在多分支管道中都有自己的管道。每当我推动存储库时,管道就会开始工作。

对于这个建筑,我有一个带有两个节点的代理。当多分支管道运行时,多分支管道使用一个节点来执行单个管道,第二个节点由当前正在执行的管道使用来运行单个作业。

当两个管道同时运行时,两个管道都使用一个节点。但是现在的问题是两个管道都无法启动任何作业,因为所有节点都被占用了。此时我有一个死锁,因为两个管道都在等待它们的作业的空闲节点。

我尝试过设置“disableContoptBuilds()”,但这只是阻止了同名的Pipeline。多分支管道中不同名称的管道可以并发运行。

第二次尝试是在Jenkinsfile中使用此代码设置Build Blocker插件。

properties([
    [$class: 'BuildBlockerProperty',
     blockLevel: 'GLOBAL',
     blockingJobs: '*pipeline_Test*',
     scanQueueFor: 'ALL',
     useBuildBlocker: true],
   disableConcurrentBuilds()
   ])

但后来我收到了这个错误消息

工作流脚本:30:无效的选项类型“属性”。有效的选项类型:[buildDiscarder,catchError,checkoutToSubdirectory,disableConcurrentBuilds,disableResume,durabilityHint,lock,newContainerPerStage,overrideIndexTriggers,retry,script,skipDefaultCheckout,skipStagesAfterUnstable,timeout,waitUntil,withContext,withCredentials,withEnv,ws] @第30行,第4列

如何在Jenkins文件中为整个管道设置BuildBlockerProperty?如果管道在运行,是否有其他方法阻止所有其他管道?

谢谢你的帮助。

共有3个答案

姜羽
2023-03-14

使用“锁定”可锁定阶段或步骤。这将阻止在多分支管道中对每个分支进行并行构建。

stage("Do stuff") {
  lock("my_lock") {

    // do stuff

  } // resource is unlocked.
}
许博
2023-03-14

最简单的解决方法是将执行程序的数量增加一个,确保执行程序总是比父作业多一个。

这样,将始终有一个执行器可用或一个子作业正在运行,这将完成并释放执行器。

您可以在ManageJenkins中设置执行器

但是这不是一个完整的解决方案,因为每次添加作业时都需要这样做。

颛孙飞鸾
2023-03-14

在同一个问题上挣扎。

您没有提供Jenkinsfile,但是如果您的管道需要1个executor节点来运行管道,还需要1个额外的节点来执行作业,那么您可能需要在管道级别和阶段级别设置代理,例如

pipeline {
  agent any

  stage('Build') {
    agent {
      label 'my label'
    }

    steps {
      ...
    }
  }

  post {
    always {
      ...
    }
  }
}

正如我所做的。当然,您的特定代理设置可能会非常不同,但代理设置为2个级别。我必须在阶段之外指定管道级代理的原因是因为否则我的post步骤将无法运行。

如果您的管道需要特定的代理设置(标签、docker图像,...)在阶段级别,最佳做法是在管道级别设置< code >代理无:

pipeline {
  agent none

  stage('Build') {
    agent {
      label 'my label'
    }

    steps {
      ...
    }
  }
}

这样只需要一个执行器节点,从而避免了死锁。

如果你像我一样需要一个< code>post步骤,你可以这样运行它

pipeline {
  agent none

  stage('Build') {
    agent {
      label 'my other label'
    }

    steps {
      ...
    }
  }

  post {
    always {
      node('label') {
        ...
      }
    }
  }
}

以向其提供节点。该标签是强制性的,尚未找到在任何节点上运行它的方法。添加<code>节点{}

这对我很有效,可能是OP的解决方案。OP中没有给出足够的信息来了解管道的具体配置。

 类似资料:
  • Jenkins管道插件如何运行并行任务 我是jenkins的初学者,我想使用管道插件在jenkins的可用从节点上并行启动一些任务。 我安装了管道插件并在下面的管道内联脚本部分中添加了。 注意:主节点和从站1是我的节点 理想情况下,第一分支和第二分支是什么???? 控制台输出: 由用户匿名[Pipeline]parallel[Pipele][firstBranch]{(Branch:firstBr

  • 问题内容: 在groovy脚本中(用于jenkins管道):如何运行命令而不是命令? 我尝试了以下方法: 在通话中致电“ ” : 将呼叫替换为呼叫: 附加信息: 我的命令比命令更复杂。 问题答案: 您提供的Groovy脚本正在将结果脚本中的第一行格式化为空白行。shebang告诉脚本使用/ bin / bash而不是/ bin / sh运行,它需要位于文件的第一行,否则它将被忽略。 因此,您应该这

  • 我让Jenkins在docker内部运行aws ec2实例。我正在使用以下命令启动Jenkins: 以下是我的文件: 在Jenkins作业日志中,当我运行作业时,我得到。如果我删除了第一阶段的“Docker权限”,那么我将开始获得以下。 /var/jenkins_home/workspacetest@tmp /durable-12345/script.sh: 1: /var/jenkins_hom

  • 问题内容: 我能够运行以下shell脚本,但无法从Jenkins管道代码运行。 尝试1。 输出: 尝试2: 尝试过sh“”“ 输出 : 美元符号后的非法字符串体字符;解决方案:要么转义文字美元符号,要么将值表达式括起来 有人能帮我吗? 问题答案: 这应该工作。 您还需要在调用下面的新subshel​​l时转义$

  • 问题内容: 请注意: 这个问题是基于旧的,现在称为“脚本化”管道格式的。使用“声明性管道”时,可以将并行块嵌套在阶段块内部(请参阅带有声明性管道1.2的并行阶段)。 我想知道Jenkins工作流/管道插件,特别是并行步骤应该如何工作。如何将它们与构建阶段混合使用。我了解一般模式: 但是,我想并行运行几个阶段(在具有多个执行程序的同一节点上),因此我尝试添加以下阶段: 这不能按预期方式工作。“执行任

  • 我有一个Jenkinsfile,其中构建和测试在同一个Slaver上运行。我的要求是,构建必须在一个从站(比如A)上,测试必须在另一个从站(比如B)上运行。 我刚刚设置了奴隶B,我可以看到我的奴隶A和B都在Jenkins- 以下是看到的问题: 1.)在构建阶段成功后,我得到以下错误: " java.lang.NoSuchMethodError:在步骤[archive,bat,build,catch