Jenkins Pipeline Доступ к переменным среды

Я пытаюсь использовать DSL-конвейеры в Jenkins. Я подумал, что было бы хорошо, если бы я мог использовать название проекта как часть моего script.

git credentialsId: 'ffffffff-ffff-ffff-ffff-ffffffffffffff',\
url: "${repo_root}/${JOB_NAME}.git"

Я получаю сообщение об ошибке:

groovy.lang.MissingPropertyException: \
No such property: JOB_NAME for class: groovy.lang.Binding

Я думал, что я слежу за этими направлениями, и они упоминают JOB_NAME как одну из переменных.

Я решил попробовать:

sh 'env'

в моей DSL, и это печатает:

JOB_NAME = foo-bar

что я ожидаю.

В другом блоге говорится:

Использование переменных окружения
У нас есть два способа получить их ценность. Свойства, переданные -D= во время запуска, мы могли бы читать как System.getProperty("key") благодаря сильному отношению Groovy к Java.

Чтение обычных переменных среды в Java-способе - это System.getenv("VARIABLE")...

Попробуем это:

println "JOB_NAME = " + System.getenv('JOB_NAME'); 

Теперь я получаю:

java.lang.NullPointerException: Cannot get property 'System' on null object

Нулевой объект? Но я вижу, что JOB_NAME является переменной окружения!

Как я прочитал в $JOB_NAME в DSL script в задании Pipeline. Я пытаюсь выполнить задачу Pipeline, и когда я получу эту работу, это сделает Multibranch Pipeline с Jenkinsfile.

Ответ 1

Все переменные среды доступны с помощью env, например. ${env.JOB_NAME}.

Ответ 2

Действительно, просто используйте ${env.JOB_NAME} для доступа к известной переменной.

Однако, если вам нужно получить доступ к переменной окружения, где имя задается другой переменной (динамический доступ), просто используйте env["your-env-variable"].

У меня возникла проблема, когда я сконфигурировал 3 переменные среды (в Jenkins -> Administer -> Configure System -> Environment variables), назовите их ENV_VAR_1, ENV_VAR_2, ENV_VAR_3. Теперь я хочу динамически обращаться к ним, я могу сделать как таковой:

def envVarName = "ENV_VAR_" + count  // Suppose count is initialized in a loop somewhere above...

def value = env[envVarName]  // Will be resolved to env["ENV_VAR_1"] depending on count value

Мои переменные среды в конфигурации Jenkins выглядят следующим образом:

введите описание изображения здесь

Ответ 3

Ладно, это действительно раздражало меня сегодня. В конечном счете, меня проделали несколько вещей:

  • Строки с одним кавычком в Groovy означают "не оценивать переменные", как это делается в bash
  • Использование интерполяции $абсолютно не нужно, если вы просто ссылаетесь на переменную, поэтому вы можете просто сделать env.JOB_NAME.

Этот вопрос SO оказался тем, что помогло мне взломать код: Jenkins Workflow Checkout Доступ к BRANCH_NAME и GIT_COMMIT

Ответ 4

У меня возникла проблема с тем, что это не работает. Глобально заданные свойства/переменные среды были доступны только на этапе node. Это ошибка в версии 2.4 плагина Pipeline. Если вы столкнулись с этой проблемой, обновите ее до 2,5, и ваши глобальные свойства будут доступны в любом месте script. Я разместил это в wiki здесь с помощью теста script, который я использовал.