共享开发机上的Jenkins pipeline如何提前检测本地资源占用并选可用节点
Jenkins共享内存资源节点自动调度解决方案
方案一:全局节点健康检测配置
该方案无需修改现有流水线代码,全局生效:
- 进入Jenkins管理后台 → 节点管理 → 选中需要配置的开发机节点,进入编辑页
- 在「启动方法」的高级设置区域,找到「节点就绪前执行的脚本」输入框,填入检测逻辑:
# 替换为你实际使用的资源占用标记文件路径 if [ -f /data/shared_mem.lock ]; then # 资源被占用时返回非0值,Jenkins会将该节点标记为离线,不会分配任务 exit 1 fi
- 配置节点离线后的自动重试上线间隔,建议设置为30~60秒,本地用户释放资源后节点会自动恢复可用状态
方案二:流水线内置节点检测逻辑
如果需要保留节点运行其他不需要共享内存的任务,只针对测试类流水线做资源检测,可以在流水线内实现节点轮询筛选:
pipeline { agent none stages { stage('筛选可用测试节点') { steps { script { // 配置所有可供测试使用的节点列表 def candidateNodes = ["dev-machine-1", "dev-machine-2", "dev-machine-3"] def targetNode = null // 遍历所有候选节点检测资源状态 for (nodeItem in candidateNodes) { def nodeFree = node(nodeItem) { // 检测标记文件不存在则返回0,代表节点可用 sh returnStatus: true, script: "test ! -f /data/shared_mem.lock" } == 0 if (nodeFree) { targetNode = nodeItem break } } if (!targetNode) { error "当前无可用测试节点,请等待资源释放后重试" } // 保存可用节点到环境变量,供后续阶段使用 env.SELECTED_NODE = targetNode } } } // 后续所有测试阶段都绑定到筛选出的可用节点执行 stage('执行测试') { agent { node { label "${env.SELECTED_NODE}" } } steps { // 原有测试逻辑 echo "在节点${env.SELECTED_NODE}上执行测试任务" } } } }
- 可根据业务需要调整重试逻辑,比如添加循环等待资源释放,设置合理的超时时间避免任务无限等待
- 可自定义节点筛选顺序,添加负载均衡逻辑避免单节点任务过多
内容的提问来源于stack exchange,提问作者Aquiles Gomez
相关产品推荐
相关产品推荐

