Как динамически устанавливать переменные среды в скриптовом конвейере Дженкинса? - PullRequest
1 голос
/ 16 июня 2020

Я пытаюсь динамически установить переменные среды в скрипте конвейера jenkins.

Я использую комбинацию скриптов. groovy и .jenkinsfile для генерации определений stage {} для конвейера как DRY насколько это возможно.

У меня есть метод ниже:

def generateStage(nameOfTestSet, pathToTestSet, machineLabel, envVarName, envVarValue)
{
    echo "Generating stage for ${nameOfTestSet} on ${machineLabel}"
    return node("${machineLabel}") {
        stage(nameOfTestSet)
        {
            /////// Area of interest ////////////
            environment {
                "${envVarName} = ${envVarValue}"
            }
           /////////////////////////////////////
            try {
                echo "Would run: "+pathToTestSet

            } finally {
                echo "Archive results here"
            }   
        }
    }
}

Там работает некоторый код оболочки, но, абстрагируясь, мы бы заставили вызывающего абонента использовать:

generateStage("SimpleTestSuite", "path.to.test", "MachineA", "SOME_ENV_VAR", "ENV_VALUE")

Где последние два параметра - это имя среды (SOME_ENV_VAR) и значение (ENV_VALUE)

Эквивалентный декларативный код будет:

stage("SimpleTestSuite")
{
  agent {
     label "MachineA"
  }
  environment = {
   SOME_ENV_VAR = ENV_VALUE
  }
  steps {
    echo "Would run" + "path.to.test" 
  }
  post {
    always {
      echo "Archive results"
      }
  }
}

Однако , при запуске этого сценария синтаксис environment в первом блоке кода, похоже, вообще не влияет на фактическое выполнение. Если я повторяю $ {SOME_ENV_VAR} (или даже эхо $ {envVarName} в случае, если это имя переменной принималось как фактическое значение среды), они оба возвращают null.

Мне интересно, как лучше всего сделать этот раздел environment{} как DRY / Dynami c, насколько это возможно?

Я бы предпочел его, если есть расширяемое решение, которое может принимать список пар environmentName = Value, так как это было бы более общим case.

Примечание. Я пробовал решение withEnv[] для конвейеров со сценариями, но похоже, что это та же проблема.

1 Ответ

0 голосов
/ 17 июня 2020

Я нашел решение этой проблемы.

Это использовать шаг withEnv([]).

def generateStage(nameOfTestSet, pathToTestSet, machineLabel, listOfEnvVarDeclarations=[])
{
    echo "Generating stage for ${nameOfTestSet} on ${machineLabel}"
    return node("${machineLabel}") {
        stage(nameOfTestSet)
        {
            withEnv(listOfEnvVarDeclarations) {
                try {
                    echo "Would run: "+pathToTestSet

                } finally {
                    echo "Archive results here"
                }   
            }
        }
    }
}

И метод вызывающего абонента будет:

generateStage("SimpleTestSuite", "path.to.test", "MachineA", ["SOME_ENV_VAR=\"ENV_VALUE\""])

Поскольку шаг withEnv([]) может принимать несколько переменных среды, мы также можем сделать:

generateStage("SimpleTestSuite", "path.to.test", "MachineA", ["SOME_ENV_VAR=\"ENV_VALUE\"", "SECOND_VAR=\"SECOND_VAL\""])

И это будет действительным и должно работать.

...