首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >詹金斯按标签锁定

詹金斯按标签锁定
EN

Stack Overflow用户
提问于 2019-02-19 10:49:37
回答 1查看 7K关注 0票数 4

我想要实现的

  • 我有一个jobA,它需要一台机器上的一个执行器。
  • 我有一个jobB,它需要在同一台机器上的两个执行器和X机器上的一个执行器。
  • 我希望他们能够使用相同的机器(而不是同时使用) ->,他们现在使用的是不同的机器。
  • 他们所有的任务都使用100%的CPU。因此,没有两个构建可以同时存在于同一台机器上。

我是如何处理这个问题的

  • 由于jobB在单个节点上至少需要2个执行器,而jobA需要1,所以我需要将每个节点上的执行器数更改为2个。
  • 应该有一个锁定机制,以便如果jobAjobB构建在节点上运行,则没有jobAjobB构建可以在其上启动。

我所做的

我把机器上的执行者从1人改为2人。

解决方案1:锁定资源

jobA的计划中,我有:

代码语言:javascript
复制
node('windows-agent-label') {
    lock("${env.NODE_NAME}-exclusive") {
        //...
    }
}

运行这项工作(第一次)给我的是:

代码语言:javascript
复制
[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]

第二次(第一次还在建造):

代码语言:javascript
复制
[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() one之外,我还没有env.NODE_NAME,所以锁无法工作。

显然还有另外一种方法。

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

我有一个名为windows-agent-label的标签,它包含两个节点:build1build2

jobA的计划中,我有:

代码语言:javascript
复制
lock(label: 'windows-agent-label', quantity: 1) {
    node('windows-agent-label') {
        //...
    }
}

管理这份工作给了我:

代码语言:javascript
复制
[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

问题

  • 为什么它找不到可用的资源?我是不是滥用了它?
  • 我在正确的方向上?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-20 14:28:19

解决方案

lock文档中,缺少(无文档)参数:variable。当与label一起使用时,它将获得的锁的名称存储到env变量中。

在此失踪:https://plugins.jenkins.io/lockable-resources

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

代码语言:javascript
复制
lock(label: 'windows-agent-label', quantity: 1, variable: 'LOCK_NAME') {
    node(env.LOCK_NAME - '-exclusive') {
        //...
    }
}

因此,这要求从所有在某个标签下的锁。它们总是(根据选择)形成为${NODE_NAME}-exclusive。如果我不能锁定资源,那就意味着他们都用光了。如果我得到一个,那就意味着NODE_NAME (可能是build1build2,.)是可用的。所以,我转到给定的节点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54764464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档