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

Jenkins管道迭代时将shell输出重定向到环境变量报错如何解决

问题原因

这个报错本质是Jenkins流水线的CPS执行引擎的序列化限制导致的:

  • Jenkins会在执行流水线步骤(比如你用到的sh)时,对当前运行上下文做序列化持久化,避免节点异常导致状态丢失
  • Groovy的ArrayList.each()方法用到的迭代器java.util.ArrayList$Itr默认不可序列化,闭包内调用sh步骤需要挂起等待执行结果时,上下文序列化失败就抛出了这个异常
解决方案

方案1:替换成普通for循环遍历(最简便,直接兼容原有逻辑)

把.each遍历改为原生for循环即可,for循环的迭代逻辑不需要用到不可序列化的迭代器对象:

for (def key in envContentKeys) {
    env."${key}" = sh(
        script: "jq -r '.${params.environment}.${key}' config.json",
        returnStdout: true
    ).trim()
}

方案2:优化为单次读取配置(效率更高,减少sh调用次数)

先一次性把对应环境的所有配置读取为JSON对象,再批量赋值,不需要循环调用sh:

// 先一次性读取对应环境的全部配置
def envConfig = readJSON file: 'config.json'
def targetConfig = envConfig[params.environment]
// 遍历赋值
for (def key in envContentKeys) {
    env."${key}" = targetConfig[key].toString()
}

注意:使用readJSON需要提前安装Jenkins的Pipeline Utility Steps插件,如果未安装可以保留sh调用,先一次性用jq把目标环境的所有配置输出为键值对格式再解析赋值。

内容的提问来源于stack exchange,提问作者BTH.S3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:39:02