Je vais essayer de commencer les Jenkins 'slave.jar
Sur un Mac OS X 10.8.3 Utilisation d'un démon de lancement afin qu'il fonctionne juste après le démarrage de la machine.
Mais je rencontre un problème mystérieux: le LaunchDaemon
commence l'esclave comme je peux voir dans les fichiers journaux
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
Mais la connexion est fermée juste après cela:
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
ICI J'ai trouvé une solution à ce problème - ajouter Sudo
comme première commande.
Cela fonctionne quand je l'exécute par moi-même dans Terminal OR lorsque j'arrête manuellement et démarrez le lanceurDaemon via _ launchctl
. Il sonne stupide - exécuté une commande exécutée via sudo mais elle fonctionne dans ce cas. [~ # ~ ~] mais [~ # ~ ~] il ne fonctionne pas Travailler lorsque le système commence manuellement. Une idée? Voici mon fichier laundaemon.plist:
<?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>
Le problème est que l'esclave Jenkins tente de commencer une interface utilisateur, mais c'est - bien sûr - non autorisé. J'ai trouvé la même erreur liée à un rapport de bogue officiel: https://issues.jenkins-ci.org/browse/jenkins-15697
La solution est dans ce cas pour ajouter -Djava.awt.headless=true
Options JVM qui conduisent à la configuration suivante d'un lanceurDaemon.
<?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>
J'ai testé cela et ça marche.