Как установить переменные среды в Jenkins?
Я хотел бы иметь возможность сделать что-то вроде:
AOEU=$(echo aoeu)
и Дженкинс установить AOEU=aoeu
,
Раздел " Переменные среды " в Jenkins этого не делает. Вместо этого он устанавливает AOEU='$(echo aoeu)'
,
Как я могу заставить Дженкинса оценить команду оболочки и назначить вывод переменной среды?
В конце концов, я хочу иметь возможность назначить исполнителя задания переменной среды, которая может быть передана или использована другими сценариями.
17 ответов
Это можно сделать через плагин EnvInject следующим образом:
Создайте шаг сборки "Execute shell", который выполняется:
echo AOEU=$(echo aoeu) > propsfile
Создайте шаг построения переменных среды Inject и установите для "Свойства путь к файлу" значение
propsfile
,
Примечание. Этот плагин (в основном) не совместим с плагином Pipeline.
Самый простой способ
Вы можете использовать плагин EnvInject для внедрения переменных окружения при запуске сборки. Например:
'Внедрить переменные среды в процесс сборки' -> 'Свойства содержимого'"/>
Как вы знаете, это работает
В моем случае мне нужно было добавить JMETER_HOME
переменная среды, которая будет доступна через мои сценарии сборки Ant во всех проектах на моем сервере Jenkins (Linux), таким образом, чтобы это не мешало моей локальной среде сборки (Windows и Mac) в build.xml
скрипт. Установка переменной среды с помощью " Управление Jenkins" - "Настройка системы" - глобальные свойства были самым простым и наименее навязчивым способом для достижения этой цели. Никаких плагинов не требуется.
Переменная окружения затем доступна в Ant через:
<property environment="env" />
<property name="jmeter.home" value="${env.JMETER_HOME}" />
Это можно проверить, добавив:
<echo message="JMeter Home: ${jmeter.home}"/>
Который производит:
JMeter Home: ~ /.jmeter
В моем случае я настроил переменные окружения, используя следующую опцию, и это сработало:
Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add
Вы можете попробовать что-то вроде этого
stages {
stage('Build') {
environment {
AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
}
steps {
sh 'env'
sh 'echo $AOEU'
}
}
}
Вы можете использовать Environment Injector Plugin для установки переменных среды в Jenkins на уровне работы и узла. Ниже я покажу, как это сделать на уровне работы.
- Из веб-интерфейса Jenkins перейдите к
Manage Jenkins > Manage Plugins
и установите плагин.
- Иди на работу
Configure
экран - найти
Add build step
вBuild
раздел и выберитеInject environment variables
- Установите желаемую переменную среды как VARIABLE_NAME=VALUE шаблон. В моем случае я изменил значение переменной USERPROFILE
Если вам нужно определить новую переменную среды в зависимости от некоторых условий (например, параметров задания), вы можете обратиться к этому ответу.
Плагин EnvInject aka (Environment Injector Plugin) предоставляет несколько опций для установки переменных среды из конфигурации Jenkins.
Выбрав Inject environment variables to the build process
ты получишь:
Properties File Path
Properties Content
Script File Path
Script Content
и наконец
Evaluated Groovy script
,
Evaluated Groovy script
дает возможность установить переменную окружения на основе результата выполненной команды:
- с
execute
метод:
return [HOSTNAME_SHELL: 'hostname'.execute().text,
DATE_SHELL: 'date'.execute().text,
ECHO_SHELL: 'echo hello world!'.execute().text
]
- или с явным
Groovy
код:
return [HOSTNAME_GROOVY: java.net.InetAddress.getLocalHost().getHostName(),
DATE_GROOVY: new Date()
]
(Более подробную информацию о каждом методе можно найти во встроенной справке (?))
К сожалению, вы не можете сделать то же самое из Script Content
как говорится:
Выполните файл сценария, предназначенный для настройки среды, такой как создание папок, копирование файлов и т. Д. Дайте содержимое файла скрипта. Вы можете использовать вышеуказанные свойства переменных. Однако добавление или переопределение переменных среды в сценарии не влияет на работу сборки.
Существует плагин Build Env Propagator, который позволяет добавлять новые переменные среды сборки, например
Любой последующий шаг переменных среды сборки Propagate переопределяет ранее определенные значения переменных среды.
Это фрагмент для хранения переменной среды и доступа к ней.
node {
withEnv(["ENABLE_TESTS=true", "DISABLE_SQL=false"]) {
stage('Select Jenkinsfile') {
echo "Enable test?: ${env.DEVOPS_SKIP_TESTS}
customStep script: this
}
}
}
Примечание. Значение переменной среды передается в виде строки. Если вы хотите использовать его как логическое значение, вам необходимо проанализировать его с помощью Boolean.parse(env.DISABLE_SQL).
Обычно вы можете настроить переменные окружения в глобальных свойствах в Configure System.
Однако для динамических переменных с подстановкой оболочки вы можете создать файл сценария в директории Jenkins HOME и выполнить его во время сборки. Требуется доступ по SSH. Например.
- Войдите как Дженкинс:
sudo su - jenkins
или жеsudo su - jenkins -s /bin/bash
Создайте сценарий оболочки, например:
echo 'export VM_NAME="$JOB_NAME"' > ~/load_env.sh echo "export AOEU=$(echo aoeu)" >> ~/load_env.sh chmod 750 ~/load_env.sh
В Jenkins Build (Execute shell), вызовите скрипт и его переменные прежде всего, например
source ~/load_env.sh
расширение ответа @JSixface:
Чтобы определить переменные среды глобально для доступа на всех этапах декларативного конвейера, вы можете добавить
environment
раздел в
pipeline
блокировать.
pipeline {
agent {
node {
label 'myAgent'
}
}
environment {
AOEU = "${sh(returnStdout: true, script: 'echo aoeu').trim()}"
}
stages {
...
}
}
Попробуйте плагин Environment Script ( GitHub), который очень похож на EnvInject. Это позволяет вам запустить скрипт перед сборкой (после проверки SCM), которая генерирует для него переменные среды. Например
и в вашем скрипте вы можете напечатать, например, FOO=bar
на стандартный вывод, чтобы установить эту переменную.
Пример для добавления к существующему PATH
-стиль переменной:
echo PATH+unique_identifier=/usr/local/bin
Так что вы можете делать все, что вам нужно в сценарии - либо cat
файл или запустить скрипт на другом языке из исходного дерева вашего проекта и т. д.
По какой-то причине sudo su - jenkins
не регистрирует меня в jenkins
Пользователь, я в конечном итоге использовал другой подход.
Я успешно установил глобальные переменные env, используя jenkins config.xml
в /var/lib/jenkins/config.xml
(устанавливается в Linux/ RHEL) - без использования внешних плагинов.
Я просто должен был остановить добавление Дженкинса, а затем добавить globalNodeProperties
, а затем перезапустите.
Пример, я определяю переменные APPLICATION_ENVIRONMENT
а также SPRING_PROFILES_ACTIVE
в continious_integration
ниже,
<?xml version='1.0' encoding='UTF-8'?>
<hudson>
<globalNodeProperties>
<hudson.slaves.EnvironmentVariablesNodeProperty>
<envVars serialization="custom">
<unserializable-parents/>
<tree-map>
<default>
<comparator class="hudson.util.CaseInsensitiveComparator"/>
</default>
<int>2</int>
<string>APPLICATION_ENVIRONMENT</string>
<string>continious_integration</string>
<string>SPRING_PROFILES_ACTIVE</string>
<string>continious_integration</string>
</tree-map>
</envVars>
</hudson.slaves.EnvironmentVariablesNodeProperty>
</globalNodeProperties>
</hudson>
Вы можете использовать любой из следующих способов, перечисленных ниже:
- Используйте подключаемый модуль Env Inject для создания переменных среды. Следуйте этому для использования и более подробной информации https://github.com/jenkinsci/envinject-plugin
- Перейдите ниже и можете добавить
Управление Jenkins -> Настроить систему -> Глобальные свойства -> Переменные среды -> Добавить
Если вы планируете исследовать плагин EnvInject, подумайте еще раз, у него серьезная уязвимость, и мы не должны рисковать.
Дженкин имеет встроенную поддержку для этого, используя которую вы можете получить доступ к значению локальных переменных в качестве глобальных переменных среды. Вы можете достичь этого, выполнив 4 простых шага.
Шаг 1
............................
rm -f <some_name>.properties
touch <Some_name>.properties
............................
#pass the variable name you want to access as an env variable
echo variable_name1=$some_value1 >> <some_name>.properties
echo variable_name2=$some_value2 >> <some_name>.properties
............................
echo variable_name3=$some_value3 >> <some_name>.properties
Шаг 2
В раскрывающемся списке " Добавить шаг сборки " выберите " Вставить переменную среды "
Шаг 3
Введите полное имя файла, который вы создали ранее (<some_name>.properties
) в поле Путь к файлу свойств.
Шаг 4
Теперь он доступен как переменная среды Jenkins, и вы можете использовать его по мере необходимости в Post-build-Action. $ variable_name1, как и любая другая переменная окружения.
Вот хороший пост об этом
Синтаксис Scripted Pipeline, который мы используем, следующий:
env.AEOU = sh label:'set env var',
returnStdout: true,
script : '''#!/bin/bash
echo "aeou"
'''
sh label:'checkit',
script : '''#!/bin/bash
echo "${AEOU}"
'''
Обратите внимание на использование
triple-single-quote
обозначение для
script
параметр к
sh
шаг. Это гарантирует, что
${AEOU}
не интерполируется Groovy и интерполируется оболочкой bash.
Мы используем заводной файл работы:
description('')
steps {
environmentVariables {
envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
}
}