jenkins - 如何让并行的 Jenkins 作业共享有限的资源池?

标签 jenkins jenkins-pipeline jenkins-plugins

我们的项目使用 Jenkins 管道进行自动化测试和打包。该管道是在具有多个阶段的 Jenkinsfile 脚本中定义的。多个作业(由不同开发分支的推送事件触发)可能会并行运行。

现在我们需要针对资源有限的外部系统测试函数。

假设该系统有 10 个用于测试的资源“槽”:#1、#2、...、#10。当每个管道作业想要测试该功能时,它需要“保留”一个槽号(只需一个整数就足够了),然后测试程序使用该槽号(如 token 或其他东西)与外部系统进行通信。当作业完成时,它会释放该号码。

在 Jenkins 中可能吗?换句话说,Jenkins 需要为所有并行作业维护一个小的整数数组。每当作业请求“槽”号时,它就会在数组中找到一个空闲号并将其锁定。

我用 Google 搜索了一下,发现了一个名为“可锁定资源插件”( Jenkins - How to handle concurrent jobs that use a limited resource pool? )的 Jenkins 插件,但它只能进行“类似信号量”的资源管理,对于我的情况来说还不够。我不仅需要知道资源是否用完,还需要知道当前哪个资源可用。

谢谢大家!!

最佳答案

根据我的经验,“可锁定资源”插件非常适合这样的事情。您可以为每个“槽”定义一个编号资源,但为它们提供相同的标签。当您想要获取一个“槽”时,您可以将该标签传递给管道锁定步骤,​​该步骤将等待直到槽可用并为您提供该槽的名称。然后只需从资源名称中提取数字即可。

我正在使用类似的方案来获取测试虚拟机,它运行可靠。

详细信息:

  1. 安装lockable resources plugin
  2. 转到“管理 Jenkins”>“配置系统”> 向下滚动到“可锁定资源”
  3. 为每个槽添加一个可锁定资源。将它们命名为“slot-1”、“slot-2”等(破折号可以方便以后提取数字)。为所有这些分配相同的标签,例如。 G。 “插槽”。这就是对资源进行逻辑分组的方式。

    Jenkins Configuration - Lockable Resources
  4. 使用lock进入管道代码以获取插槽。这里的关键是使用 quantity: 1 参数仅获取单个插槽(默认情况下,它将尝试获取与给定标签匹配的所有资源)。当lock步骤的代码块结束时,它会自动释放。当所有插槽都在使用时,锁定步骤将等待,直到下一个插槽可用。

    pipeline {
        agent any
        stages {
            stage('Stage 1') {
                steps {
                    script {
                        // Acquire a single slot
                        lock(label: 'slots', quantity: 1, variable: 'slotName') {
    
                            // Extract the slot number from the resource name                           
                            def slotNumber = slotName.split('-')[1] as int
    
                            // Code that uses the slot
    
                            echo "Acquired slot $slotNumber"                        
    
                            // Slot gets released automatically
                        }
                    }
                }
            }
        }
    }
    

关于jenkins - 如何让并行的 Jenkins 作业共享有限的资源池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69708613/

相关文章:

git - Jenkins SCM 同步配置插件不工作

jenkins - 如何测试 Jenkins 插件是否安装在 Pipeline DSL (Groovy)

android - Jenkins 和安卓模拟器 : Emulator did not appear to start; giving up

maven - Jenkins 管道构建错误 -> 未找到测试报告文件

maven - jenkins - 无法解析的父 POM 无法找到 Artifact , 'parent.relativePath' 指向错误的本地 POM

docker - Docker步骤结果记录到日志文件-Jenkins

jenkins - 在 Jenkins 阶段之间传递变量

javascript - 勒纳和 Jenkins 制定战略

linux - 非标准端口上的 Jenkins SSH 身份验证节点

git - 使用 Jenkins 管道将多个 git repos check out 到同一个作业中