Как установить переменные среды в Jenkins?


228

Я хотел бы иметь возможность сделать что-то вроде:

AOEU=$(echo aoeu)

и Дженкинс установил AOEU=aoeu.

Раздел « Переменные среды » в Jenkins этого не делает. Вместо этого это устанавливает AOEU='$(echo aoeu)'.

Как я могу заставить Дженкинса оценить команду оболочки и назначить вывод переменной среды?

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


2
Плагин EnvInject имеет серьезную уязвимость безопасности. Теперь у Дженкинса есть встроенная поддержка этого stackoverflow.com/a/53430757/1753177
lambodar

@lambodar ссылка просто идет на вопрос
З. Кокрейн

@ Z.Cochrane, это ссылка на ответ, который был удален автором.
Ноэль Яп

Ответы:


217

Это можно сделать через плагин EnvInject следующим образом:

  1. Создайте шаг сборки «Execute shell», который выполняется:

    echo AOEU=$(echo aoeu) > propsfile
    
  2. Создайте шаг построения переменных среды Inject и установите для «Свойства путь к файлу» значение propsfile.

Примечание . Этот плагин (в основном) не совместим с плагином Pipeline.


4
EnvInject не справляется с ситуацией, которую я описал выше: [EnvInject] - Внедрение в качестве переменных среды содержимого свойств AOEU = $ (echo aoeu) [EnvInject] - Ввод переменных успешно. [EnvInject] - Сбросить неразрешенную переменную 'AOEU'.
Ноэль Яп

1
Это решение использует синтаксис оболочки Unix и не будет работать на Windows.
fbmd

2
@fbmd Я запускаю его в Windows. Вам просто нужно убедиться, что вы shна пути.
Кустодио

2
EnvInject не работает, если «исполняемая оболочка» завершается с ошибкой, поскольку сборка не переходит к части внедрения.
Чади

1
@ Vitim.us fooбудет экспортироваться в этом конкретном действии оболочки, но не в других действиях.
Ноэль Яп

109

Самый простой способ

Вы можете использовать плагин EnvInject для внедрения переменных окружения при запуске сборки. Например:

Добавьте ключ = значение (bash OK!) В «Среда сборки» -> «Внедрить переменные среды в процесс сборки» -> «Свойства содержимого»

Как вы знаете, это работает

EnvInject - переменные введены успешно


5
Попробуйте установить значение на основе вывода команды оболочки.
Ноэль Яп

1
@NoelYap тоже работает, до тех пор, пока в конце строка не получит оценку key=value. В моем случае я полностью генерирую строку: cat app/build.gradle | grep "def majorVersion" | python -c 'import sys,re,os; print("VERSION_NUMBER="+re.findall(r"[\d+\.]+", sys.stdin.read())[0]+os.environ["BUILD_NUMBER"])'
kenny_k

@theFunkyEngineer, какую версию EnvInject вы используете? Начиная с версии 1.91.3, команда, подобная вашей, интерпретируется как «cat = app ...». Было бы здорово, если бы эта функция была поддержана, но я чувствую, что это могло сработать для вас случайно.
killhrush

1
попытка присвоить значение для вывода команды оболочки не работает для меня тоже: BUILD_DATE=date "+%Y-%m-%d-%H_%M_%S"и , BUILD_DATE=$(date "+%Y-%m-%d-%H_%M_%S")а BUILD_DATE=`date "+%Y-%m-%d-%H_%M_%S"`не работы для меня
scottysseus

1
@scottyseus Я закончил тем, что использовал этот wiki.jenkins-ci.org/display/JENKINS/Environment+Script+Plugin, работающий как шарм. stackoverflow.com/a/38286383/1240268
Энди Хейден

56

В моем случае мне нужно было добавить JMETER_HOMEпеременную среды, которая будет доступна через мои сценарии сборки Ant для всех проектов на моем сервере Jenkins (Linux), таким образом, чтобы это не мешало моей локальной среде сборки (Windows и Mac) в build.xmlсценарии. , Установка переменной среды с помощью « Управление Jenkins» - «Настройка системы» - глобальные свойства были самым простым и наименее навязчивым способом для достижения этой цели. Никаких плагинов не требуется.

Управление Jenkins Global Properties


Переменная окружения затем доступна в Ant через:

<property environment="env" />
<property name="jmeter.home" value="${env.JMETER_HOME}" />

Это можно проверить, добавив:

<echo message="JMeter Home: ${jmeter.home}"/>

Который производит:

JMeter Home: ~ / .jmeter


Это глобальная собственность. Это повлияет на ВСЕ рабочие места на Дженкинс. Предположим, я просто хочу эту собственность для одной работы?
Игорь Ганапольский

Я добавил в Управление Дженкинс - Настроить систему - Глобальные свойства, следующее: git /path/to/my/gitи PATH+git /path/to/my/git. Однако, если я пытаюсь получить доступ gitот а Jenkins pipeline script, я получаю: /bin/sh: git: command not found.
Октавиан

1
Мне просто нужно было установить переменную среды JAVA_HOME, и этот ответ помог мне.
Sandoval0992

19

Вы можете использовать Environment Injector Plugin для установки переменных среды в Jenkins на уровне работы и узла. Ниже я покажу, как установить их на уровне работы.

  1. В веб-интерфейсе Jenkins перейдите Manage Jenkins > Manage Pluginsи установите плагин.

Плагин окружения

  1. Перейти на Configureэкран вашей работы
  2. Найдите Add build stepв Buildразделе и выберитеInject environment variables
  3. Установите желаемую переменную среды как VARIABLE_NAME = VALUE шаблон. В моем случае я изменил значение переменной USERPROFILE

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

Если вам необходимо определить новую переменную среды в зависимости от некоторых условий (например, параметров задания), вы можете обратиться к этому ответу .


16

Вы можете попробовать что-то вроде этого

stages {
        stage('Build') {
            environment { 
                    AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
                }
            steps {
                sh 'env'
                sh 'echo $AOEU'
            }
        }
    }

Это не разбирает.
Рюрни

2
Этот формат предназначен для проекта конвейера Jenkinsfile. В каком типе работы вы используете этот фрагмент?
JSixface

1
Это прекрасно работает Jenkinsfileдля конвейера (не работа)! Это здорово, спасибо за это!
Матьело

14

Плагин 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как говорится:

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


12

Существует плагин Build Env Propagator, который позволяет добавлять новые переменные среды сборки, например

Jenkins Build - распространять переменные среды сборки

Любой последующий шаг переменных среды сборки Propagate переопределяет ранее определенные значения переменных среды.


Спасибо! Плагин Build Env Propagator сработал, когда я его попробовал, и здорово иметь возможность устанавливать переменные окружения на этапах сборки!
twasbrillig

10

В моем случае я настроил переменные окружения, используя следующую опцию, и она работала:

Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add

Это лучший способ
Лонг Нгуен

7

Обычно вы можете настроить переменные окружения в глобальных свойствах в Configure System .

Однако для динамических переменных с заменой оболочки вы можете создать файл сценария в директории Jenkins HOME и выполнить его во время сборки. Требуется доступ по SSH. Например.

  1. Войдите как Дженкинс: sudo su - jenkinsилиsudo su - jenkins -s /bin/bash
  2. Создайте сценарий оболочки, например:

    echo 'export VM_NAME="$JOB_NAME"' > ~/load_env.sh
    echo "export AOEU=$(echo aoeu)" >> ~/load_env.sh
    chmod 750 ~/load_env.sh
    
  3. В Jenkins Build ( Execute shell ) вызовите скрипт и его переменные перед чем-либо еще, например

    source ~/load_env.sh
    

к сожалению у меня не получилось. после sudo su - jenkins, все еще echo $USERдает мне root.
prayagupd

@prayagupd Вам необходимо смоделировать полный вход в систему, поэтому используйте su -lпараметр, чтобы сделать это, в противном случае задайте отдельный вопрос.
Кенорб

@kenorb после вызова скрипта, как мне снова прочитать переменную env? например, это не работает ш "" "источник ~ / load_env.sh эхо "VM_NAME: $ VM_NAME" эхо "VM_NAME: $ {VM_NAME}" """
Аун

7

Это фрагмент для хранения переменной среды и доступа к ней.

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).


4

Попробуйте плагин Environment Script ( GitHub ), который очень похож на EnvInject . Это позволяет вам запустить скрипт перед сборкой (после проверки SCM), которая генерирует для него переменные среды. Например

Jenkins Build - Обычная работа - Среда сборки

и в вашем скрипте вы можете напечатать, например, FOO=barстандартный вывод, чтобы установить эту переменную.

Пример для добавления к существующей PATHпеременной -style:

echo PATH+unique_identifier=/usr/local/bin

Таким образом, вы можете делать все, что вам нужно в скрипте - либо catфайл, либо запускать скрипт на другом языке из дерева исходных текстов вашего проекта и т. Д.


1

Вы можете использовать один из следующих способов, перечисленных ниже:

  1. Используйте Env Inject Plugin для создания переменных среды. Следуйте этому для использования и более подробной информации https://github.com/jenkinsci/envinject-plugin
    1. Перейдите ниже и можете добавить

Управление Jenkins -> Настройка системы -> Глобальные свойства -> Переменные среды -> Добавить

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


0

По какой-то причине я sudo su - jenkinsне захожу на сайт jenkins пользователя , поэтому я использовал другой подход.

Я успешно установил глобальные переменные env, используя jenkins config.xmlat /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>

-3

Мы используем заводной файл работы:

description('')
steps {
    environmentVariables {
        envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.