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

Jenkins矩阵流水线切换代理后如何返回初始代理?

在Jenkins声明式流水线矩阵单元中切换代理后返回初始代理的解决方案

当然可以实现,不需要新增矩阵阶段,只需在需要回到初始代理的阶段显式指定初始代理的标签/节点即可,以下是适配你场景的具体实现方案。

实现思路

  • 流水线顶层指定初始代理(拉取SCM的主代理),此时该代理的节点名会被存入环境变量NODE_NAME
  • 矩阵单元内的第1阶段默认继承顶层代理,完成对应平台源码收集并通过stash暂存
  • 第2阶段显式指定对应平台的专用代理,unstash源码后执行构建,完成后再暂存二进制文件
  • 第3阶段显式指定回到初始代理,unstash二进制文件后执行分发操作

完整流水线示例

pipeline {
  agent { label 'main-agent' } // 初始主代理,负责拉取SCM源码
  stages {
    stage('多平台二进制矩阵构建') {
      matrix {
        axes {
          axis {
            name 'PLATFORM'
            values 'linux-x64', 'windows-x64', 'macos-arm64'
          }
        }
        stages {
          // 阶段1:在初始主代理收集对应平台源码
          stage('收集平台源码') {
            // 不指定agent,默认继承顶层的main-agent
            steps {
              script {
                // 根据PLATFORM变量筛选对应平台的原生源码
                sh "cp -r src/native/${PLATFORM} ./"
                stash name: "${PLATFORM}-src", includes: "${PLATFORM}/**/*"
              }
            }
          }

          // 阶段2:切换到对应平台的专用代理构建
          stage('构建原生二进制') {
            agent { label "${PLATFORM}-builder" } // 平台专用代理标签,需提前在Jenkins配置
            steps {
              unstash name: "${PLATFORM}-src"
              script {
                // 执行对应平台的构建命令
                switch(PLATFORM) {
                  case 'linux-x64':
                    sh "cd ${PLATFORM} && make"
                    break
                  case 'windows-x64':
                    bat "cd ${PLATFORM} && msbuild /p:Configuration=Release"
                    break
                  case 'macos-arm64':
                    sh "cd ${PLATFORM} && xcodebuild"
                    break
                }
                stash name: "${PLATFORM}-binary", includes: "${PLATFORM}/bin/**/*"
              }
            }
          }

          // 阶段3:回到初始主代理收集并分发二进制
          stage('收集分发二进制') {
            // 显式指定回到初始代理,用env.NODE_NAME复用顶层代理节点,适配动态分配场景
            agent { node { label env.NODE_NAME } }
            steps {
              unstash name: "${PLATFORM}-binary"
              script {
                // 执行分发/归档操作
                sh "mkdir -p artifacts && cp ${PLATFORM}/bin/* artifacts/"
                archiveArtifacts artifacts: "artifacts/*", fingerprint: true
              }
            }
          }
        }
      }
    }
  }
}

关键说明

  • 第三阶段必须显式指定agent:矩阵单元内的阶段若不声明agent,会继承上一阶段或矩阵的代理配置,因此必须明确指定回到初始代理。
  • 动态复用初始代理:使用env.NODE_NAME而非硬编码标签,适配初始代理是动态分配(比如agent any)的场景,无需修改流水线代码。
  • stash命名规范:带上PLATFORM变量前缀,避免不同矩阵单元间的文件冲突。

内容的提问来源于stack exchange,提问作者Hannes Wellmann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:15:31