Вопрос или проблема
Я хочу передать значение переменной из одного этапа сборки, а именно из ‘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
-
Декларирование переменной и установка значения в Shell скрипте:
Внутри Jenkins Pipeline можно определить переменную и задать ей значение в блоке
sh
. Для этого можно воспользоваться экспортом переменной в файл. Например, после выполнения ваших условий:if [ "$var" == "1"]; then package="newpackage" fi if [ "$var" == "2"]; then package="oldpackage" fi echo "Given_order=${package}" > env_properties
-
Загрузка переменной в 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] } } }
-
Использование переменной в 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.