Запустите 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>

Вам, вероятно, нужно установить рабочий каталог для этой команды, так как он используется в качестве дома Дженкинса на подчиненном 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>

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


Привет, возможно ли запустить ведомого без 'sudo', как обычный пользователь?
karim

Не могу заставить это работать. Как проверить, на каком этапе это не удается?
orkenstein
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.