Выполнить команду цикла внутри оболочки в Groovy - PullRequest
0 голосов
/ 04 декабря 2018

Я использую следующую команду, которая работает как положено

def before(Map<String, String> params) {
  sh """

  make ${params.get('arg')}
  """
}

Теперь мне нужно немного ее изменить, чтобы запустить с циклом, и я получаю ошибка усложнения

def before(Map<String, String> params) {
  sh """

  params.each{ k, v -> make ${v} }
  """
}

Есть идеи, как решить эту проблему?Я пытаюсь добавить { } без успеха

1 Ответ

0 голосов
/ 04 декабря 2018

Вы видите ошибку компиляции, потому что тело строки, которую вы передали шагу sh, содержит часть, которая не распознается bash (эта часть: params.each{ k, v -> make ${v} }).

Вы можете заняться этим с другой точки зрения: вы можете собрать все записи на карте в список make ${arg} команд и передать их на шаг sh после объединения всех команд с помощью символа новой строки \n.Рассмотрим следующий пример:

def before(Map<String, String> map) {
    sh(map.collect { k,v -> "make ${v}" }.join("\n"))
}

before([arg1: "foo", arg2: "bar"])

Код, который выполняется на шаге sh, эквивалентен примерно так:

sh """
    make foo
    make bar
"""

Обновление: выполнение нескольких команд внутри """block

Если вы хотите применить решение, показанное ранее внутри блока """, вы можете попытаться использовать что-то вроде этого:

def before(Map<String, String> map) {
    sh """

    # Run any command beforehand 

    ${map.collect { k,v -> "make ${v}" }.join(" && ")}
    """
}

Этот подход позволит вам поместить любую команду bash передвыполнение цепочки команд, таких как

make foo && make bar && make 123 

. Вы можете использовать соединение, отличное от && (например, \n, как в предыдущем примере).Однако объединение команд с помощью && может быть лучше, потому что если одна из них завершится неудачно, это предотвратит выполнение следующих команд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...