สรุป:
การตั้งค่า Jenkins บน OS X ทำได้ง่ายขึ้นอย่างมากด้วยตัวติดตั้งล่าสุด ( ณ วันที่ 1.449 - 9 มีนาคม 2555 ) อย่างไรก็ตามการจัดการกระบวนการเซ็นรหัสยังคงเป็นเรื่องยากมากโดยไม่มีคำตอบที่ตรงไปตรงมา
แรงจูงใจ:
เรียกใช้เซิร์ฟเวอร์ CI แบบไม่มีหัวซึ่งเป็นไปตามแนวทางปฏิบัติที่ดีที่สุดทั่วไปสำหรับการเรียกใช้บริการบน OS X ( บางส่วนมีคำอธิบายที่นี่เป็นภาษาธรรมดา )
พื้นหลัง:
- 12 ตุลาคม 2552 - วิธีสร้างแอป iPhone ของคุณโดยอัตโนมัติด้วย Hudson
- 15 มิถุนายน 2554 - เจนกินส์บน Mac OS X; git w / ssh คีย์สาธารณะ
- 23 มิถุนายน 2554 - การปรับใช้แอป iOS อย่างต่อเนื่องกับ Jenkins และ TestFlight
- 26 กรกฎาคม 2554 - ไม่มีใบรับรองและคีย์ในพวงกุญแจขณะใช้ Jenkins / Hudson เป็นการผสานรวมอย่างต่อเนื่องสำหรับการพัฒนา iOS และ Mac
- 30 สิงหาคม 2554 - ไม่พบไฟล์การจัดเตรียม Xcode ใน Jenkins
- 20 กันยายน 2554 - วิธีตั้งค่า Jenkins CI บน Mac
- 14 กันยายน 2554 - ทำให้Jenkins ทำงานบนเครื่อง Mac
- 12 พฤศจิกายน 2554 - Howto: ติดตั้ง Jenkins บน OS X และสร้างสิ่งต่างๆของ Mac
- 23 มกราคม 2555 - การเปลี่ยนแปลงโปรแกรมติดตั้ง Jenkins OSX ที่กำลังจะมีขึ้น
- 7 มีนาคม 2012 - ขอบคุณที่ใช้ OSX Installer
กระบวนการ:
ติดตั้งเจนกินส์ CI ผ่าน OS X แพคเกจติดตั้ง สำหรับขั้นตอน "ประเภทการติดตั้ง" ให้คลิกปุ่มกำหนดค่าเองแล้วเลือก "เริ่มที่การบูตเป็น" เจนกินส์ "
อภิปรายผล:
ความคาดหวังที่ไร้เดียงสา ณ จุดนี้คือโปรเจ็กต์ฟรีสไตล์ที่มีสคริปต์บิลด์xcodebuild -target MyTarget -sdk iphoneos
ควรใช้งานได้ ตามที่ระบุโดยชื่อของโพสต์นี้มันไม่ได้และล้มเหลวด้วย:
Code Sign error: The identity 'iPhone Developer' doesn't match any valid certificate/private key pair in the default keychain
เห็นได้ชัดว่าต้องเกิดอะไรขึ้น - คุณต้องเพิ่มใบรับรองการเซ็นชื่อรหัสที่ถูกต้องและคีย์ส่วนตัวลงในพวงกุญแจเริ่มต้น ในการค้นคว้าวิธีการทำสิ่งนี้ฉันไม่พบวิธีแก้ปัญหาที่ไม่ทำให้ระบบมีช่องโหว่ในระดับหนึ่ง
ปัญหาที่ 1: ไม่มีพวงกุญแจเริ่มต้นสำหรับ jenkins daemon
sudo -u jenkins security default-keychain
... ให้ผล "ไม่พบพวงกุญแจเริ่มต้น"
ตามที่ระบุไว้ด้านล่างโดยIvo Dancet UserShell ถูกตั้งค่าเป็น / usr / bin / false สำหรับ jenkins daemon ตามค่าเริ่มต้น (ฉันคิดว่านี่เป็นคุณสมบัติไม่ใช่ข้อผิดพลาด) ทำตามคำตอบของเขาเพื่อเปลี่ยน UserShell เป็น bash จากนั้นคุณสามารถใช้sudo su jenkins
เพื่อเข้าสู่ระบบในฐานะผู้ใช้ jenkins และรับข้อความ bash
sudo su jenkins
cd ~/Library
mkdir Keychains
cd Keychains
security create-keychain <keychain-name>.keychain
security default-keychain -s <keychain-name>.keychain
โอเคดีมาก ตอนนี้เรามีพวงกุญแจเริ่มต้นแล้ว ไปต่อเลยดีไหม? แต่ก่อนอื่นทำไมเราถึงต้องกังวลกับการสร้างพวงกุญแจเริ่มต้น?
คำตอบคำแนะนำหรือบทสนทนาเกือบทั้งหมดที่ฉันอ่านตลอดการค้นคว้าแนะนำว่าควรโยนใบรับรองการเซ็นชื่อรหัสและคีย์ลงในพวงกุญแจระบบ หากคุณดำเนินsecurity list-keychains
โครงการฟรีสไตล์ในเจนกินส์คุณจะเห็นว่าพวงกุญแจเดียวที่ใช้ได้คือพวงกุญแจระบบ ฉันคิดว่านั่นเป็นจุดที่คนส่วนใหญ่คิดที่จะใส่ใบรับรองและคีย์ไว้ที่นั่น แต่นี้ก็ดูเหมือนว่าความคิดที่ดีมาก - โดยเฉพาะอย่างยิ่งที่คุณจะต้องสร้างสคริปต์ข้อความธรรมดาด้วยรหัสผ่านเพื่อเปิดพวงกุญแจ
ปัญหาที่ 2: การเพิ่มใบรับรองการเซ็นชื่อรหัสและคีย์ส่วนตัว
นี่คือจุดที่ฉันเริ่มรู้สึกแย่จริงๆ ฉันมีความรู้สึกว่าควรสร้างคีย์สาธารณะ / ส่วนตัวใหม่ที่ไม่ซ้ำใครเพื่อใช้กับเจนกินส์ กระบวนการคิดของฉันคือถ้า jenkins daemon ถูกบุกรุกฉันสามารถเพิกถอนใบรับรองได้อย่างง่ายดายในพอร์ทัลการจัดเตรียมของ Apple และสร้างคีย์สาธารณะ / ส่วนตัวอื่น หากฉันใช้คีย์และใบรับรองเดียวกันสำหรับบัญชีผู้ใช้ของฉันและเจนกินส์นั่นหมายถึงความยุ่งยาก (ความเสียหาย) มากขึ้นหากบริการเจนกินส์ถูกโจมตี
เมื่อชี้ไปที่คำตอบของ Simon Urbanekคุณจะปลดล็อกพวงกุญแจจากสคริปต์ด้วยรหัสผ่านแบบข้อความธรรมดา ดูเหมือนว่าไม่มีความรับผิดชอบที่จะเก็บอะไรไว้นอกจากใบรับรองและกุญแจ "ทิ้ง" ในพวงกุญแจของเจนคินส์ภูต
ฉันสนใจมากในการอภิปรายใด ๆ ในทางตรงกันข้าม ฉันระมัดระวังตัวมากเกินไปหรือไม่?
ในการสร้าง CSR ใหม่เป็น jenkins daemon ใน Terminal ฉันทำสิ่งต่อไปนี้ ...
sudo su jenkins
certtool r CertificateSigningRequest.certSigningRequest
คุณจะได้รับแจ้งสิ่งต่อไปนี้ (ส่วนใหญ่ฉันคาดเดาคำตอบที่ถูกต้องคุณมีความเข้าใจที่ดีขึ้นหรือไม่โปรดแบ่งปัน) ...- ป้อนคีย์และป้ายกำกับใบรับรอง:
- เลือกอัลกอริทึม:
r
(สำหรับ RSA) - ป้อนขนาดคีย์เป็นบิต:
2048
- เลือกอัลกอริทึมลายเซ็น:
5
(สำหรับ MD5) - ป้อนสตริงคำท้า:
- จากนั้นคำถามมากมายสำหรับ RDN
- ส่งไฟล์ CSR ที่สร้างขึ้น (CertificateSigningRequest.certSigningRequest) ไปที่ Provisioning Portal ของ Apple ภายใต้ Apple ID ใหม่
- อนุมัติคำขอและดาวน์โหลดไฟล์. cer
security unlock-keychain
security add-certificate ios_development.cer
สิ่งนี้ทำให้เราเข้าใกล้อีกก้าว ...
ปัญหาที่ 3: การจัดเตรียมโปรไฟล์และการปลดล็อกพวงกุญแจ
ฉันสร้างโปรไฟล์การจัดเตรียมพิเศษในพอร์ทัลการจัดเตรียมเพื่อใช้กับ CI โดยหวังว่าหากมีสิ่งเลวร้ายเกิดขึ้นฉันจะทำให้ผลกระทบน้อยลงเล็กน้อย วิธีปฏิบัติที่ดีที่สุดหรือระมัดระวังมากเกินไป?
sudo su jenkins
mkdir ~/Library/MobileDevice
mkdir ~/Library/MobileDevice/Provisioning\ Profiles
- ย้ายโปรไฟล์การจัดเตรียมที่คุณตั้งค่าในพอร์ทัลการจัดเตรียมไปไว้ในโฟลเดอร์ใหม่นี้ ตอนนี้เราอยู่ห่างจากความสามารถในการเรียกใช้ xcodebuild จากบรรทัดคำสั่งเป็นเจนกินส์เพียงสองก้าวและนั่นหมายความว่าเราใกล้จะได้รับ Jenkins CI ที่รันบิลด์แล้ว
security unlock-keychain -p <keychain password>
xcodebuild -target MyTarget -sdk iphoneos
ตอนนี้เราได้รับการสร้างที่ประสบความสำเร็จจากบรรทัดคำสั่งเมื่อเข้าสู่ระบบเป็น jenkins daemon ดังนั้นหากเราสร้างโครงการฟรีสไตล์และเพิ่มสองขั้นตอนสุดท้าย (# 5 และ # 6 ด้านบน) เราจะสามารถสร้างการสร้างโดยอัตโนมัติ โครงการ iOS ของเรา!
อาจไม่จำเป็น แต่ฉันรู้สึกดีกว่าที่จะตั้งค่า jenkins UserShell กลับไปที่ / usr / bin / false หลังจากที่ฉันได้รับการตั้งค่าทั้งหมดนี้สำเร็จ ฉันกำลังหวาดระแวง?
ปัญหาที่ 4: พวงกุญแจเริ่มต้นยังไม่พร้อมใช้งาน!
( แก้ไข: ฉันโพสต์การแก้ไขคำถามของฉันรีบูตเพื่อให้แน่ใจว่าการแก้ปัญหาของฉันเป็น 100% และแน่นอนฉันจะทิ้งขั้นตอนไว้ )
แม้จะทำตามขั้นตอนข้างต้นทั้งหมดแล้วคุณจะต้องแก้ไข Launch Daemon plist ที่ /Library/LaunchDaemons/org.jenkins-ci.plist ตามที่ระบุไว้ในคำตอบนี้ โปรดทราบว่านี่เป็นข้อผิดพลาดของ openrdarด้วย
ควรมีลักษณะดังนี้:
<?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>EnvironmentVariables</key>
<dict>
<key>JENKINS_HOME</key>
<string>/Users/Shared/Jenkins/Home</string>
</dict>
<key>GroupName</key>
<string>daemon</string>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>org.jenkins-ci</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Library/Application Support/Jenkins/jenkins-runner.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>UserName</key>
<string>jenkins</string>
<!-- **NEW STUFF** -->
<key>SessionCreate</key>
<true />
</dict>
</plist>
ด้วยการตั้งค่านี้ฉันขอแนะนำปลั๊กอิน Xcode สำหรับ Jenkinsซึ่งทำให้การตั้งค่าสคริปต์ xcodebuild ง่ายขึ้นเล็กน้อย ณ จุดนี้ฉันขอแนะนำให้อ่านหน้าคนสำหรับ xcodebuild - คุณทำมันมาไกลใน Terminal ใช่ไหม?
การตั้งค่านี้ไม่สมบูรณ์แบบและคำแนะนำหรือข้อมูลเชิงลึกจะได้รับการชื่นชมอย่างมาก
ฉันมีปัญหาในการเลือกคำตอบที่ "ถูกต้อง" เนื่องจากสิ่งที่ฉันใช้ในการแก้ปัญหาของฉันคือการรวบรวมข้อมูลที่ทุกคนป้อนเข้ามา ฉันพยายามให้ทุกคนโหวตอย่างน้อยที่สุด แต่ให้รางวัลกับ Simon เพราะเขาตอบคำถามเดิมเป็นส่วนใหญ่ นอกจากนี้Sami Tikka ยังสมควรได้รับเครดิตอย่างมากสำหรับความพยายามของเขาที่ทำให้ Jenkins ทำงานผ่าน AppleScript ในฐานะแอป OS X ธรรมดา ๆ หากคุณสนใจเพียงแค่ทำให้ Jenkins เริ่มต้นและดำเนินการอย่างรวดเร็วภายในเซสชันผู้ใช้ของคุณ (เช่นไม่ใช่เซิร์ฟเวอร์ที่ไม่มีหัว) โซลูชันของเขานั้นคล้ายกับ Mac มาก
ฉันหวังว่าความพยายามของฉันจะจุดประกายการสนทนาเพิ่มเติมและช่วยผู้ที่น่าสงสารคนต่อไปที่คิดว่าพวกเขาสามารถตั้งค่า Jenkins CI สำหรับโปรเจ็กต์ iOS ของพวกเขาได้ในช่วงสุดสัปดาห์เพราะทุกสิ่งที่ยอดเยี่ยมที่พวกเขาเคยได้ยินเกี่ยวกับเรื่องนี้
อัปเดต: 9 สิงหาคม 2556
ด้วยการโหวตและรายการโปรดมากมายฉันคิดว่าฉันจะกลับมาที่ 18 เดือนต่อมาพร้อมกับบทเรียนสั้น ๆ ที่ได้เรียนรู้
บทที่ 1: อย่าเปิดเผย Jenkins สู่อินเทอร์เน็ตสาธารณะ
ใน WWDC 2012 ฉันได้ถามคำถามนี้กับวิศวกร Xcode และ OS X Server ฉันได้รับเสียงขรมว่า "อย่าทำอย่างนั้น!" จากใครก็ตามที่ฉันถาม พวกเขาทั้งหมดเห็นพ้องกันว่ากระบวนการสร้างอัตโนมัตินั้นยอดเยี่ยม แต่เซิร์ฟเวอร์ควรเข้าถึงได้บนเครือข่ายท้องถิ่นเท่านั้น วิศวกร OS X Server แนะนำให้อนุญาตการเข้าถึงระยะไกลผ่าน VPN
บทที่ 2: ตอนนี้มีตัวเลือกการติดตั้งใหม่
ฉันเพิ่งให้ CocoaHeads พูดคุยเกี่ยวกับประสบการณ์ของเจนกินส์ของฉันและฉันประหลาดใจมากที่ผมพบว่าบางวิธีการติดตั้งใหม่ - Homebrew และแม้กระทั่งBitNami Mac App Storeรุ่น สิ่งเหล่านี้คุ้มค่าที่จะลองดู โจนาธานไรท์มีส่วนสำคัญรายละเอียดการรับHomebrew เจนกินส์ทำงาน
บทที่ 3: ไม่จริงจังอย่าเปิดเผยกล่องงานสร้างของคุณกับอินเทอร์เน็ต
ค่อนข้างชัดเจนจากโพสต์เดิมว่าฉันไม่ใช่ผู้ดูแลระบบหรือผู้เชี่ยวชาญด้านความปลอดภัย สามัญสำนึกเกี่ยวกับสิ่งของส่วนตัว (พวงกุญแจหนังสือรับรองใบรับรอง ฯลฯ ) ทำให้ฉันรู้สึกไม่สบายใจที่วางกล่อง Jenkins ไว้บนอินเทอร์เน็ต นิค Arnottที่มีศักยภาพที่ถูกทอดทิ้งก็สามารถที่จะยืนยัน heebie-Jeebies ของฉันสวยได้อย่างง่ายดายในบทความนี้
TL; ดร
คำแนะนำของฉันสำหรับคนอื่น ๆ ที่ต้องการทำให้กระบวนการสร้างของพวกเขาเป็นแบบอัตโนมัติได้เปลี่ยนไปในช่วงปีครึ่งที่ผ่านมา ตรวจสอบให้แน่ใจว่าเครื่อง Jenkins ของคุณอยู่หลังไฟร์วอลล์ของคุณ ติดตั้งและตั้งค่า Jenkins เป็นผู้ใช้ Jenkins โดยเฉพาะไม่ว่าจะใช้โปรแกรมติดตั้งเวอร์ชัน Bitnami Mac App Store AppleScript ของ Sami Tikka ฯลฯ วิธีนี้ช่วยแก้อาการปวดหัวส่วนใหญ่ตามรายละเอียดข้างต้น หากคุณต้องการการเข้าถึงระยะไกลการตั้งค่าบริการ VPN ใน OS X Server จะใช้เวลาสูงสุดสิบนาที ฉันใช้การตั้งค่านี้มานานกว่าหนึ่งปีแล้วและมีความสุขมากกับมัน โชคดี!