You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:36:03