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
相关产品推荐
相关产品推荐

