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

12565
mr.VVoo

Я пытаюсь запустить jenkins slave.jarна Mac OS X 10.8.3, используя демон запуска, чтобы он запускался сразу после запуска машины.

Но я испытываю загадочную проблему: 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качестве первой команды.

Это работает, когда я запускаю его самостоятельно в Терминале ИЛИ, когда я вручную останавливаю и запускаю 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> 
6
Вам, вероятно, нужно установить рабочий каталог для этой команды, так как он используется в качестве дома Дженкинса на подчиненном IIRC. Запустить сборку подчиненного как `root` - очень плохая идея. К сведению, более новые версии Jenkins (~ LTS 1480) также имеют отдельный токен подчиненного устройства, поэтому вам больше не нужно использовать токен API пользователя. Daniel Beck 11 лет назад 0
FWIW Вы должны иметь возможность SSH в OS X, если вы включите удаленный доступ в системных настройках, чтобы вы могли контролировать соединение от Jenkins. Daniel Beck 11 лет назад 0
Да, но система подключена к Active Directory. И я не могу применить свои учетные данные AD к системе Дженкинса. Но я думаю, что нашел решение. Я проверю это и отправлю позже, если это работает ... mr.VVoo 11 лет назад 0
SSH-аутентификация с использованием ключей была бы опцией, поэтому вам не нужно указывать пароль в Jenkins. Daniel Beck 11 лет назад 0
Но мой ключ. Таким образом, все остальные, кто имеет доступ к этому jenkins, также получат такую ​​возможность, и, к сожалению, вся компания имеет доступ к администрированию jenkins. mr.VVoo 11 лет назад 0
Правда - не думал о необеспеченных Дженкинс. OTOH тогда они могут выполнить произвольный код на вашем компьютере в любом случае. В любом случае, хорошая учетная запись Jenkins на вашем Mac может быть хорошей идеей. Daniel Beck 11 лет назад 0
Благодарю. Я подумаю об этом. Таким образом, это не совсем небезопасно, но доступ предоставляется ВСЕМ пользователям нашего каталога доступа mr.VVoo 11 лет назад 0
Это встроено в JNLP Дженкинс на Mac. просто установите его как сервис. Вы можете сделать это так: http://stackoverflow.com/a/29288346/2003734 9 лет назад 0

1 ответ на вопрос

7
mr.VVoo

Проблема в том, что раб Дженкинс пытается запустить какой-то пользовательский интерфейс, но это, конечно, запрещено. Я обнаружил ту же ошибку, которая связана с официальным сообщением об ошибке: 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 11 лет назад 0
Не могу заставить это работать. Как проверить, на каком этапе это не удается? orkenstein 7 лет назад 0

Похожие вопросы