Вложенная переменная среды конвейера по сценарию Дженкинса

#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 , для которого оно было установлено.