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

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

Я установил Jenkins на Centos с родным rpm с сайта Jenkins. Я использую запуск script с установкой с помощью sudo /etc/init.d/jenkins start

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

Ответ 1

Майкл

Две вещи:

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

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

Чтобы изменить путь, используемый Дженкинсом, у вас есть два варианта (AFAIK):

1) Отредактируйте свой /etc/profile файл и добавьте пути, которые вы хотите там

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

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

Ответ 2

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

source /etc/profile

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

Ответ 3

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

/etc/init.d/jenkins restart

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

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

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

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

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

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

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

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

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

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

Ответ 10

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

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

Jenkins variable + notation

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

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

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

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

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

Или документы по Java на EnvVars здесь.

Ответ 11

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

Ответ 12

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

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

export PATH = $PATH:/some/new/путь/bin

Ответ 13

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

source ~/.bashrc

Описание

Сначала я проверил, что Jenkins запускал BASH, с echo $SHELL и echo $BASH (обратите внимание, что я явно помещаю #!/bin/bash поверх текстового поля в Jenkins, я не уверен, что это требование получить BASH). source ing /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 он решил проблему.

Ответ 14

Добавить

/usr/bin/bash

at

Jenkins → Управление Jenkins → настроить систему → Shell- > Shell Исполняемый

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

Ответ 15

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

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

  • Перейдите к настройкам подчиненного устройства

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

  • PATH
  • ${PATH}: ${HOME}/паб-кэш/бен:.. ${HOME}/локальные/бен

Важная часть "$ {HOME}". Это делает дополнительный PATH абсолютным. Относительный путь не работал у меня.

Вариант II (трубопровод script)

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

Ответ 16

В Ubuntu я просто редактирую /etc/default/jenkins и добавляю источник /etc/profile в конце, и он работает со мной.

Ответ 17

Запуск команды с набором переменных среды также эффективен. Конечно, вы должны сделать это для каждой команды, которую вы запускаете, но у вас, вероятно, есть работа script, поэтому у вас, вероятно, есть только одна команда для каждой сборки. Моя работа script - это python script, который использует среду для определения того, какой python использовать, поэтому мне все еще нужно было поставить /usr/local/bin/python 2.7 в свой путь:

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

Ответ 18

Что работало для меня, было переопределение среды PATH для подчиненного устройства.

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

Затем отключите и снова подключите ведомый.

Несмотря на то, что отображалась системная информация, он работал.

Ответ 19

У меня 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 sources /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 vars для процесса jenkins через .bashrc в его домашнем каталоге - /var/lib/jenkins. Я должен был создать /var/lib/jenkins/.bashrc, которого раньше не было.

Ответ 20

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

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

Ответ 21

Я работаю с Дженкинс PipeLine, и я использовал это:

environment { PATH = "/your/path/in/jenkins:$PATH" }

и это сработало !!!

Благодарю.

Ответ 22

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>