如何将节点作为代理运行stage内脚本并在stage中添加agent标签
实现方法
你可以根据实际需求选择以下两种方案:
1. 为整个Stage指定运行代理标签(声明式Pipeline标准写法)
直接在Stage定义块内部添加agent标签,标记该Stage的默认运行节点,你的原有并行逻辑可以保留在steps中:
pipeline { agent none // 全局不指定代理,由各Stage单独配置 stages { stage('多节点并行执行Python脚本') { // 在Stage内部添加agent标签,填写你需要的节点标签即可 agent { label '你的目标节点标签' } steps { script { last_started = env.STAGE_NAME try{ def branches = [:] def names = FAW_HOSTS.split(',') for (int i=0; i<names.size(); ++i) { def nodeName = names[i] branches[nodeName] = { node(nodeName) { echo "Running patch oci vmscript.." def exec = sh(script:"python $source_code_loc/patch_oci_vm.py $WORK_DIR", returnStdout:true).trim() echo "$exec" } } } parallel branches } catch (Exception e) { currentBuild.result='FAILURE' echo "当前构建状态为 ${currentBuild.result}" echo "执行失败:${e}" error "Run_task_on_multiple_host 阶段执行失败!" } } } } } }
提示:Stage层的
agent标签只会指定该Stage初始运行的代理节点,你代码中用来分发并行任务的node(nodeName)块不受影响,依然会正常调度到对应目标节点执行Python脚本。
2. 并行任务直接按标签匹配节点
如果你的并行任务不需要绑定固定节点名,只要匹配对应标签的节点即可运行,可以直接把标签作为参数传入node方法,无需提前拆分节点名称列表:
// 示例:按标签调度并行任务 def branches = [:] // 填写你需要匹配的节点标签列表 def targetNodeLabels = ['oci-vm-worker', 'python-runtime'] targetNodeLabels.each { label -> branches["标签${label}节点执行任务"] = { // 直接传入标签,Jenkins会自动调度到符合标签条件的空闲节点 node(label) { echo "Running patch oci vmscript.." def exec = sh(script:"python $source_code_loc/patch_oci_vm.py $WORK_DIR", returnStdout:true).trim() echo "$exec" } } } parallel branches
关键说明
- 声明式Pipeline的
agent { label 'xxx' }写法仅作用于当前Stage的默认运行环境,是官方推荐的Stage级代理标记方式 - 脚本式的
node('xxx')方法传入的参数同时支持节点名和节点标签,只要节点配置了对应标签就可以正常调度
内容的提问来源于stack exchange,提问作者Saro
相关产品推荐
相关产品推荐

