在詹金斯中并行运行两个管道时出现死锁

2024-01-07

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

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

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

我尝试设置“disableConcurrentBuilds()”,但这只会阻止同名的管道。多分支管道中不同名称的管道可以同时运行。

第二次尝试是使用 Jenkinsfile 中的此代码设置 Build Blocker Plugin。

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

但后来我收到此错误消息。

WorkflowScript:30:选项类型“属性”无效。有效选项 类型:[buildDiscarder、catchError、checkoutToSubdirectory、 禁用并发构建、禁用恢复、耐久性提示、锁定、 newContainerPerStage、overrideIndexTriggers、重试、脚本、 SkipDefaultCheckout、skipStagesAfterUnstable、超时、waitUntil、 withContext, withCredentials, withEnv, ws] @ 第 30 行,第 4 列

如何在 Jenkinsfile 中为整个管道设置 BuildBlockerProperty? 在管道运行期间,是否有其他方法可以阻止所有其他管道?

谢谢你的帮助。


遇到同样的问题。

您没有提供 Jenkinsfile,但如果您的管道需要 1 个执行器节点来运行管道,并需要 1 个附加节点来执行作业,那么您可能在管道级别和阶段级别设置了一个代理,例如

pipeline {
  agent any

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

    steps {
      ...
    }
  }

  post {
    always {
      ...
    }
  }
}

就像我一样。当然,您的具体代理设置可以有很大不同,但代理设置为 2 个级别。除了阶段之外,我还必须指定管道级代理的原因是因为否则我的post步骤不会运行。

如果您的管道需要在阶段级别进行特定代理设置(标签、docker 映像等),则最佳实践是设置agent none在管道级别:

pipeline {
  agent none

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

    steps {
      ...
    }
  }
}

这样只需要 1 个执行器节点,从而防止死锁。

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

pipeline {
  agent none

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

    steps {
      ...
    }
  }

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

为其提供一个节点。该标签是强制性的,尚未找到在任何节点上运行它的方法。添加node{}集团允许post运行的块agent none设置在管道级别。

这对我有用,并且可能是OP的解决方案。 OP 中没有提供足够的信息来了解管道的具体配置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在詹金斯中并行运行两个管道时出现死锁 的相关文章

随机推荐