В моем проекте есть много общих переменных для многих других проектов, поэтому я использую общую библиотеку Jenkins и создал файл vars/buildMeta.groovy
, в котором я определил свои переменные (некоторые функции анализа sh
), и использую их на этапе среды (var1, var2):
pipeline {
environment {
// initialize common vars
var1 = buildMeta.getVar1()
var2 = buildMeta.getVar2()
varA = var1 + "some_string"
varB = var2 + "some_other_string"
} // environment
stages {
stage('Some Stage') {
// ...
}
}
post {
always {
script {
// Print environment variables
sh "env"
} // script
} // always
} // post
} // pipeline
Я решил экспортировать varA
, varB
в общий vars/my_vars.groovy
и использовать их оттуда (когда мне нужно перенести карту конфигурации с var1
, var2
vars).
class my_vars {
static Map varMap = [:]
static def loadVars (Map config) {
varMap.varA = config.var1 + "some_string"
varMap.varB = config.var2 + "some_other_string"
// Many more variables ...
return varMap
}
}
Дело в том, что для объявления этих переменных в качестве переменных среды я использовал такой способ:
pipeline {
my_vars.loadVars().each { key, value ->
env[key] = value
}
environment {
// initialize common vars
var1 = buildMeta.getVar1()
var2 = buildMeta.getVar2()
} // environment
stages {
stage('Some Stage') {
// ...
}
}
// ...
} // pipeline
, но таким образом переменные buildMeta (var1,var2) еще не определены, поэтому я не могу правильно инициализировать вызов my_vars.loadVars()
. С другой стороны, я не могу продублировать функции buildMeta.groovy
на my_vars.loadVars()
, поскольку в первом случае используется sh
, а вызов второго не определен на этапе (сценарии).
Я мог бы решить все это, поместив все эти вызовы функций на отдельную стадию (скажем, на этапе «Загрузка переменных»), но я действительно хочу избежать этой фиктивной стадии. Какая лучшая практика для этого?
Спасибо!