Jenkins 按标签锁定

标签 jenkins jenkins-pipeline jenkins-plugins

我正在努力实现的目标

  • 我有 jobA在一台机器上需要 1 个执行程序。
  • 我有 jobB在同一台机器上需要 2 个执行程序,在 X 机器上需要 1 个执行程序。
  • 我希望他们能够使用相同的机器(虽然不是同时使用)-> 他们目前使用不同的机器。
  • 他们所有的任务都使用 100% 的 CPU。因此,同一台机器上不能同时存在两个构建。

  • 我是如何解决问题的
  • 因为 jobB单个节点上至少需要 2 个执行程序,并且 jobA需要 1,我需要将执行程序的数量更改为每个节点有 2 个。
  • 应该有一个锁定机制,以便如果 jobAjobB build 在节点上运行,没有 jobA也不是 jobB可以开始构建。

  • 我所做的

    我将机器上的执行程序数量从 1 更改为 2。

    解决方案 1:锁定资源

    jobA的管道,我有:
    node('windows-agent-label') {
        lock("${env.NODE_NAME}-exclusive") {
            //...
        }
    }
    

    运行工作(第一次)给了我:
    [Pipeline] Start of Pipeline
    [Pipeline] node
    Running on build1 in J:\jenkins\workspace\jobA
    [Pipeline] {
    [Pipeline] lock
    Trying to acquire lock on [build1-exclusive]
    Resource [build1-exclusive] did not exist. Created.
    Lock acquired on [build1-exclusive]
    

    第二次(当第一个仍在构建时):
    [Pipeline] Start of Pipeline
    [Pipeline] node
    Running on build1 in J:\jenkins\workspace\jobA@2
    [Pipeline] {
    [Pipeline] lock
    Trying to acquire lock on [build1-exclusive]
    Found 0 available resource(s). Waiting for correct amount: 1.
    [build1-exclusive] is locked, waiting...
    

    有用!第二个构建被阻塞,直到第一个构建释放锁。然而,第二个已经被分派(dispatch)到节点并使用一个执行器槽 .真的不好看!如果我移动 lock() node() 之外的指令一,我没有env.NODE_NAME但是,所以锁不能工作。

    看来,还有一个办法……

    解决方案 2:通过请求标签锁定

    我有一个名为 windows-agent-label 的标签其中包含 2 个节点:build1build2 .

    jobA的管道,我有:
    lock(label: 'windows-agent-label', quantity: 1) {
        node('windows-agent-label') {
            //...
        }
    }
    

    运行这项工作给了我:
    [Pipeline] Start of Pipeline
    [Pipeline] lock
    Trying to acquire lock on [Label: windows-agent-label, Quantity: 1]
    Found 0 available resource(s). Waiting for correct amount: 1.
    [Label: windows-agent-label, Quantity: 1] is locked, waiting...
    

    绝对没有任何东西在运行 build1 .

    我所有的 /lockable-resources/FREE .

    问题
  • 为什么找不到可用的资源?我滥用了吗?
  • 我是在正确的方向吗?
  • 最佳答案

    解决方案

    lock文档,缺少(未记录的)参数:variable .与 label 一起使用时,它存储到 env variable 获取的锁的名称。

    此处缺少:https://plugins.jenkins.io/lockable-resources

    在那里可见:https://issues.jenkins-ci.org/browse/JENKINS-40997

    lock(label: 'windows-agent-label', quantity: 1, variable: 'LOCK_NAME') {
        node(env.LOCK_NAME - '-exclusive') {
            //...
        }
    }
    

    因此,这会请求某个标签下的所有锁。它们总是(通过选择)形成为 ${NODE_NAME}-exclusive .如果我无法锁定资源,则意味着它们都已用完。如果我得到一个,那就意味着 NODE_NAME (可能是 build1build2 ,...)可用。所以,我去给定的节点。

    关于 Jenkins 按标签锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54764464/

    相关文章:

    jenkins - 什么时候需要在 Jenkins 管道的阶段内使用节点

    python - Jenkinsfile 语法 - 是否有共享 python 构建步骤的 DRY 示例?

    linux - Jenkins 异常

    api - 如何使用API​​更新 Jenkins 工作

    Jenkins Pipeline sh 显示名称/标签

    jenkins - 为什么 jenkinsfile 会以这种方式使用闭包?

    jenkins - 在 Jenkins 作业中显示工作区下文件的时间戳

    groovy - 如何使用 groovy 创建和配置新的 Jenkins 作业?

    jenkins - 如何捕获 Jenkins 作业中止操作

    Jenkins - 如何将环境变量从自由式作业传递到管道作业