Переменные окружения конвейера хранят только строковые значения. Вот почему, когда вы присваиваете карту переменным env.common_vars
, она сохраняет map.toString()
эквивалент.
Если вы хотите перезаписать значения ключей из карты в переменные среды, вы можете выполнить итерацию карты переменных и назначитькаждая k
- v
соединяется с чем-то вроде env."$k" = v
. Вы можете сделать это, вызвав метод класса внутри блока environment
- таким образом, вы можете быть уверены, что переменные среды назначены независимо от того, с какой стадии перезапускается ваш конвейер. Рассмотрим следующий пример:
class MyVars {
private Map config = [
var1: "val1",
var2: "val2"
]
String initializeEnvironmentVariables(final Script script) {
config.each { k,v ->
script.env."$k" = v
}
return "Initialization of env variables completed!"
}
}
pipeline {
agent any
environment {
INITIALIZE_ENV_VARIABLES_FROM_MAP = "${new MyVars().initializeEnvironmentVariables(this)}"
}
stages {
stage("Some stage") {
steps {
echo "env.var1 = ${env.var1}"
}
}
}
post {
always {
script {
sh 'printenv | grep "var[0-9]\\+"'
}
}
}
}
В этом примере мы используем класс MyVars
для хранения некоторой глобальной карты конфигурации (она может быть частью общей библиотеки, здесь для простоты она является частьюДженкинсфайл). Мы используем INITIALIZE_ENV_VARIABLES_FROM_MAP
присваивание переменной окружения для вызова MyVars.initializeEnvironmentVariables(this)
метода, который может получить доступ к env
из параметра script
. Вызов этого метода изнутри environment
блока имеет одно существенное преимущество - он гарантирует, что переменные среды будут инициализированы, даже если вы перезапустите конвейер с любой стадии.
И вот вывод этого примерного конвейера:
Running on Jenkins in /home/wololock/.jenkins/workspace/pipeline-env-map
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Some stage)
[Pipeline] echo
env.var1 = val1
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Declarative: Post Actions)
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ grep 'var[0-9]\+'
+ printenv
var1=val1
var2=val2
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
Как вы видите, он устанавливает env.var1
и env.var2
из карты, инкапсулированной в классе MyVars
. Обе переменные могут быть доступны внутри шага конвейера, блока скрипта или даже внутри переменных среды оболочки.