2016-07-26 3 views
11

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

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 

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

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

sh 'env' 

в моем DSL, и это выводит:

JOB_NAME = foo-bar 

чего я ожидал.

Другой blog mentions:

Usage of environment variables
We have two ways to get their value. The properties passed by -D= during the startup we could read as System.getProperty("key") thanks to the Groovy's strong relation with Java.

Reading normal environment variables in Java way is the System.getenv("VARIABLE") ...

Давайте попробуем это:

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

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

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

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

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

ответ

22

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

+0

Это работает. '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 

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

enter image description here

+0

Это не работает, просто протестируйте его. Пожалуйста, дайте более подробную информацию @ Pom12. –

+0

В настоящее время я использую его для системных переменных среды, как показано в моем отредактированном сообщении. Какую версию Дженкинса вы используете? – Pom12

+1

Он также позволяет напрямую устанавливать переменные с помощью 'env [var]'. – meonlol

0

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

3

Хорошо, это действительно досадовало меня на некоторое время сегодня.В конце концов, я был сделано на пару вещей:

  • одинарных кавычках строки в Groovy значит «не оценивать переменные,» так же, как это делает в Баш
  • Использование $ интерполяции совершенно не нужна, если вы просто ссылаетесь на переменную, так что вы можете просто сделать env.JOB_NAME.

Этот SO вопрос оказался один, который помог мне взломать код: Jenkins Workflow Checkout Accessing BRANCH_NAME and GIT_COMMIT

+2

Single против двойных кавычек сделали мой день! Это фактически устранило мою проблему. Большое спасибо! – gvasquez

Смежные вопросы