Назад | Перейти на главную страницу

Почему отличается PATH при запуске ведомого устройства Jenkins через launchctl?

У меня есть подчиненное устройство Jenkins, работающее на macOS через ssh slave, затем screen, затем запускаем следующий скрипт, который обязательно переподключит сервер, если он выйдет из строя:

#!/usr/bin/env bash

function startSlave() {
  java -jar /Users/user/slave.jar -jnlpUrl https://jenkins.company.com/computer/slave-office/slave-agent.jnlp -secret xyz
  sleep 3
}

startSlave

while true; do
  PID=$(pgrep "slave-agent.jnlp" | awk '{print $2}')
  if [[ -z $PID ]]; then
    echo "Jenkins slave has died, restarting..."
    startSlave
  fi
  sleep 60
done

Это отлично работает, echo $PATH в работе Дженкинса то же самое, что и бег echo $PATH в терминальном сеансе, открытом через ssh.

Иногда нам нужно перезагрузить компьютер, поэтому я хочу, чтобы этот сценарий выполнялся при входе в систему. Я тестировал запуск сценария с помощью решения launchctl и приложения, которое находится в списке приложений для запуска пользователя macOS.

Оба раза echo $PATH раба Дженкинса просто равно: /usr/bin:/bin:/usr/sbin:/sbin Следовательно, ПУТЬ неправильно установлен для текущего пользователя, вошедшего в систему.

В чем дело? Почему ведомое устройство Jenkins неправильно устанавливает переменную PATH, когда я запускаю указанный выше скрипт через launchctl или Application?

ОБНОВЛЕНИЕ: я заставил его работать, явно указав профиль источника в задании Jenkins: source /Users/leanplumbuild/.profile Кто-нибудь знает, почему Jenkins-Slave не делает этого автоматически?

Я не знаю точно, но я предполагаю, что это связано с тем, что Дженкинс не запускает подоболочку как «оболочку входа». Когда вы входите в оболочку в интерактивной среде, оболочка загружает файлы среды иначе, чем когда она запускается через «неинтерактивную» среду, такую ​​как cron. Чтобы изменить это поведение и сделать ваши среды более точными, вам необходимо запустить подоболочку как оболочку входа в систему. Есть разные способы сделать это, и я уверен, что у Дженкинса есть способ более надежный, но, как минимум, вы можете попробовать изменить первую строчку sh-bang на:

#!/bin/bash -l

Удалите эту явную строку поиска из задания. Теперь посмотрим, все ли работает! :)

Для справки, взгляните на длинный и сложный раздел страницы руководства bash "INVOCATION". https://linux.die.net/man/1/bash