Переменная Loop Over Map в скрипте Groovy - PullRequest
0 голосов
/ 06 мая 2019

У меня есть карта данных, которую я извлек во время скрипта 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 голосов
/ 10 мая 2019

Чтобы передать значения между этапами, я загрузил значения в файл и загрузил файл.Тогда значения были доступны в оболочке.

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
      '''
      ...
   }
  }
}
0 голосов
/ 06 мая 2019
...
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() }
....
"""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...