如何让并行的 Jenkins 作业共享有限的资源池?
How can I let parallel Jenkins jobs share a limited resource pool?
我们的项目使用 Jenkins 管道进行自动化测试和打包。管道在具有多个阶段的 Jenkinsfile
脚本中定义。多个作业(由来自不同开发分支的推送事件触发)可能 运行 并行。
现在我们需要针对资源有限的外部系统测试功能。
比方说,该系统有 10 个资源“插槽”用于测试:#1、#2、...、#10。当每个管道作业想要测试该功能时,它需要“保留”一个槽号(一个整数就足够了),然后测试程序使用槽号(如令牌或其他东西)与外部系统对话。作业完成后,它会释放号码。
Jenkins 可以吗?换句话说,Jenkins 需要为所有并行作业维护一个小整数数组。每当作业要求“插槽”编号时,它都会在数组中找到一个空闲编号并将其锁定。
我谷歌了一下,找到了一个名为“lockable resource plugin”()的Jenkins插件,但它只能做“semaphore-like”的资源管理,对我来说还不够。我不仅要知道资源有没有用完,还需要知道现在还有哪一个可用
谢谢大家!!
根据我的经验,“可锁定资源”插件非常适合这样的事情。您将为每个“插槽”定义一个编号资源,但给它们所有相同的标签。当您想要获取一个“插槽”时,您将该标签传递给管道 lock
步骤,该步骤会等到插槽可用并为您提供该插槽的名称。然后就是简单的从资源名称中提取数字了。
我正在使用类似的方案来获取测试 VM,它运行可靠。
详情:
- 安装 lockable resources plugin
- 转到管理 Jenkins > 配置系统 > 向下滚动到“可锁定资源”
- 每个插槽添加一个可锁定资源。将它们命名为“slot-1”、“slot-2”等(短划线便于稍后提取数字)。为所有这些分配相同的标签,e。 G。 “插槽”。这就是您对资源进行逻辑分组的方式。
- 使用管道代码中的
lock
步骤获取插槽。这里的关键是使用 quantity: 1
参数只获取一个插槽(默认情况下它会尝试获取与给定标签匹配的 all 资源)。当lock
步的代码块结束时会自动释放。当所有插槽都在使用时,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 管道进行自动化测试和打包。管道在具有多个阶段的 Jenkinsfile
脚本中定义。多个作业(由来自不同开发分支的推送事件触发)可能 运行 并行。
现在我们需要针对资源有限的外部系统测试功能。
比方说,该系统有 10 个资源“插槽”用于测试:#1、#2、...、#10。当每个管道作业想要测试该功能时,它需要“保留”一个槽号(一个整数就足够了),然后测试程序使用槽号(如令牌或其他东西)与外部系统对话。作业完成后,它会释放号码。
Jenkins 可以吗?换句话说,Jenkins 需要为所有并行作业维护一个小整数数组。每当作业要求“插槽”编号时,它都会在数组中找到一个空闲编号并将其锁定。
我谷歌了一下,找到了一个名为“lockable resource plugin”(
谢谢大家!!
根据我的经验,“可锁定资源”插件非常适合这样的事情。您将为每个“插槽”定义一个编号资源,但给它们所有相同的标签。当您想要获取一个“插槽”时,您将该标签传递给管道 lock
步骤,该步骤会等到插槽可用并为您提供该插槽的名称。然后就是简单的从资源名称中提取数字了。
我正在使用类似的方案来获取测试 VM,它运行可靠。
详情:
- 安装 lockable resources plugin
- 转到管理 Jenkins > 配置系统 > 向下滚动到“可锁定资源”
- 每个插槽添加一个可锁定资源。将它们命名为“slot-1”、“slot-2”等(短划线便于稍后提取数字)。为所有这些分配相同的标签,e。 G。 “插槽”。这就是您对资源进行逻辑分组的方式。
- 使用管道代码中的
lock
步骤获取插槽。这里的关键是使用quantity: 1
参数只获取一个插槽(默认情况下它会尝试获取与给定标签匹配的 all 资源)。当lock
步的代码块结束时会自动释放。当所有插槽都在使用时,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 } } } } } }