我正在努力实现的目标
jobA
在一台机器上需要 1 个执行程序。 jobB
在同一台机器上需要 2 个执行程序,在 X 机器上需要 1 个执行程序。 我是如何解决问题的
jobB
单个节点上至少需要 2 个执行程序,并且 jobA
需要 1,我需要将执行程序的数量更改为每个节点有 2 个。 jobA
或 jobB
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 个节点:build1
和 build2
.在
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
(可能是 build1
, build2
,...)可用。所以,我去给定的节点。
关于 Jenkins 按标签锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54764464/