Змінні середовища Дженкінса / Хадсона


101

Я запускаю Дженкінса від користувача, jenkinsякий $PATHщось встановив, і коли я заходжу у веб-інтерфейс Дженкінса, у вікні Властивості системи ( http://$host/systemInfo) я бачу інше $PATH.

Я встановив Дженкінс на Centos з рідною об / хв від веб-сайту Jenkins. Я використовую сценарій запуску, наданий при встановленніsudo /etc/init.d/jenkins start

Чи може хто-небудь пояснити мені, чому це відбувається?


1
Якщо ви входите як дженкінси, і echo $PATHчи відповідає це тому, що ви бачите в дженкінах?
— Upgradingdave

3
@Dave ні, це не відповідає. не можу зрозуміти, чому
— Майкл

8
Причина, що не відповідає, полягає в тому, що коли ви входите як користувач jenkins, ви викликаєте оболонку входу, тоді як jenkins просто виконує / bin / sh -xe {ваш скрипт}, тому він не працює через один і той же набір сценаріїв які змінюють змінну середовища PATH. Насправді, набір скриптів змінюється залежно від конкретного смаку * nix та / або оболонки, який ви встановили. Я протестував на AWS Linux AMI з jenkins, і, на жаль, ніхто з / etc / profile /etc/profile.d/xxx.sh / etc / bashrc / etc / environment ~ / .bash_profile ~ / .profile ~ / .bashrc не зміг. впливати на ПАТ перейшов до / bin / sh
— Лука

Відповіді:


141

Майкл,

Дві речі:

Коли Дженкінс підключається до комп'ютера, він переходить до shоболонки, а не до bashоболонки (принаймні, це те, що я помітив - я можу помилятися). Тому будь-які зміни, внесені до $ PATH у вашому файлі bashrc, не враховуються.

Крім того, будь-які зміни, які ви внесете до $ PATH у вашій локальній оболонці (ту, до якої ви особисто входите), не з'являться у Дженкінсі.

Щоб змінити шлях, який використовує Дженкінс, у вас є два варіанти (AFAIK):

1) Відредагуйте /etc/profileфайл та додайте потрібні шляхи до нього

2) Перейдіть на сторінку конфігурації вашого підлеглого і додайте змінну середовища PATHіз значенням:$PATH:/followed-by/paths/you/want/to/add

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


2
Ця відповідь спрацювала для мене, але я помітив, що Дженкінс дуже чутливо ставиться до того, що ви пишете на сторінку конфігурації. Я не міг змусити його працювати з доріжками з пробілами.
— miguelSantirso

Так, але коли ви вводите шляхи з пробілами в оболонці UNIX, простір зазвичай виділяється символом ``. Тому, якщо ваш шлях "/ opt / bin / My Folder Name", ви можете спробувати "/ opt / bin / My \ Folder \ Name". Це дозволить уникнути пробілів і дозволить використовувати їх.
— Сагар

11
Рішення 2 - це шлях.
— gagarine

2
Наступні дії: у моїй системі Ubuntu служба jenkins - це найвища робота, тому я змінював старий сценарій заглушки sysvinit. Неправильне місце. Коли я налаштовую сценарій /etc/init/jenkins.conf і оновлюю PATH перед тим, як він виконує Java, це, здається, працює.
— Stabledog

15
Існує невеликий темний куточок: майстер дженкінсів кешує змінні середовища від рабів, щоб виправити налаштування. Отже, якщо ви змінюєте змінні середовища на підлеглому (системі чи користувачеві), вам потрібно перезапустити майстер, щоб оновити конфігурацію ведених.
— Thinkeye

36

Я продовжував стикатися з цією проблемою, але тепер просто додаю:

source /etc/profile

Як перший крок у моєму процесі збирання. Тепер усі мої наступні правила завантажуються, щоб Дженкінс працював безперебійно.


6
Так? Детально, будь ласка ... ви додасте де? як? коли? Це працює в Windows?
— HX_забавлений

Я припускаю, що ви виконуєте команду shell, як частину вашої збірки. Поставте source /etc/profileяк першу команду в цій збірці> Виконати оболонку> Команда textarea.
— Брайан Кеннеді

2
Він працює на Mac, також я знайшов такі шляхи, як /usr/local/binвказано в /etc/paths, і /etc/pathsвикористовується /usr/libexec/path_helper, і в ньому виконується path_helper /etc/profile.
— hiroshi

1
ти врятував мені день :)
— RameshVel

Sourcing / etc / profile показує шлях при додаванні налагодження 'echo $ PATH' у роботу, але якщо я дивлюсь на змінні середовища для завдання, це не те саме.
— Ілля Лінн

23

Ви також можете редагувати /etc/sysconfig/jenkinsфайл, щоб вносити будь-які зміни в змінні середовища і т. Д. Я просто додав source /etc/profileдо кінця файлу. /etc/profileмає всі належні PATHналаштування змінних. Коли ви це зробите, переконайтеся, що перезапустіть Дженкінса

/etc/init.d/jenkins restart

Ми запускаємо ZendServer CE, який встановлює грушу, фінг тощо в інший шлях, тому це було корисно. Крім того, ми не отримуємо LD_LIBRARY_PATHпомилок, які ми отримували з клієнтом Oracle та Jenkins.


Це ключовий коментар, або перезавантажте jenkins з {jenkins-url} / restart або {jenkins-url} / safeRestart. Я стукав головою про те, чому зміни шляху не були підібрані, відредагувавши навіть / etc / Environment на хості ubuntu - RESTART це виправить, як підтверджено {jenkins-url} / systemInfo
— kert

Всі інші провалилися, це єдине, що працювало! Я хотів би, щоб це було більш поширеним, щоб я не витрачав даремно останні години!
— Бред Бонкоскі

15

Я намагався /etc/profile, ~/.profileі ~/.bash_profileніхто з них не працював. Я виявив, що редагування ~/.bashrcоблікового запису рабовласницьких дженкінів.


3
це тому, що оболонка без входу не читає ні /etc/profileані~/.profile
— Вінченцо,

9

Інформація щодо цієї відповіді застаріла. Вам потрібно перейти до Налаштувати Дженкінс> І тоді ви можете натиснути, щоб додати туди пару ключових значень змінної середовища.

наприклад: export MYVAR=testбув би MYVARключовим, і testце значення.


5

У моєму новому екземплярі EC2, просто додавши нове значення до PATH користувача .profile користувача Jenkins, а потім перезапустити tomcat працював на мене.

У старшому екземплярі, де конфігурація відрізняється, єдине, що працювало (використання .profile, .bash * не працювало) з використанням відповіді №2 від відповіді Сагара .


4

Я знайшов для цього два плагіни. Один завантажує значення з файлу, а інший дозволяє налаштувати значення на екрані конфігурації завдання.

Envfile Plugin - Цей плагін дозволяє встановлювати змінні середовища через файл. Формат файлу повинен бути стандартним форматом файлу властивостей Java.

EnvInject Plugin - Цей плагін дає змогу додавати змінні середовища та виконувати сценарій налаштування, щоб створити середовище для роботи.


4

Чи не могли ви просто додати його як змінну середовища в налаштуваннях Дженкінса:

Управління Jenkins -> Глобальні властивості> Змінні середовища: А потім натисніть "Додати", щоб додати властивість PATH та її значення до того, що вам потрібно.


1
Здається, що "Управління Дженкінсом -> Налаштування системи -> Змінні середовища" у версії 1.620.
— akaihola

4

Ось як я вирішив цю набридливу проблему:

Я змінив PATHзмінну, як запропонував @sagar у своєму другому варіанті, але все ж отримав інше PATHзначення, ніж я очікував.

Врешті я дізнався, що саме EnvInjectплагін замінив мій PATHзмінний!

Тому я міг або видалити EnvInjectабо просто використовувати його для введення змінної PATH.

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

Тому я створив файл: environment_variables.propertiesпід домашнім каталогом Дженкінса.

Цей файл містив значення середовища шляху , що мені потрібно: PATH=$PATH:/usr/local/git/bin/.

У веб - інтерфейсі Дженкінс: Manage Jenkins -> Configure System. У цьому вікні - я галочка Prepare jobs environmentопції, і в Properties File Pathполе я увійшов шлях до мого файлу: /var/lib/jenkins/environment_variables.properties.

Таким чином, кожне завдання, яке ми отримуємо від Дженкінса, отримує всі змінні, які я вклав у цей environment_variables.propertiesфайл.


1
Це має бути правильна відповідь. Як зазначено, оновлення / etc / profile не є прийнятним рішенням для OSX, оскільки файл лише для читання і вимагає возитися з правами. Це рішення видається найчистішим і використовує вже наявні плагіни на Jenkins. Не забудьте перезапустити jenkins, коли ви створите свій файл властивостей і встановите його на Jenkins
— Voke Ransom Anighoro

3

Дженкінс також підтримує формат, PATH+<name>щоб додати до будь-якої змінної, не тільки PATH:

Глобальні змінні середовища або вузли змінних середовища:

Змінна Дженкінса + позначення

Це також підтримується на етапі конвеєра withEnv:

node {
  withEnv(['PATH+JAVA=/path/to/java/bin']) {
    ...
  }
}

Просто візьміть на замітку, вона передує змінній. Якщо його потрібно додати, потрібно зробити те, що показують інші відповіді.

Дивіться документ про етапи трубопроводу тут .

Ви також можете використовувати синтаксис PATH + WHATEVER = / щось додати / щось до $ PATH

Або документи Java на EnvVars тут .


2

Я просунувся в цьому питанні лише після "/etc/init.d/jenkins принудительного перезавантаження". Я рекомендую спробувати це перед чим-небудь іншим, і використовувати це, а не перезавантажувати.


1
А де ви насправді додали елемент PATH? Я пробував кожне місце, яке можу собі уявити.
— Stabledog

2

На моєму Ubuntu 13.04 я спробував досить багато виправлень, перш ніж досягти успіху в цьому:

  1. Редагувати /etc/init/jenkins.conf
  2. Знайдіть місце, де починається "виконувати запуску-зупинку-сервер ..."
  3. Вставте оновлення середовища безпосередньо перед цим, тобто

експортувати PATH = $ PATH: / деякий / новий / шлях / бін


2

Додайте

/usr/bin/bash

у

Jenkins -> Управління Jenkins -> налаштування системи -> Shell-> оболонка, що виконується

Дженкінс використовує sh, щоб навіть / etc / profile не працював для мене. Коли я додаю це, у мене є всі умови.


Яка версія Дженкінса зробила це для вас @ sumang_87? Не вдалося мені допомогти на Jenkins 2.9
— hamx0r

1

Рішення, яке працювало на мене

source ~/.bashrc

Пояснення

Я вперше перевірив, що Дженкінс працює під керівництвом BASH, echo $SHELLі echo $BASH(зауважте, я чітко розміщую #!/bin/bashповерх textarea в Дженкінсі, я не впевнений, чи це вимога отримати BASH). sourceЯкщо /etc/profileінші запропонували, це не працює.

Подивившись, /etc/profileя знайшов

if [ "$PS1" ]; then
...

і перевіряючи "$ PS1", визнано це недійсним. Я намагався підробляти $PS1безрезультатно, як так

export PS1=1
bash -c 'echo $PATH'

однак це не призвело до бажаного результату (додайте решту, що $PATHя очікую побачити). Але якщо я скажу Башу бути інтерактивним

export PS1=1
bash -ci 'echo $PATH'

$PATHбув змінений , як я очікував.

Я намагався розібратися, як правильно підробити інтерактивну оболонку для /etc/bash.bashrcзавантаження, однак, виявляється, все, що мені було потрібно, було знищено ~/.bashrc, тому просто sourceвирішивши проблему.


Обов’язково використовуйте #!/bin/bash -elдля того, щоб повідомити bash для запуску як оболонки для входу. Це повинно викликати bash для отримання необхідних .rc файлів
— Брендон

1

Я спробував все, що було зверху - не вийшло для мене.

Я знайшов два рішення (обидва для SSH-Slave)

  1. Перейдіть до налаштованих пристроїв

  2. Додайте нову змінну середовища

  3. ПАТ
  4. $ {PATH}: $ {HOME} /. Pub-cache / bin: $ {HOME} /. Local / bin

Важлива частина "$ {HOME}". Це робить додатковий PATH абсолютним. Відносний шлях для мене не спрацював.

Варіант II (сценарій конвеєра)

pipeline {
    agent {
        label 'your-slave'
    }
    environment {
        PATH = "/home/jenkins/.pub-cache/bin:$PATH"
    }
    stages {
        stage('Test') {
            steps {
                ansiColor('xterm') {
                    echo "PATH is: $PATH"
                }
            }
        }
    }
}

0

У Ubuntu я просто редагую / etc / default / jenkins і додаю джерело / etc / profile наприкінці, і це працює на мене.


0

Запуск команди з набором змінної середовища також ефективний. Звичайно, ви повинні робити це для кожної команди, яку ви запускаєте, але у вас, ймовірно, є сценарій завдання, тому ви, мабуть, маєте лише одну команду на збірку. Мій сценарій завдання - це сценарій python, який використовує середовище, щоб вирішити, який python використовувати, тому мені все одно потрібно було поставити /usr/local/bin/python2.7 на своєму шляху:

PATH=/usr/local/bin <my-command>

0

Те, що працювало для мене, було переважати середовище PATH для раба.

Set:   PATH 
To:    $PATH:/usr/local/bin

Потім відключення і підключення до раба.

Незважаючи на те, що системна інформація показувала, вона працювала.


0

У мене Jenkins 1.639 встановлений на SLES 11 SP3 через zypper (менеджер пакунків). Установка конфігурувала дженкіни як послугу

 # service jenkins
 Usage: /etc/init.d/jenkins {start|stop|status|try-restart|restart|force-reload|reload|probe}

Хоча /etc/init.d/jenkinsджерела /etc/sysconfig/jenkins, будь-які встановлені там env змінні не успадковуються процесом jenkins, оскільки він запускається в окремій оболонці входу з новим середовищем, як це:

startproc -n 0 -s -e -l /var/log/jenkins.rc -p /var/run/jenkins.pid -t 1 /bin/su -l -s /bin/bash -c '/usr/java/default/bin/java -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --javaHome=/usr/java/default --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --httpPort=8080 --ajp13Port=8009 --debug=9 --handlerCountMax=100 --handlerCountMaxIdle=20 &' jenkins

Те, як мені вдалося встановити навколишнє середовище для процесу дженкінса, є .bashrcв його домашньому каталозі - /var/lib/jenkins. Мені довелося творити так, /var/lib/jenkins/.bashrcяк його раніше не було.


0

Ось що я зробив на ubuntu 18.04 LTS з Jenkins 2.176.2

Я створив файл .bash_aliases і додав туди шлях, змінні проксі тощо.

На початку .bashrc було це визначено.

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Отже, це перевірка того, що якщо ми запускаємо неінтерактивну оболонку, то тут ми нічого не робимо.

Внизу .bashrc було включено для .bash_aliases

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

тому я перемістив .bash_aliases спочатку завантажуючи на .bashrc трохи вище неінтерактивної перевірки.

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


-1

1- додайте у свій файл ".bash_profile" вашого профілю

він знаходиться в папці "/ home / your_user /"

vi .bash_profile

додати:

export JENKINS_HOME=/apps/data/jenkins  
export PATH=$PATH:$JENKINS_HOME

==> це робоча область e jenkins

2- Якщо ви використовуєте jetty: перейдіть до файлу jenkins.xml

і додати:

<Arg>/apps/data/jenkins</Arg>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.