fragen stichworte

Warum unterscheidet sich PATH beim Starten von Jenkins Slave über launchctl?

Ich habe einen Jenkins-Slave, der auf macOS über ssh slave läuft, dann screen und dann das folgende Skript startet, das sicherstellt, dass der Server erneut verbunden wird, wenn er ausfällt:

#!/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

Dies funktioniert hervorragend. echo $PATH in einem Jenkins-Job entspricht dem Ausführen von echo $PATH in einer Terminalsitzung, die über ssh geöffnet wird.

Manchmal müssen wir den Computer jedoch neu starten, daher möchte ich, dass dieses Skript beim Anmelden ausgeführt wird. Ich habe das Starten des Skripts über die launchctl-Lösung und die App, die sich in der macOS-Liste der Benutzeranwendungen befindet, getestet.

Beide Zeiten echo $PATH des Jenkins-Sklaven sind einfach gleich: /usr/bin:/bin:/usr/sbin:/sbin Daher ist der PATH vom aktuell angemeldeten Benutzer nicht korrekt festgelegt.

  • Der Prozess läuft unter den Benutzerkonten
  • Sogar der Prozess, den Jenkins Slave startet, läuft unter dem Benutzerkonto
  • Wir verwenden nur ~/.profile, um die Umgebungsvariablen einzurichten ...

Was ist los? Warum richtet Jenkins Slave die PATH-Variable nicht korrekt ein, wenn ich das obige Skript über launchctl oder Application starte?

UPDATE: Ich habe es durch das explizite Sourcing des Profils im Job von Jenkins zum Laufen gebracht: source/Users/leanplumbuild/.profile Weiß jemand, warum Jenkins-Slave das nicht automatisch macht?

antworten

Ich weiß es nicht genau, aber ich schätze, dass Jenkins die Subshell nicht als 'Login-Shell' startet. Wenn Sie sich in einer interaktiven Umgebung bei einer Shell anmelden, lädt die Shell Umgebungsdateien anders als beim Start über eine "nicht interaktive" Umgebung, wie zB cron. Um dieses Verhalten zu ändern und Ihre Umgebungen mit mehr Treue "übereinstimmen" zu lassen, müssen Sie die Subshell als Login-Shell starten. Es gibt verschiedene Möglichkeiten, dies zu tun, und ich bin sicher, Jenkins hat einen Weg, der robuster ist, aber zumindest können Sie versuchen, die erste Sh-Bang-Linie in

zu ändern
#!/bin/bash -l

Entfernen Sie diese explizite Bezugszeile aus dem Job. Mal sehen, ob alles funktioniert! :)

Schauen Sie sich den langen und komplexen Abschnitt der bash-Manpage "INVOCATION" an. https://linux.die.net/man/1/bash