Установка переменных в списке в декларативном файле Дженкинса

#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 сработало для меня!