ฉันกำลังพยายามเริ่มเจนกินส์ 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>
root
เป็นความคิดที่เลวจริงๆ Jenkins รุ่นใหม่กว่าของ FYI (~ LTS 1,480) มีโทเค็นสเลฟที่แยกต่างหากต่อสลาฟดังนั้นคุณไม่ต้องใช้โทเค็น API ของผู้ใช้อีก