Jenkins资源锁:获取多个Node特定资源的锁

时间:2019-06-27 07:34:56

标签: jenkins locking jenkins-pipeline

我想为某个节点创建多个资源,或者为多个节点使用可重用的类型。

在这种情况下,它是“ RAM要求”,因此资源名称例如将是1GBRAM。或者,如果我需要在每个节点的基础上指定1GBRAM_Nodexy

最后,我想根据作业在此节点上消耗的内存峰值来限制并发作业的数量,以避免由于服务器内存不足而导致挂起。而且我可以设置可供执行者使用的RAM数量。

不同的节点将具有不同的RAM数量,并且各个作业具有不同的RAM要求。

所以我想为每个作业配置其RAM要求

lock(resource: '1GBRAM_Nodexy', quantity: 8)

使用管道和可锁定的资源可以实现吗?

是否有另一种更好的方法来实现这一目标?理想情况下,可以在选择从属节点并选择最合适的节点之前检查锁定。

阅读有关资源锁和标签的信息。我没有找到任何特定于Node的部分,也没有可能获得同一资源的多个项目。

lock(resource: '1GBRAM_Nodexy', quantity: 8)

我希望每次运行作业都可以在使用的从属节点上锁定相等数量的RAM。如果没有足够的“ RAM”单元,则作业不会在这样的节点上运行。

1 个答案:

答案 0 :(得分:0)

我认为您不能完全满足您的需求,但是也许您可以接近。

首先,您要使用label而不是resource。您将定义具有1RAM表示数量的1GB资源(例如GB1GB2GB3等),并赋予它们相同的标签(例如GB),然后使用诸如此类的lock语句(例如,如果有问题的作业需要4GB内存):

lock(label: 'GB', quantity: 4)

这将锁定具有此标签GB的4个资源,如有需要,请等待直到能够这样做,然后在离开lock ed范围时释放它们。您也可以

特定于节点的锁定是比较棘手的部分。如果您对每个节点使用不同的标签(NodeA_GBNodeB_GB等),满意,并且将作业“固定”到特定节点,则上述解决方案将是足够,例如:

// Require 4GB of memory on NodeA
lock(label: 'NodeA_GB', quantity: 4) 

我不知道要怎么做,就是选择一个特定的节点,因为它有可用的RAM。也就是说,“您的锁可以在选择从属之前被检查,然后选择最适合的节点”语句。但是您至少可以使用agent来检测由常规env.NODE_NAME语句分配的节点,然后将其用作特定于节点的锁标签的一部分:

agent any
stages {
  stage('Build') {
    steps {
      // This assumes that all possible nodes have a label like this defined with their name in it
      lock(label: "${NODE_NAME}_GB", quantity: 4) {
        // ... build steps  
      }
    }
  }
}

顺便说一句,我自己使用的是label + quantity方法,但是为了实现基于lock的限制-限制了多分支管道作业的所有分支上并发构建的总数-自{ {3}}插件似乎已不再维护,并且有一些Throttle Concurrent Builds