Jenkins Pipeline中使用yq命令更新YAML文件时strenv报错求助
解决Jenkins Pipeline中yq修改YAML列表的报错问题
报错原因
你当前使用的是基于jq的旧版yq(比如python-yq),而strenv()是Go语言实现的新版mikefarah/yq特有的环境变量读取函数,旧版yq依赖的jq本身没有这个函数,因此触发报错。
解决方案
方案一:使用新版mikefarah/yq(推荐)
如果Jenkins环境允许安装或切换到mikefarah/yq,直接调整命令即可。新版yq支持env()或strenv()读取环境变量,命令写法如下:
sh "INPUT1=$Input1 INPUT2=$Input2 yq -i '.cluster.list[env(INPUT2)] += env(INPUT1)' sample.yaml"
或者保留你原来的变量名写法:
sh "a=$Input1 b=$Input2 yq -i '.cluster.list[strenv(b)] += strenv(a)' sample.yaml"
执行后,Input1的值会被追加到cluster.list下对应Input2指定的列表中(比如Input2=k1时,追加到k1的列表)。
方案二:适配旧版python-yq(无法更换yq版本时)
旧版python-yq依赖jq,需要用jq的--arg参数传递变量,同时要将待添加的元素包装为数组(避免字符串被拆分成单个字符),命令修改为:
sh "yq -i --arg input1 '$Input1' --arg input2 '$Input2' '.cluster.list[$input2] += [$input1]' sample.yaml"
--arg input1 '$Input1':将Jenkins的Input1值传递给jq的$input1变量[$input1]:确保添加的是单个元素而非字符数组$input2:直接引用jq变量定位到目标列表节点
验证示例
假设Input1=n3,Input2=k1,执行命令后sample.yaml的k1列表会更新为:
k1: - n11 - n2 - n3
内容的提问来源于stack exchange,提问作者Ranit
相关产品推荐
相关产品推荐

