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

FWIW คุณควรจะสามารถใช้ SSH ใน OS X ได้หากคุณเปิดใช้งานการเข้าถึงระยะไกลในการตั้งค่าระบบดังนั้นคุณสามารถควบคุมการเชื่อมต่อจาก Jenkins
Daniel Beck

ใช่ แต่ระบบเชื่อมต่อกับ Active Directory และฉันไม่สามารถใช้ข้อมูลรับรองโฆษณาของฉันกับระบบเจนกินส์ แต่ฉันคิดว่าฉันพบทางออก ฉันจะตรวจสอบและโพสต์ในภายหลังหากใช้งานได้ ...
mr.VVoo

การตรวจสอบความถูกต้อง SSH โดยใช้กุญแจจะเป็นตัวเลือกดังนั้นคุณไม่จำเป็นต้องให้รหัสผ่านในเจนกินส์
Daniel Beck

แต่กุญแจของฉัน ดังนั้นทุกคนที่มีสิทธิ์เข้าถึงเจนกินส์นี้ก็จะมีความเป็นไปได้เช่นกันและน่าเสียดายที่ทั้ง บริษัท สามารถเข้าถึงเจนกินส์
mr.VVoo

คำตอบ:


7

ปัญหาคือทาสเจนกินส์พยายามที่จะเริ่ม UI บางอย่าง แต่นี่คือ - ไม่ได้รับอนุญาต ฉันพบข้อผิดพลาดเดียวกันซึ่งเกี่ยวข้องกับรายงานข้อผิดพลาดอย่างเป็นทางการ: 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.