Переменные среды Jenkins / Hudson

101

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

Я установил Jenkins на Centos с собственным rpm с веб-сайта Jenkins. Я использую сценарий запуска, поставляемый с установкой, используяsudo /etc/init.d/jenkins start

Кто-нибудь может объяснить мне, почему это происходит?

Майкл
источник
1
Если вы войдете в систему как jenkins, и соответствует echo $PATHли это тому, что вы видите в jenkins?
Upgradingdave
3
@ Дэйв, нет, не совпадает. не могу понять почему
Майкл
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

Майкл,

Две вещи:

Когда Jenkins подключается к компьютеру, он обращается к shоболочке, а не к bashоболочке (по крайней мере, это то, что я заметил - я могу ошибаться). Поэтому любые изменения, внесенные вами в $ PATH в вашем файле bashrc, не рассматриваются.

Кроме того, любые изменения, которые вы вносите в $ PATH в своей локальной оболочке (той, в которую вы лично используете ssh), не будут отображаться в Jenkins.

Чтобы изменить путь, который использует Дженкинс, у вас есть два варианта (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». Это позволит избежать пробелов и позволит вам использовать их.
Sagar
11
Решение 2 - это правильный путь.
gagarine 03
2
Продолжение: в моей системе Ubuntu служба jenkins - это новая работа, поэтому я модифицировал старый сценарий-заглушку sysvinit. Не то место. Когда я настраиваю сценарий /etc/init/jenkins.conf и обновляю PATH до того, как он исполняет java, похоже, это работает.
Stabledog 02
15
Есть небольшой темный угол: мастер jenkins кэширует переменные среды от подчиненных устройств, чтобы исправить настройки. Поэтому, если вы изменяете переменные среды на ведомом устройстве (системе или пользователе), вам необходимо перезапустить ведущее устройство, чтобы обновить конфигурацию ведомого устройства.
Thinkeye
36

Я все время сталкивался с этой проблемой, но теперь просто добавляю:

source /etc/profile

В качестве первого шага в моем процессе сборки. Теперь все мои последующие правила загружены, чтобы Дженкинс работал без сбоев.

Брайан Кеннеди
источник
6
А? Поподробнее, пожалуйста ... добавьте где? как? когда? На винде работает?
HX_unbanned
Я предполагаю, что вы запускаете команду оболочки как часть своей сборки. Поместите source /etc/profileв качестве первой команды в это поле Build> Execute Shell> Command textarea.
Брайан Кеннеди 03
2
Он работает на Mac, также я обнаружил, что такие пути, как /usr/local/binуказано в /etc/paths, и /etc/pathsиспользуются /usr/libexec/path_helper, а path_helper выполняется в /etc/profile.
hiroshi
1
ты спас мне день :)
РамешВел
Источник / etc / profile показывает путь при добавлении отладки «echo $ PATH» в задание, но если я посмотрю на переменные среды для задания, это не то же самое.
Элайджа Линн
23

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

/etc/init.d/jenkins restart

Мы запускаем ZendServer CE, который устанавливает pear, phing и т. Д. По другому пути, так что это было полезно. Кроме того, мы не получаем LD_LIBRARY_PATHошибок, которые мы получали с клиентом Oracle и Jenkins.

dbiehl
источник
Это ключевой комментарий, или перезапустите jenkins из {jenkins-url} / restart или {jenkins-url} / safeRestart. Я бился головой о том, почему не были приняты изменения пути, редактируя даже / etc / environment на хосте ubuntu - RESTART исправит это, как подтверждено {jenkins-url} / systemInfo
kert
Все остальные потерпели неудачу, это единственное, что сработало! Хотелось бы, чтобы это было более распространено, чтобы не потратить зря последние несколько часов!
Брэд Бонкоски,
15

Я попробовал /etc/profile, ~/.profileи ~/.bash_profileничего из этого не сработало. Я обнаружил, что редактирование ~/.bashrcучетной записи jenkins slave было сделано.

mmacvicar
источник
3
это потому , что не-Логин оболочки не не читает ни /etc/profileни~/.profile
Vincenzo
9

Информация об этом ответе устарела. Вам нужно перейти в «Настроить Jenkins»>, а затем щелкнуть, чтобы добавить пару «ключ-значение» переменной среды.

например: export MYVAR=testбыло бы MYVAR- ключ, а test- значение.

TJ Biddle
источник
5

В моем более новом экземпляре EC2 для меня сработало просто добавление нового значения в PATH пользователя Jenkins .profile, а затем перезапуск tomcat.

В более старом экземпляре, где конфигурация отличается, использование № 2 из ответа Сагара было единственным, что сработало (т.е. .profile, .bash * не сработало).

Роб Баррека
источник
4

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

Плагин Envfile - этот плагин позволяет вам устанавливать переменные среды через файл. Формат файла должен быть стандартным форматом файла свойств Java.

Плагин EnvInject - этот плагин позволяет добавлять переменные среды и выполнять сценарий установки, чтобы настроить среду для задания.

Vicro
источник
4

Не могли бы вы просто добавить его как переменную среды в настройках Jenkins:

Управление Jenkins -> Глобальные свойства> Переменные среды: а затем нажмите «Добавить», чтобы добавить свойство PATH и его значение к тому, что вам нужно.

Киараш Заманифар
источник
1
Кажется, это «Управление Jenkins -> Настроить систему -> Переменные среды» в версии 1.620.
akaihola
4

Вот как я решил эту досадную проблему:

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

В конце концов я обнаружил, что это EnvInjectплагин заменил мою PATHпеременную!

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

Поскольку многие из наших заданий Jenkins используют этот плагин, я не хотел его удалять ...

Итак, я создал файл: environment_variables.propertiesв моем домашнем каталоге Jenkins.

Этот файл содержал нужное мне значение среды пути: PATH=$PATH:/usr/local/git/bin/ .

В веб - интерфейсе Дженкинс: Manage Jenkins -> Configure System. На этом экране я поставил галочку Prepare jobs environmentи в Properties File Pathполе ввел путь к моему файлу:/var/lib/jenkins/environment_variables.properties .

Таким образом, каждая наша работа Jenkins получает любые переменные, которые я помещаю в этот environment_variables.propertiesфайл.

офирбт
источник
1
Это должен быть правильный ответ. Как указано, обновление / etc / profile не является возможным решением для OSX, поскольку файл доступен только для чтения и требует возиться с разрешениями. Это решение кажется самым чистым и использует уже существующие плагины для Jenkins. Не забудьте перезапустить jenkins, как только вы создадите свой файл свойств и установите его для Jenkins
Voke Ransom Anighoro
3

Jenkins также поддерживает формат PATH+<name>для добавления к любой переменной, а не только к PATH:

Глобальные переменные среды или переменные среды узла:

Переменная Дженкинса + обозначение

Это также поддерживается на этапе конвейера withEnv:

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

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

См. Документ по этапам конвейера здесь .

Вы также можете использовать синтаксис PATH + WHATEVER = / something для добавления / something к $ PATH

Или java-документацию на EnvVars здесь .

CJCombrink
источник
2

У меня был прогресс по этой проблеме только после "/etc/init.d/jenkins force-reload". Я рекомендую попробовать это прежде всего и использовать это вместо перезапуска.

Рене Вуллер
источник
1
А где вы собственно добавили элемент PATH? Я пробовал все, что только могу представить.
Stabledog 02
2

На моем Ubuntu 13.04 я попробовал несколько настроек, прежде чем преуспел в этом:

  1. Отредактируйте /etc/init/jenkins.conf
  2. Найдите место, где начинается "exec start-stop-server ..."
  3. Вставьте обновление среды непосредственно перед этим, т.е.

экспорт PATH = $ PATH: / some / new / path / bin

Конюшня
источник
2

Добавить

/usr/bin/bash

в

Jenkins -> Управление Jenkins -> Настройка системы -> Shell-> Исполняемый файл оболочки

Дженкинс использует sh, так что даже / etc / profile у меня не работает. Когда я добавляю это, у меня есть все env.

sumang_87
источник
Какая версия Jenkins сработала для вас @ sumang_87? Это не помогло мне на Jenkins 2.9
hamx0r
1

Решение, которое сработало для меня

source ~/.bashrc

Объяснение

Сначала я проверил, что Дженкинс запускал BASH с помощью echo $SHELLи echo $BASH(обратите внимание, что я явно помещаю #!/bin/bashповерх текстового поля в Jenkins, я не уверен, что это требование для получения BASH). sourceing, /etc/profileкак предлагали другие, не работал.

Глядя на /etc/profileя нашел

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

и проверка "$ PS1" обнаружила, что оно пустое. Я пробовал спуфинг, $PS1но безрезультатно

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

однако это не дало желаемого результата (добавьте остальное, что $PATHя ожидаю увидеть). Но если я скажу, чтобы bash был интерактивным

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

$PATHбыл изменен , как я ожидал.

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

quickshiftin
источник
Обязательно используйте, #!/bin/bash -elчтобы сообщить bash о запуске в качестве оболочки входа. Это должно заставить bash исходить из необходимых .rc файлов
Брэндон
1

Я перепробовал все сверху - у меня не получилось.

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

  1. Заходим в настройки ведомого

  2. Добавить новую переменную среды

  3. ДОРОЖКА
  4. $ {ПУТЬ}: $ {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 (менеджер пакетов). Установка настроила jenkins как услугу

 # 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

Мне удалось установить переменные env для процесса 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 чуть выше неинтерактивной проверки.

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

Juge
источник
-1

1- добавьте в свой файл профиля файл ".bash_profile"

он находится в папке "/ home / your_user /"

vi .bash_profile

Добавить:

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

==> это рабочее пространство e jenkins

2- Если вы используете причал: перейдите в файл jenkins.xml

и добавить :

<Arg>/apps/data/jenkins</Arg>
Фадид
источник