#jenkins-pipeline #jenkins-groovy #jenkins-declarative-pipeline
#дженкинс-конвейер #дженкинс-заводной #дженкинс-декларативный-конвейер
Вопрос:
Я установил некоторые переменные среды, как показано ниже :
environment {
IMG_TARGET = "registry/cloud-environemnt-azu:1.x.x"
CREDENTIALS = 'credentials-token'
BUILD_DIR = 'Builddir'
DOMAIN_DIR = 'Domaindir'
BUILD_SOLUTION = 'Dir.Builddir.sln'
}
Некоторые переменные используются во всем конвейере Jenkins, и я хочу отделить их от переменных среды, чтобы в переменных среды были только учетные данные и целевой образ.
Есть ли способ, которым я могу использовать глобальный список / переменную / карту для хранения переменных, отличных от окружения, например :
List<String> variables = [
BUILD_DIR = 'Builddir'
DOMAIN_DIR = 'Domaindir'
BUILD_SOLUTION = 'Dir.Builddir.sln'
]
Если да, то как я могу сослаться на переменную из этого списка? Ссылки на переменные выполняются на нескольких этапах конвейера
Ответ №1:
У вас может быть раздел среды для вашего конвейера и, при необходимости, на каждом этапе определять новый раздел среды для переопределения существующих переменных или определения новых. Пример:
pipeline {
agent any
environment {
FOO = "bar"
NAME = "Joe"
}
stages {
stage("Env Variables") {
environment {
NAME = "Alan" // overrides pipeline level NAME env variable
BUILD_NUMBER = "2" // overrides the default BUILD_NUMBER
}
steps {
echo "FOO = ${env.FOO}" // prints "FOO = bar"
echo "NAME = ${env.NAME}" // prints "NAME = Alan"
echo "BUILD_NUMBER = ${env.BUILD_NUMBER}" // prints "BUILD_NUMBER = 2"
script {
env.SOMETHING = "1" // creates env.SOMETHING variable
}
}
}
stage("Override Variables") {
steps {
script {
env.FOO = "IT DOES NOT WORK!" // it can't override env.FOO declared at the pipeline (or stage) level
env.SOMETHING = "2" // it can override env variable created imperatively
}
echo "FOO = ${env.FOO}" // prints "FOO = bar"
echo "SOMETHING = ${env.SOMETHING}" // prints "SOMETHING = 2"
withEnv(["FOO=foobar"]) { // it can override any env variable
echo "FOO = ${env.FOO}" // prints "FOO = foobar"
}
withEnv(["BUILD_NUMBER=1"]) {
echo "BUILD_NUMBER = ${env.BUILD_NUMBER}" // prints "BUILD_NUMBER = 1"
}
}
}
}
}
Другой вариант — использовать параметризованные задания в декларативных конвейерах, и если вам интересно, вы можете прочитать больше здесь.
Комментарии:
1. Спасибо, это выглядит правильно. Но переменные выполняются на нескольких этапах, могу ли я попробовать что-то с частной статической окончательной картой, содержащей все переменные?
2. Насколько я знаю, это не вариант.
Ответ №2:
Вы можете установить переменную среды, специфичную для каждого этапа, включив блок среды в этап, как показано ниже.
pipeline {
agent any
stages {
stage ("Test Stage"){
environment {
TEST_VARIABLE=test
}
steps {
echo "Hello"
}
}
}
}
Если вы хотите, чтобы все переменные, не относящиеся к среде, были объединены в один компонент, тогда вы можете использовать map вместо List, поскольку map будет хранить данные в паре ключ-значение, и вы можете получить любой ключ в любой момент времени, со списком вы не можете сохранить значение в виде пары ключ-значение.
pipeline {
agent any
stages {
stage ("Test Stage"){
steps {
script {
def testMap = [BUILD_DIR:'Builddir',DOMAIN_DIR:'Domaindir',BUILD_SOLUTION:'Dir.Builddir.sln']
testMap.each {
entry -> echo "${entry.key}"
}
echo "${testMap['DOMAIN_DIR']}"
}
}
}
}
}
Спасибо,
Комментарии:
1. Сработает ли ${testMap[‘DOMAIN_DIR’]}, если я попытаюсь сослаться на глобальную карту? Мои переменные вызываются в сценариях оболочки на разных этапах, что-то вроде :
dotnet build ${BUILD_DIR}/${BUILD_SOLUTION}.csproj
2. Да, это должно сработать, вам нужно определить эту карту глобально и может ссылаться из любого места в скрипте конвейера.
3. Объявление переменных в map —
private static final Map VARIABLES = [ BUILD_DIR = 'Builddir' DOMAIN_DIR = 'Domaindir' BUILD_SOLUTION = 'Dir.Builddir.sln' ]
и вызов их как,VARIABLES.BUILD_DIR
сработало для меня!