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

Jenkins声明式流水线中如何拆分列表为独立值生成动态阶段

问题解决方法

问题原因

通过sh步骤returnStdout参数返回的结果为字符串类型,直接遍历会按单个字符迭代,因此会出现逐字符拆分的异常结果,需要先将字符串转换为Groovy列表再遍历。

推荐方案:JSON解析(稳定性最高)

该方案通过标准格式交互,避免特殊字符导致的拆分异常,需要先调整Python脚本输出标准JSON格式:

1. 修改list.py输出

import json
# 输出标准双引号格式的JSON,适配解析规则
print(json.dumps(['test1', 'test2', 'test3']))

2. 调整Jenkins流水线代码

声明式流水线中动态生成阶段需要包裹在script块内,完整代码如下:

pipeline {
    agent any
    stages {
        stage('预执行') {
            steps {
                script {
                    // 读取Python输出并去除首尾换行、空白符
                    def rawOutput = sh(script: "python3 list.py", returnStdout: true).trim()
                    // 解析JSON为Groovy列表
                    def stageList = new groovy.json.JsonSlurper().parseText(rawOutput)
                    // 遍历列表生成动态阶段
                    for (def stageName in stageList) {
                        stage(stageName) {
                            echo stageName
                        }
                    }
                }
            }
        }
    }
}

替代方案:字符串拆分(无需修改Python脚本)

如果不方便调整Python输出,可直接对原始字符串做格式化拆分,适合输出格式固定的场景:

script {
    def rawOutput = sh(script: "python3 list.py", returnStdout: true).trim()
    // 移除首尾[]、替换单引号、按逗号拆分后清洗每个元素的空白符
    def stageList = rawOutput[1..-2].replace("'", "").split(',').collect { it.trim() }
    // 后续遍历生成阶段逻辑和上方一致
    for (def stageName in stageList) {
        stage(stageName) {
            echo stageName
        }
    }
}

注意事项

  • 不要直接用索引遍历原始字符串输出,避免回到逐字符拆分的问题
  • 动态阶段生成逻辑必须放在script块内,否则声明式流水线会报语法错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:06:05