Як встановити змінні середовища у Дженкінса?


228

Я хотів би мати можливість зробити щось на кшталт:

AOEU=$(echo aoeu)

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

Розділ змінних довкілля в Дженкінсі цього не робить. Натомість він встановлює AOEU='$(echo aoeu)'.

Як я можу змусити Дженкінса оцінити командну оболонку та призначити вихідну змінну середовища?

Врешті-решт, я хочу мати можливість призначити виконавця роботи змінною середовища, яка може бути передана або використана іншими сценаріями.


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

@lambodar посилання просто переходить до питання
Z. Cochrane

@ Z.Cochrane, це посилання на відповідь, яку автор видалив.
Ноель Яп

Відповіді:


217

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

  1. Створіть етап збірки "Виконати оболонку":

    echo AOEU=$(echo aoeu) > propsfile
    
  2. Створіть крок побудови змінних середовища ін'єкційних середовищ та встановіть "Шлях до файлу властивостей" на propsfile.

Примітка . Цей плагін (здебільшого) не сумісний із плагіном Pipeline.


4
EnvInject не вирішує ситуацію, яку я наводив вище: [EnvInject] - Введення як змінні середовища вмісту властивостей AOEU = $ (echo aoeu) [EnvInject] - змінні, які успішно вводиться. [EnvInject] - Видалити невирішену змінну 'AOEU'.
Ноель Яп

1
Це рішення використовує синтаксис оболонки Unix і не працює у Windows.
fbmd

2
@fbmd Я запускаю його в Windows. Вам просто потрібно переконатися, що у вас shна шляху.
Кастодіо

2
EnvInject не працює, якщо "Execute shell" закінчується з помилкою, оскільки збірка не переходить до ін'єкційної частини.
Чаді

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"])'
генерую

@theFunkyEngineer, яку версію EnvInject ви використовуєте? З 1.91.3 така команда, як ваша, інтерпретується як "кішка = додаток ...". Було б чудово, якби ця функція була підтримана, але я розумію, що це, можливо, спрацювало для вас випадково.
вбивча

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сценарії . Встановлення змінної середовища за допомогою Manage Jenkins - Configure System - глобальні властивості були найпростішим і найменш нав'язливим способом цього досягти. Ніякі додатки не потрібні.

Управління глобальними властивостями Jenkins


Змінна середовища тоді доступна в Ant через:

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

Це можна перевірити на роботах, додавши:

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

Що виробляє:

Головна сторінка JMeter: ~ / .jmeter


Це глобальна властивість. Це вплине на ВСІ завдання на Дженкінса. Припустимо, я просто хочу цю власність на одну роботу?
ІгорГанапольський

Я додав до Manage Jenkins - Налаштування системи - Глобальні властивості, наступне: 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

Ви можете використовувати плагін для інжекторних середовищ для встановлення змінних оточуючих середовищ у Дженкінсах на рівні роботи та вузлів. Нижче я покажу, як їх встановити на рівні роботи.

  1. Із веб-інтерфейсу Дженкінса перейдіть до 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'
            }
        }
    }

Це не розбирає.
rjurney

2
Цей формат призначений для проекту трубопроводу Jenkinsfile. У якому типі завдань ви використовуєте цей фрагмент?
JSixface

1
Це ідеально працює Jenkinsfileв трубопроводі (не робота)! Це приголомшливо, дякую за це!
mathielo

14

EnvInject Plugin 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

Зазвичай ви можете налаштувати змінні середовища в глобальних властивостях у програмі Налаштування системи .

Однак для динамічних змінних з підстановкою оболонки ви можете створити файл сценарію в режимі 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 Вам потрібно імітувати повний логін, тому для цього використовуйте su -lпараметр, інакше задайте окреме запитання.
kenorb

@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
      }
   }
}

Примітка. Значення змінної середовища надходить як String. Якщо ви хочете використовувати його як булевий, тоді вам доведеться проаналізувати його за допомогою Boolean.parse (env.DISABLE_SQL).


4

Спробуйте Environment Script Plugin ( GitHub ), який дуже схожий на EnvInject . Це дозволяє запустити скрипт перед збіркою (після оформлення SCM), яка генерує для нього змінні середовища. Напр

Jenkins Build - Регулярна робота - Build Environment

і у вашому сценарії ви можете надрукувати напр. FOO=barна стандартний вихід, щоб встановити цю змінну.

Приклад для додавання до існуючої PATHзмінної -style:

echo PATH+unique_identifier=/usr/local/bin

Тож ви можете виконувати все необхідне в сценарії - або catфайл, або запускати сценарій якоюсь іншою мовою з вихідного дерева вашого проекту тощо.


1

Ви можете скористатися одним із наведених нижче способів:

  1. Використовуйте плагін Env Inject для створення змінних середовища. Слідкуйте за цим для використання та детальніше https://github.com/jenkinsci/envinject-plugin
    1. Перейдіть нижче та можете додати

Керуйте Дженкінсом -> Налаштування системи -> Глобальні властивості -> Змінні середовища -> Додати

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


0

Чомусь sudo su - jenkinsне записує мене до jenkins користувача , я закінчився з іншим підходом.

Мені вдалося встановити глобальні env-змінні за допомогою використання jenkins config.xmlat /var/lib/jenkins/config.xml(встановлено в Linux / RHEL) - без використання зовнішніх плагінів.

Мені просто довелося зупинити jenkins add, потім додати 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.