在Groovy脚本中循环遍历地图变量

时间:2019-05-06 01:45:22

标签: jenkins groovy

我有一张在Groovy管道脚本中提取的数据图。 在管道的下一阶段,我想遍历数据并插入环境变量以供使用。

此阶段包括一个ant命令,该命令使用构建xml来检索环境${env.appName}参数。 (请参见下面的xml示例)

<project ...>
   ...
    <entry ...value="${env.appName}/>
    <entry ...value="${env.version}/>
   ...
</project>

我正在浏览地图的键值对。

pipeline {
  agent any
  stages{
    stage ('Data') {
     steps{ 
      scripts {
        def map = [app1: "01.01", app2: "02.02"]
       }
      }
    }
   stage ('Loop'){
     steps {
      withAnt(){
       sh '''
          {map.collect{ k,v -> "appName=${k} version=${v}"}}
          ant -buildfile ~/build.xml
          ...
          '''
        }
      }
    }
  }
}

但是,我得到一个错误:

line 3 : {map.collect{ k,v -> "appName=${k} version=${v}"}}: bad substitution.

是否可以在sh块中循环映射? 有没有一种方法可以对地图的每个元素执行ant命令?

2 个答案:

答案 0 :(得分:0)

...
withAnt{
   def cmd = map.collect{k,v-> "\n appName=${k}\n version=${v}\n ant -buildfile ~/build.xml"}.join()
   sh cmd
}

对于地图[app1: "01.01", app2: "02.02"]cmd变量将具有:

 appName=app1
 version=01.01
 ant -buildfile ~/build.xml
 appName=app2
 version=02.02
 ant -buildfile ~/build.xml

或者您可以将表达式包含在多行评估(双引号)字符串中:

sh """
....
${ map.collect{k,v-> "\n appName=${k}\n version=${v}\n ant -buildfile ~/build.xml"}.join() }
....
"""

答案 1 :(得分:0)

为了在阶段之间传递值,我将值加载到文件中并加载了文件。然后可以在外壳中访问这些值。

pipeline {
  agent any 
  stages {
   stage ('Data') {
    steps {
      script {
        ...
        map. each{ key,value ->
                    writeFile ([file: filename, text: "env.App=\"${key}\"\n"])
                    def content = readFile filename
                    writeFile([fiel: filename, text: "env.Version=\"${value}\"\n"])}
        }
       }
      }
     }
   stage ('Loop') {
      ...
      load "filename"
      sh '''
      echo $App
      '''
      ...
   }
  }
}
相关问题