无法在 Jenkins 管道中使用 bash 进行循环
Not able to use for loop using bash in Jenkins pipeline
以下是我的代码
def jsonObj;
jsonObj = readJSON file: 'vars.json'
sh "gcloud container clusters get-credentials ${jsonObj.cluster_name} --zone ${jsonObj.zone} --project ${jsonObj.project}"
sh "echo ${jsonObj.ns}"
sh "kubectl get nodes"
sh "for i in ${jsonObj.ns}; do kubectl create namespace $i; done"
变量文件'vars.json'如下图
"ns": ["dev","qa","sbx"]
但是当我执行管道时,变量的值与其他字符一起提取,因此后续操作失败
+ echo '[dev,' qa, 'sbx]'
[dev, qa, sbx]
+ for i in '[dev,' qa, 'sbx]'
+ kubectl create namespace '[dev,'
The Namespace "[dev," is invalid: .
有什么解决这个问题的建议吗?
这里的问题是 jsonObj
是 Groovy 中的 Map
类型,在 ns
键处是 List
类型,你的期望是当您在插值期间将其隐式转换为字符串时,它也会在 shell 解释器中变得可迭代。 Groovy 类型和 shell 解释器类型构造函数在语法上不是同构的。您可能希望对 Groovy 变量使用 Groovy 迭代器:
Map jsonObj = readJSON file: 'vars.json'
jsonObj.ns.each() { namespace ->
sh(label: 'Create Kubernetes Namespace', script: "kubectl create namespace ${namespace}")
}
然后 shell 解释器命令将从管道正确接收已解析的命名空间变量。
以下是我的代码
def jsonObj;
jsonObj = readJSON file: 'vars.json'
sh "gcloud container clusters get-credentials ${jsonObj.cluster_name} --zone ${jsonObj.zone} --project ${jsonObj.project}"
sh "echo ${jsonObj.ns}"
sh "kubectl get nodes"
sh "for i in ${jsonObj.ns}; do kubectl create namespace $i; done"
变量文件'vars.json'如下图
"ns": ["dev","qa","sbx"]
但是当我执行管道时,变量的值与其他字符一起提取,因此后续操作失败
+ echo '[dev,' qa, 'sbx]'
[dev, qa, sbx]
+ for i in '[dev,' qa, 'sbx]'
+ kubectl create namespace '[dev,'
The Namespace "[dev," is invalid: .
有什么解决这个问题的建议吗?
这里的问题是 jsonObj
是 Groovy 中的 Map
类型,在 ns
键处是 List
类型,你的期望是当您在插值期间将其隐式转换为字符串时,它也会在 shell 解释器中变得可迭代。 Groovy 类型和 shell 解释器类型构造函数在语法上不是同构的。您可能希望对 Groovy 变量使用 Groovy 迭代器:
Map jsonObj = readJSON file: 'vars.json'
jsonObj.ns.each() { namespace ->
sh(label: 'Create Kubernetes Namespace', script: "kubectl create namespace ${namespace}")
}
然后 shell 解释器命令将从管道正确接收已解析的命名空间变量。