我们的项目使用 Jenkins 管道进行自动化测试和打包。该管道是在具有多个阶段的 Jenkinsfile 脚本中定义的。多个作业(由不同开发分支的推送事件触发)可能会并行运行。
现在我们需要针对资源有限的外部系统测试函数。
假设该系统有 10 个用于测试的资源“槽”:#1、#2、...、#10。当每个管道作业想要测试该功能时,它需要“保留”一个槽号(只需一个整数就足够了),然后测试程序使用该槽号(如 token 或其他东西)与外部系统进行通信。当作业完成时,它会释放该号码。
在 Jenkins 中可能吗?换句话说,Jenkins 需要为所有并行作业维护一个小的整数数组。每当作业请求“槽”号时,它就会在数组中找到一个空闲号并将其锁定。
我用 Google 搜索了一下,发现了一个名为“可锁定资源插件”( Jenkins - How to handle concurrent jobs that use a limited resource pool? )的 Jenkins 插件,但它只能进行“类似信号量”的资源管理,对于我的情况来说还不够。我不仅需要知道资源是否用完,还需要知道当前哪个资源可用。
谢谢大家!!
最佳答案
根据我的经验,“可锁定资源”插件非常适合这样的事情。您可以为每个“槽”定义一个编号资源,但为它们提供相同的标签。当您想要获取一个“槽”时,您可以将该标签传递给管道锁定步骤,该步骤将等待直到槽可用并为您提供该槽的名称。然后只需从资源名称中提取数字即可。
我正在使用类似的方案来获取测试虚拟机,它运行可靠。
详细信息:
- 安装lockable resources plugin
- 转到“管理 Jenkins”>“配置系统”> 向下滚动到“可锁定资源”
- 为每个槽添加一个可锁定资源。将它们命名为“slot-1”、“slot-2”等(破折号可以方便以后提取数字)。为所有这些分配相同的标签,例如。 G。 “插槽”。这就是对资源进行逻辑分组的方式。
- 使用
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/