Запустите Jenkins Slave в Mac OS X как LaunchDaemon

6

Я пытаюсь начать Дженкинс slave.jar на Mac OS X 10.8.3 с помощью Launch Daemon, чтобы он работал сразу после запуска машины.

Но я испытываю загадочную проблему: LaunchDaemon запускает раб, как я вижу в лог-файлах

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

Но соединение закрывается сразу после этого:

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

Вот я нашел решение этой проблемы - добавление sudo как первая команда.

Это работает, когда я запускаю его самостоятельно в терминале ИЛИ, когда я вручную останавливаю & amp; запустить LaunchDaemon через launchctl, Звучит глупо - запускать команду, которая выполняется через sudo, но в этом случае это работает. НО Это не работать, когда система запускается вручную. Любая идея? Вот мой файл LaunchDaemon.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>
mr.VVoo
источник
Вам, вероятно, нужно установить рабочий каталог для этой команды, так как он используется в качестве дома Дженкинса на подчиненном IIRC. Запуск сборки ведомого как root это действительно плохая идея. К сведению, в более новых версиях Jenkins (~ LTS 1480) также есть отдельный токен подчиненного устройства, поэтому вам больше не нужно использовать токен API пользователя.
Daniel Beck
FWIW Вы должны иметь возможность SSH в OS X, если вы включите удаленный доступ в системных настройках, чтобы вы могли контролировать соединение из Jenkins.
Daniel Beck
Да, но система подключена к Active Directory. И я не могу применить свои учетные данные AD к системе Дженкинса. Но я думаю, что нашел решение. Я проверю это и опубликую это позже, если это работает ...
mr.VVoo
SSH-аутентификация с использованием ключей была бы опцией, поэтому вам не нужно указывать пароль в Jenkins.
Daniel Beck
Но мой ключ. Так что все остальные, кто имеет доступ к этому jenkins, также получат такую ​​возможность, и, к сожалению, вся компания имеет доступ к администрированию jenkins.
mr.VVoo

Ответы:

7

Проблема в том, что раб Дженкинс пытается запустить какой-то пользовательский интерфейс, но это, конечно, запрещено. Я обнаружил ту же ошибку, которая связана с официальным сообщением об ошибке: https://issues.jenkins-ci.org/browse/JENKINS-15697

Решение в этом случае добавить -Djava.awt.headless=true к параметрам JVM, что приводит к следующей конфигурации LaunchDaemon.

<?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>

Я проверил это, и это работает.

mr.VVoo
источник
Привет, возможно ли запустить ведомого без 'sudo', как обычный пользователь?
karim
Не могу заставить это работать. Как проверить, на каком этапе это не удается?
orkenstein