如何在Jenkins中检查executor运行状态并按条件配置环境变量与分配执行器
Jenkins Pipeline动态检查Executor状态并分配环境变量方案
以下两种实现方式可以直接匹配你的需求场景:
前置准备
提前给目标节点的两个Executor分别配置独立标签:进入节点配置页,找到「执行器」配置项,给Executor1添加标签executor-1,Executor2添加标签executor-2,即可实现执行器的精准指定。
- 方法一:通过Jenkins内置Groovy API直接查询Executor状态
需要在Jenkins「全局安全配置-进程内脚本审批」中,对用到的内部方法做手动审批。
// 自定义常量,可根据实际场景修改 def TARGET_NODE = "你的任务运行节点名称" def TARGET_JOB = "Job-A" def ENV_CONFIG = [ executor1: [WORK_PATH: "/path/to/folder1"], executor2: [WORK_PATH: "/path/to/folder2"] ] // 检查指定节点的指定执行器是否正在运行目标任务 def checkExecutorBusy(nodeName, executorIndex, jobName) { def targetNode = Jenkins.instance.getNode(nodeName) if (!targetNode) return false // 执行器编号从0开始计数,所以传入1的话取索引0 def executor = targetNode.toComputer().getExecutors()[executorIndex - 1] if (!executor || !executor.isBusy()) return false def runningTask = executor.getCurrentExecutable() return runningTask && runningTask.getParent().getFullName() == jobName } pipeline { agent none stages { stage("资源分配") { steps { script { if (checkExecutorBusy(TARGET_NODE, 1, TARGET_JOB)) { env.WORK_PATH = ENV_CONFIG.executor2.WORK_PATH env.USE_EXECUTOR_LABEL = "executor-2" } else { env.WORK_PATH = ENV_CONFIG.executor1.WORK_PATH env.USE_EXECUTOR_LABEL = "executor-1" } } } } stage("执行任务逻辑") { agent { label "${TARGET_NODE} && ${env.USE_EXECUTOR_LABEL}" } steps { echo "当前使用的工作路径:${env.WORK_PATH}" // 此处写你的实际任务逻辑 } } } }
- 方法二:使用Lockable Resources插件实现(无需脚本审批,生产环境更推荐)
提前在Jenkins全局配置的「Lockable Resources Manager」中新增两个资源:folder1-lock、folder2-lock,分别对应两个文件夹的使用权限。
pipeline { agent none stages { stage("抢占运行资源") { steps { script { // 先尝试抢占第一个文件夹的锁,抢到就用executor1 def getFirstLock = lock(resource: 'folder1-lock', skipIfLocked: true) { env.WORK_PATH = "/path/to/folder1" env.USE_EXECUTOR_LABEL = "executor-1" } // 第一个锁被占用就用第二个 if (!getFirstLock) { lock(resource: 'folder2-lock') { env.WORK_PATH = "/path/to/folder2" env.USE_EXECUTOR_LABEL = "executor-2" } } } } } stage("执行任务逻辑") { agent { label "你的任务运行节点名称 && ${env.USE_EXECUTOR_LABEL}" } steps { echo "当前使用的工作路径:${env.WORK_PATH}" // 此处写你的实际任务逻辑 } } } }
如果两个文件夹都被占用,任务会自动进入队列等待,完全匹配你要的每次任务修改独立文件夹的需求。
内容的提问来源于stack exchange,提问作者user9368716
相关产品推荐
相关产品推荐

