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

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

AOEU=$(echo aoeu)

и Дженкинс установить AOEU=aoeu,

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

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

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

17 ответов

Решение

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

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

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

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

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

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

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

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

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

В моем случае мне нужно было добавить 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

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

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 на уровне работы и узла. Ниже я покажу, как это сделать на уровне работы.

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

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

  1. Иди на работу Configure экран
  2. найти Add build step в Build раздел и выберите Inject environment variables
  3. Установите желаемую переменную среды как 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, который позволяет добавлять новые переменные среды сборки, например

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

Любой последующий шаг переменных среды сборки 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. Например.

  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
    

расширение ответа @JSixface:

Чтобы определить переменные среды глобально для доступа на всех этапах декларативного конвейера, вы можете добавить environment раздел в pipeline блокировать.

      pipeline {                                                                                               
  agent {                                                                                                
    node {                                                                                               
      label 'myAgent'                                                                                   
    }                                                                                                    
  }                                                                                                      
  environment {
    AOEU = "${sh(returnStdout: true, script: 'echo aoeu').trim()}"                
  }                                                                                                      
  stages {
    ...
  }
}                                                                                               

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

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

и в вашем скрипте вы можете напечатать, например, 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>

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

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

Управление 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)
    }
}
Другие вопросы по тегам