无法在 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 解释器命令将从管道正确接收已解析的命名空间变量。