У меня есть подчиненное устройство 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
Следовательно, ПУТЬ неправильно установлен для текущего пользователя, вошедшего в систему.
~/.profile
чтобы настроить переменные среды ...В чем дело? Почему ведомое устройство 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