Starten Sie Jenkins Slave unter Mac OS X als LaunchDaemon

12647
mr.VVoo

Ich versuche, die Jenkins slave.jarauf einem Mac OS X 10.8.3 mit einem Launch Daemon zu starten, damit dieser direkt nach dem Start der Maschine ausgeführt wird.

Aber ich habe ein mysteriöses Problem: Das LaunchDaemonstartet den Slave, wie ich in den Logfiles sehen kann

29.04.2013 14:57:06 hudson.remoting.jnlp.Main$CuiListener status INFO: Locating server among [http://ci.****/] 29.04.2013 14:57:06 hudson.remoting.jnlp.Main$CuiListener status INFO: Connecting to ci.****:53930 29.04.2013 14:57:06 hudson.remoting.jnlp.Main$CuiListener status INFO: Handshaking 29.04.2013 14:57:06 hudson.remoting.jnlp.Main$CuiListener status INFO: Connected 

Aber die Verbindung ist gleich danach geschlossen:

29.04.2013 14:57:06 hudson.remoting.SynchronousCommandTransport$ReaderThread run SCHWERWIEGEND: I/O error in channel channel java.io.IOException: Unexpected termination of the channel at hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:50) Caused by: java.io.EOFException at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2576) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1295) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:349) at hudson.remoting.Command.readFrom(Command.java:92) at hudson.remoting.ClassicCommandTransport.read(ClassicCommandTransport.java:59) at hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:48) 29.04.2013 14:57:06 hudson.remoting.jnlp.Main$CuiListener status INFO: Terminated 

Hier habe ich eine Lösung für dieses Problem gefunden - sudoals ersten Befehl hinzugefügt .

Das funktioniert, wenn ich es alleine in Terminal starte ODER wenn ich das LaunchDaemon manuell stoppe und starte launchctl. Es klingt dumm - ein Befehl auszuführen, der über sudo ausgeführt wird, funktioniert aber in diesem Fall. ABER es funktioniert nicht, wenn das System manuell gestartet wird. Irgendeine Idee? Hier ist meine LaunchDaemon.plist-Datei:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.example.ci</string> <key>ProgramArguments</key> <array> <string>sudo</string> <string>/usr/bin/java</string> <string>-jar</string> <string>/Developer/jenkins/slave.jar</string> <string>-jnlpUrl</string> <string>http://ci.****/computer/****/slave-agent.jnlp</string> <string>-jnlpCredentials</string> <string>user:apitoken</string> </array> <key>KeepAlive</key> <true/> <key>StandardOutPath</key> <string>/Developer/jenkins/stdout.log</string> <key>StandardErrorPath</key> <string>/Developer/jenkins/error.log</string> </dict> </plist> 
6
Sie müssen wahrscheinlich das Arbeitsverzeichnis für diesen Befehl festlegen, da dieses als Jenkins-Home auf dem Slave-IIRC verwendet wird. Einen Build-Slave als "root" auszuführen, ist eine wirklich schlechte Idee. FYI neuere Versionen von Jenkins (~ LTS 1,480) verfügen außerdem über einen separaten Slave-Token pro Slave, sodass Sie kein API-Token eines Benutzers mehr verwenden müssen. Daniel Beck vor 11 Jahren 0
FWIW Sie sollten SSH in OS X aufnehmen können, wenn Sie den Remotezugriff in den Systemeinstellungen aktivieren, um die Verbindung von Jenkins aus zu steuern. Daniel Beck vor 11 Jahren 0
Ja, aber das System ist mit einem Active Directory verbunden. Und ich kann meine AD-Anmeldeinformationen nicht auf das Jenkins-System anwenden. Aber ich denke, ich habe eine Lösung gefunden. Ich werde es überprüfen und später posten, ob es funktioniert ... mr.VVoo vor 11 Jahren 0
Die SSH-Authentifizierung mithilfe von Schlüsseln wäre eine Option, sodass Sie in Jenkins kein Kennwort eingeben müssen. Daniel Beck vor 11 Jahren 0
Aber mein Schlüssel. Jeder andere, der Zugriff auf diese Jenkins hat, wird auch diese Möglichkeit haben, und leider hat das gesamte Unternehmen Zugriff auf die Verwaltung von Jenkins. mr.VVoo vor 11 Jahren 0
Richtig - ich habe nicht an ungesicherte Jenkins gedacht. OTOH kann dann ohnehin beliebigen Code auf Ihrer Maschine ausführen. Ein separates Jenkins-Benutzerkonto auf Ihrem Mac ist auf jeden Fall eine gute Idee. Daniel Beck vor 11 Jahren 0
Vielen Dank. Ich werde darüber nachdenken. Es ist also nicht wirklich unsicher, aber ALLEN Benutzern unseres Zugriffsverzeichnisses wird Zugriff gewährt mr.VVoo vor 11 Jahren 0
Es ist in The Jenkins JNLP auf dem Mac eingebaut. Installieren Sie es einfach als Service. Sie können es so machen: http://stackoverflow.com/a/29288346/2003734 vor 9 Jahren 0

1 Antwort auf die Frage

7
mr.VVoo

Das Problem ist, dass der Jenkins-Slave versucht, eine UI zu starten, was aber natürlich nicht erlaubt ist. Ich habe den gleichen Fehler gefunden, der sich auf einen offiziellen Fehlerbericht bezieht: https://issues.jenkins-ci.org/browse/JENKINS-15697

Die Lösung besteht in diesem Fall darin -Djava.awt.headless=true, JVM-Optionen hinzuzufügen, was zur folgenden Konfiguration eines LaunchDaemon führt.

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.example.ci</string> <key>ProgramArguments</key> <array> <string>sudo</string> <string>/usr/bin/java</string> <string>-Djava.awt.headless=true</string> <string>-jar</string> <string>/Developer/jenkins/slave.jar</string> <string>-jnlpUrl</string> <string>http://ci.****/computer/****/slave-agent.jnlp</string> <string>-jnlpCredentials</string> <string>user:apitoken</string> </array> <key>KeepAlive</key> <true/> <key>StandardOutPath</key> <string>/Developer/jenkins/stdout.log</string> <key>StandardErrorPath</key> <string>/Developer/jenkins/error.log</string> </dict> </plist> 

Ich habe das getestet und es funktioniert.

Hallo, ist es möglich, den Slave als 'normaler Benutzer' ohne 'sudo' zu betreiben? karim vor 11 Jahren 0
Kann es nicht funktionieren lassen. Wie kann geprüft werden, bei welchem ​​Schritt es fehlschlägt? orkenstein vor 7 Jahren 0