#jenkins #environment-variables #jenkins-pipeline #pipeline
Вопрос:
Я использую конвейер, написанный по сценарию Дженкинса, и мне трудно понять, как вложить переменные среды друг в друга, вот MWE:
// FROM https://jenkins.io/doc/pipeline/examples/#parallel-multiple-nodes
def labels = []
if (HOST == 'true') {
labels.add(<HOSTNAME>)
}
def builders = [:]
for (x in labels) {
def label = x
builders[label] = {
ansiColor('xterm') {
node(label) {
stage('cleanup') {
deleteDir()
}
stage('build') {
env.test = "TESTA"
env.intern = '''
TEST = "${env.test}"
'''
sh '''
echo $intern
printenv
'''
}
}
}
}
}
parallel builders
Идея здесь в том , что env.test
содержит значение TESTA
, которое устанавливает env.intern
TEST = TESTA
, что это то, что я хочу, чтобы произошло. После этого код просто распечатает значения.
К сожалению, результат таков TEST = "${env.test}"
.
Как я могу использовать вложенные строковые переменные среды в конвейере сценариев Дженкинса?
Ответ №1:
Разница в синтаксисе здесь заключается в буквальных строках по сравнению с интерполированными строками в интерпретаторах Groovy и оболочки в пошаговых методах оболочки.
"
: интерполированная строка в Groovy'
: литеральная строка в Groovy и интерполированная строка в интерпретаторе оболочки
По сути, переменная Groovy интерполируется внутри "
при выполнении конвейера, а переменная среды интерполируется внутри "
при выполнении конвейера и '
внутри интерпретатора оболочки (и к конвейеру также должен быть доступ внутри env
объекта, но это выражение переменной первого класса в методе шага оболочки).
Таким образом, мы можем зафиксировать присвоенное значение env.intern
с:
env.intern = "TEST = ${env.test}"
где присвоенное значение env.test
будет интерполировано в строке Groovy и присвоено объекту env
конвейера в intern
ключе. Это также будет доступно интерпретатору оболочки в рамках пошаговых методов оболочки, а остальная часть вашего конвейера уже корректна и будет вести себя так, как ожидалось.
Ответ №2:
Попробуйте выполнить следующие действия:
env.intern = "TEST = ${env.test}"
Как вы устанавливаете это сейчас, фактический результат env.intern
будет "TEST= ${env.test}"
. Пока вы ставите env.test
перед env.intern
собой, вы должны быть хорошими. Кроме того, полезно отметить, что если вы измените значение env.test
, то вам нужно сбросить значение env.intern
, иначе оно сохранит исходное значение env.test
, для которого оно было установлено.