詹金斯按标签锁定

问题描述 投票:0回答:1

What I'm trying to achieve

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

How I'm tackling the problem

  • 因为jobB在单个节点上需要至少2个执行程序而jobA需要1,所以我需要将执行程序的数量更改为每个节点2个。
  • 应该有一个锁定机制,以便如果jobAjobB构建在一个节点上运行,那么没有jobAjobB构建可以从它开始。

What I've done

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

Solution 1: Locking the resource

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...

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

显然,还有另一种方式......

Solution 2: Locking by requesting a label

我有一个名为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

Questions

  • 为什么找不到可用的资源呢?我滥用了吗?
  • 我正朝着正确的方向前进?
jenkins jenkins-pipeline jenkins-plugins
1个回答
0
投票

The solution

lock文档中,有一个缺失的(未记录的)参数:variable。当与label一起使用时,它会将获取的锁的名称存储到env变量中。

在这里缺席: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,......)可用。所以,我去了给定的节点。

© www.soinside.com 2019 - 2024. All rights reserved.