Если вы хотите экспортировать переменную среды с шага script
и получить доступ к ней вне текущего этапа, вы должны использовать имя переменной, которое не было указано в глобальном или локальном блоке environment {}
.Рассмотрим следующий пример:
pipeline {
agent any
environment {
IMMUTABLE_VARIABLE = 'my value'
}
stages {
stage('Build') {
steps {
script{
def random = new Random()
if (random.nextInt(2) == 1) {
env.CHANGE_STRING = "Lorem ipsum dolor sit amet"
} else {
env.CHANGE_STRING = "Foo Bar"
}
env.IMMUTABLE_VARIABLE = 'a new value'
echo "IMMUTABLE_VARIABLE = ${env.IMMUTABLE_VARIABLE}"
}
}
}
}
post {
success {
echo 'Successfull build'
sh '''
echo $CHANGE_STRING
echo "IMMUTABLE_VARIABLE = $IMMUTABLE_VARIABLE"
'''
}
}
}
Это просто упрощение вашего конвейерного скрипта.Когда я запускаю его, я вижу следующий вывод консоли:
[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/test-pipeline
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
IMMUTABLE_VARIABLE = my value
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Declarative: Post Actions)
[Pipeline] echo
Successfull build
[Pipeline] sh
[test-pipeline] Running shell script
+ echo Foo Bar
Foo Bar
+ echo IMMUTABLE_VARIABLE = my value
IMMUTABLE_VARIABLE = my value
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
Сценарий оболочки в блоке post success печатает Foo Bar
в первой строке и IMMUTABLE_VARIABLE = my value
во второй.Также обратите внимание, что хотя я явно пытался переопределить
env.IMMUTABLE_VARIABLE = 'a new value'
, он не дал никакого эффекта, а когда я сделал
echo "IMMUTABLE_VARIABLE = ${env.IMMUTABLE_VARIABLE}"
, он просто повторил начальное значение из environment {}
блок:
IMMUTABLE_VARIABLE = my value
Надеюсь, это поможет.