Как передать имя переменной, но не ее значение в функцию / var в качестве аргумента? - PullRequest
1 голос
/ 21 мая 2019

Я пытаюсь разделить трубопровод. Большинство параметров прошло успешно, но те, которые содержат переменные, разрешаются раньше, чем мне нужно.

Дженкинс вер. 2.164.1

Jenkins.file content:

stage ('prebuild') {
 steps {
  script {
   VERSION="temprorary-value"
   POSTBUILDACTION="make.exe \\some\\path\\file_${VERSION}"
  }
 }
}
stage ('build') {
 steps {
  script {
    build (POSTBUILDACTION) 
  }
 }
}

build.groovy content:
def call (String POSTBUILDACTION) {
     ...
     checkout somefile
     VERSION=readFile(somefile)
     bat "${POSTBUILDACTION}"

}

здесь я ожидал, что версия будет взята из переопределенной переменной VERSION, но POSTBUILDACTION передается в функцию в виде строки. В результате он называется как есть («make.exe \ some \ path \ file_temprorary-value»). На самом деле команда, которую я хотел бы получить - это (somefile содержит только одно число, например «5»)

make.exe \some\path\file_5

Но теперь у меня есть

make.exe \some\path\file_temprorary-value

Или, если я пытаюсь передать \ $ {VERSION}, например:

POSTBUILDACTION="make.exe \\some\\path\\file_\${VERSION}"

- это перевод как есть:

make.exe \some\path\file_${VERSION}

Я пытался просмотреть класс POSTBUILDACTION на этапе предварительной сборки - он равен "класс org.codehaus.groovy.runtime.GStringImpl" и такой же на этапе сборки после передачи throw - он становится строкой: "class java.lang .String "

Так как передать в функцию аргумент, содержащий переменную, но не ее значение? ИЛИ ЖЕ «вдохнуть жизнь» в сухую нить типа

'make.exe \\some\\path\\file_${VERSION}'

чтобы переменные могли быть разрешены?

1 Ответ

0 голосов
/ 22 мая 2019

Вариант 1 - ленивая оценка (@NonCPS)

Вы можете использовать GString с ленивой оценкой , но поскольку Jenkins не сериализует ленивый GString s, вам придется возвращать его из @NonCPS метода следующим образом:

@NonCPS
def getPostBuildAction() {
    "make.exe \\some\\path\\file_${ -> VERSION }"
}

stage ('prebuild') {
    ...
}

Затем вы устанавливаете POSTBUILDACTION=getPostBuildAction(), и вы можете использовать POSTBUILDACTION как хотите, но помните, что объекту вас есть groovy.lang.GString, а не String, поэтому вы захотите изменить класс параметров (или просто использовать def.)

Вариант 2 - использовать замыкание длякаждый звонок

Вы можете использовать нетерпеливый GString внутри замыкания:

def String getPostBuildAction() {
    "make.exe \\some\\path\\file_$VERSION"
}

Но здесь вам придется звонить getPostBuildAction() каждый раз, когда вы хотите другое чтениеVERSION, поэтому вам придется заменить POSTBUILDACTION на это замыкание.

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