Передайте значение переменной из одного этапа сборки в другой в задаче Jenkins.

Вопрос или проблема

Я хочу передать значение переменной из одного этапа сборки, а именно из ‘execute shell’, в ‘send files or execute commands over SSH’. Мой скрипт в Execute shell:

if [ "$var" == "1"]; then
package="newpackage"
fi
if [ "$var" == "2"]; then
package="oldpackage"
fi
Given_order=${package}

send files or execute commands over SSH
echo "$Given_order"
но значение не передается из одного шага сборки в другой.
Пожалуйста, подскажите.
Спасибо

Я уже ответил на этот вопрос здесь: https://serverfault.com/a/884798/213070. По сути, объявите переменную в вашем коде Pipeline вне области видимости ваших этапов сборки:

def jobBaseName

stage ('Construct Img name') {
  jobBaseName = sh(
    script: "echo ${BUILD_TAG} | awk '{print tolower($0)}' | sed 's/jenkins-//'",
    returnStdout: true,
  )
}

stage ('Build Target Container') {
  sh "ssh -i ~/ssh_keys/key.key user@somehost 'cd /dockerdata/build/${BUILD_TAG} && docker build -t localrepo/${jobBaseName}:${BUILD_NUMBER} .'"
}

Ответ или решение

Чтобы передать значение переменной между шагами сборки в Jenkins, можно воспользоваться методами, которые позволяют сохранять и извлекать значения из окружения. Рассмотрим это на примере, где значение переменной должно быть передано от шага "Execute shell" к шагу "Send files or execute commands over SSH".

Шаги для передачи переменной в Jenkins

  1. Декларирование переменной и установка значения в Shell скрипте:

    Внутри Jenkins Pipeline можно определить переменную и задать ей значение в блоке sh. Для этого можно воспользоваться экспортом переменной в файл. Например, после выполнения ваших условий:

    if [ "$var" == "1"]; then
     package="newpackage"
    fi
    if [ "$var" == "2"]; then
     package="oldpackage"
    fi
    echo "Given_order=${package}" > env_properties
  2. Загрузка переменной в Jenkins:

    Используйте команду readFile и функцию load, чтобы загрузить переменную из файла env_properties в Jenkins Pipeline:

    stage('Load Variable') {
       script {
           def props = readFile(file: 'env_properties').trim()
           def envProps = props.split('\n')
           envProps.each { line ->
               def keyValue = line.split('=')
               env[keyValue[0]] = keyValue[1]
           }
       }
    }
  3. Использование переменной в SSH шаге:

    Теперь, когда переменная загружена в окружение Jenkins, ее можно использовать в любом последующем этапе. Пример:

    stage('Send Over SSH') {
       sh "ssh -i ~/ssh_keys/key.key user@remote_host 'echo \"${env.Given_order}\"'"
    }

Важные заметки:

  • Проверка синтаксиса: Убедитесь в правильности синтаксиса Bash. Например, после if всегда должна быть пробел для корректного выполнения условия.

  • Использование Pipeline: Этот подход лучше всего работает в declarative Jenkins Pipeline или scripted Pipeline, так как предоставляет гибкость в управлении переменными.

  • Уровень доступа: Убедитесь, что скрипты имеют необходимые разрешения и ключи SSH правильно настроены для подключения к удаленному серверу.

Рекомендации:

Важно помнить, что управление и передача данных между шагами сборки — это практический аспект, который требует аккуратного обращения с переменными и конфигурационными файлами. Оптимизация этих процессов способствует снижению времени сборки и уменьшает вероятность ошибок.

Использование этого метода не только поможет вам достичь требуемой цели, но и обеспечит более структурированный подход к управлению сборочными процессами в Jenkins.

Оцените материал
Добавить комментарий

Капча загружается...