Groovy sh, вызывающий сборку docker, добавляет новые строки в мою команду

#docker #jenkins #groovy #jenkins-pipeline

#docker #дженкинс #groovy #дженкинс-конвейер

Вопрос:

Надеюсь, это простая проблема. У меня есть метод groovy, который я вызываю из файла Jenkins, который должен выполнять docker build команду оболочки. Строка выглядит следующим образом:

 sh "docker build --build-arg "VERSION=${tag}" -t "${project}:${tag}" ."
  

Однако, когда я запускаю это из Jenkins, кажется, что эта команда разбивается на новые строки, сбивая с толку docker:

 17:26:05.151  docker build --build-arg "VERSION=<tag>
17:26:05.151  " -t "<project>:<tag>
17:26:05.151  " .
17:26:05.451  invalid argument "<project>:<tag>n" for "-t, --tag" flag: invalid reference format
17:26:05.451  See 'docker build --help'.
  

Двойные кавычки вокруг переменных были необходимы для получения полной команды в той или иной форме. Без них вывод отключается, вот так:

 17:17:24.368     docker build --build-arg VERSION=<tag>
17:17:24.368  "docker build" requires exactly 1 argument.
  

Что-то определенно не так с тем, как я перевожу bash на groovy, но я не уверен, что.

Комментарии:

1. Кажется, tag переменная содержит новую строку.

Ответ №1:

Рассмотрим следующее:

 def tag = "testing_tagn"
def project="test_proj"

node {

    echo "docker build --build-arg "VERSION= "   
         tag   
         "" -t "${project}:"   
         tag   "" ."
}
  

Даст вам именно то, что у вас есть:

 docker build --build-arg "VERSION=tag
" -t "project:tag
" .
  

Вы можете избавиться от любых символов новой строки, используя .replace("n", "" )

 def tag = "tagn"
def project="project"

node {

    echo "docker build --build-arg "VERSION="   
         tag.replace("n", "" ).trim()   
         "" -t "${project}:"   
         tag.replace("n", "" ).trim()   "" ."
}
  

Лучшим вариантом было бы заменить все символы новой строки:

 echo "docker build --build-arg "VERSION=${tag}" -t "${project}:${tag}" .".replace("n", "" ).trim()

  

Теперь вам просто нужно заменить echo на sh

 def tag = "tagn"
def project="project"

node {
    def command = "docker build --build-arg "VERSION=${tag}" -t "${project}:${tag}" .".replace("n", "" ).trim()
    echo command
    sh command
}
  

Этот пример заменяет каждый символ новой строки, независимо от того, является ли это переменной, исходящей от Дженкинса (в моем случае) или нет. Просто адаптируйте под свои нужды.