सारांश:
ओएस एक्स पर जेनकिन्स स्थापित करना सबसे हालिया इंस्टॉलर ( 1.449 - 9 मार्च, 2012 तक ) के साथ काफी आसान बना दिया गया है , हालांकि कोड हस्ताक्षर की प्रक्रिया का प्रबंधन करना अभी भी बिना किसी सीधे जवाब के बहुत मुश्किल है।
प्रेरणा:
एक हेडलेस सीआई सर्वर चलाएं जो ओएस एक्स पर चलने वाली सेवाओं के लिए सामान्य सर्वोत्तम प्रथाओं का पालन करता है ( जिनमें से कुछ को यहां स्पष्ट भाषा में समझाया गया है )।
पृष्ठभूमि:
- 12 अक्टूबर, 2009 - हडसन के साथ अपने iPhone ऐप का निर्माण कैसे करें
- 15 जून, 2011 - मैक ओएस एक्स पर जेनकिन्स; git w / ssh सार्वजनिक कुंजी
- 23 जून, 2011 - जेनकींस और टेस्टफलाइट के साथ आईओएस ऐप्स की निरंतर तैनाती
- 26 जुलाई, 2011 - आईनेक और विकास के लिए निरंतर एकीकरण के रूप में जेनकिंस / हडसन का उपयोग करते समय चाबी का गुच्छा में प्रमाण पत्र और चाबियाँ गुम।
- 30 अगस्त, 2011 - जेनकोड के साथ Xcode प्रोविजनिंग फ़ाइल नहीं मिली
- 20 सितंबर, 2011 - मैक पर जेनकिंस सीआई कैसे स्थापित करें
- 14 सितंबर, 2011 - मैक पर चल रहा जेनकिंस
- 12 नवंबर, 2011 - हाउटो: ओएस एक्स पर जेनकिंस स्थापित करें और मैक सामान का निर्माण करें
- 23 जनवरी, 2012 - आगामी जेनकींस OSX इंस्टॉलर में परिवर्तन
- 7 मार्च, 2012 - OSX इंस्टॉलर का उपयोग करने के लिए धन्यवाद
प्रक्रिया:
ओएस एक्स इंस्टॉलर पैकेज के माध्यम से जेनकिंस सीआई स्थापित करें । "इंस्टॉलेशन टाइप" स्टेप के लिए, कस्टमाइज़ बटन पर क्लिक करें, और "स्टार्ट पर बूट को 'जेनकींस' के रूप में चुनें।
चर्चा:
इस बिंदु पर भोली उम्मीद यह थी कि बिल्ड स्क्रिप्ट के साथ एक फ्री-स्टाइल प्रोजेक्ट 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: जेनकींस डेमॉन के लिए कोई डिफ़ॉल्ट चाबी का गुच्छा नहीं है
sudo -u jenkins security default-keychain
... पैदावार "एक डिफ़ॉल्ट चाबी का गुच्छा नहीं मिल सका"
जैसा कि Ivo Dancet द्वारा नीचे बताया गया है , UserShell डिफ़ॉल्ट रूप से जेनकींस डेमन के लिए / usr / bin / false पर सेट है (मुझे लगता है कि यह एक विशेषता है, बग नहीं); उपयोगकर्ता के उत्तर को बश में बदलने के लिए उसके उत्तर का पालन करें। फिर आप sudo su jenkins
जेन्किन्स उपयोगकर्ता के रूप में लॉग इन करने और बैश प्रॉम्प्ट प्राप्त करने के लिए उपयोग कर सकते हैं ।
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: कोड हस्ताक्षर करने वाले समारोहों और निजी कुंजी को जोड़ना
यह वह जगह है जहाँ मैं वास्तव में स्क्वीज़ होना शुरू करता हूँ। मुझे इस बात का अहसास है कि मुझे जेनकिंस के साथ प्रयोग के लिए एक नई सार्वजनिक / निजी कुंजी का निर्माण करना चाहिए। मेरी विचार प्रक्रिया यह है कि अगर जेनकिन्स डेमॉन से छेड़छाड़ की जाती है, तो मैं आसानी से एप्पल के प्रोविजनिंग पोर्टल में प्रमाण पत्र को रद्द कर सकता हूं और एक अन्य सार्वजनिक / निजी कुंजी उत्पन्न कर सकता हूं। यदि मैं अपने उपयोगकर्ता खाते और जेनकिंस के लिए एक ही कुंजी और प्रमाण पत्र का उपयोग करता हूं, तो इसका मतलब है कि अगर जेनकिंस सेवा पर हमला किया जाता है तो अधिक परेशानी (क्षति?) होती है।
सिमोन अर्बनक के उत्तर की ओर इशारा करते हुए आप एक टेक्स्ट से एक सादे पाठ पासवर्ड के साथ चाबी का गुच्छा अनलॉक करेंगे। जेनकींस डेमन के किचेन में कुछ भी "लेकिन डिस्पोजेबल" सर्टिफिकेट और चाबी रखना गैर-जिम्मेदाराना लगता है।
मुझे इसके विपरीत किसी भी चर्चा में बहुत दिलचस्पी है। क्या मैं अत्यधिक सतर्क हूँ?
टर्मिनल में जेनकींस डेमन के रूप में एक नया सीएसआर बनाने के लिए मैंने निम्नलिखित कार्य किया ...
sudo su jenkins
certtool r CertificateSigningRequest.certSigningRequest
आपको निम्नलिखित के लिए संकेत दिया जाएगा (इनमें से अधिकांश मैंने सही उत्तर पर शिक्षित अनुमान लगाए हैं; क्या आपके पास बेहतर जानकारी है? कृपया साझा करें ... ...- कुंजी और प्रमाणपत्र लेबल दर्ज करें:
- एल्गोरिथ्म का चयन करें:
r
(RSA के लिए) - बिट्स में मुख्य आकार दर्ज करें:
2048
- हस्ताक्षर एल्गोरिथ्म का चयन करें:
5
(एमडी 5 के लिए) - चुनौती स्ट्रिंग दर्ज करें:
- फिर RDN के लिए सवालों का एक गुच्छा
- जेनरेट की गई CSR फ़ाइल (CertificateSigningRequest.certSigningRequest) को एक नए Apple ID के तहत Apple के प्रोविजनिंग पोर्टल पर भेजें।
- अनुरोध को स्वीकार करें और .cer फ़ाइल डाउनलोड करें
security unlock-keychain
security add-certificate ios_development.cer
यह हमें एक कदम करीब ले जाता है ...
समस्या 3: प्रोविजनिंग प्रोफाइल और किचेन अनलॉकिंग
मैंने प्रोविजनिंग पोर्टल में एक विशेष प्रोविज़निंग प्रोफाइल बनाया है सिर्फ सीआई के साथ उपयोग के लिए कि अगर कुछ बुरा होता है तो मैंने प्रभाव को थोड़ा छोटा कर दिया है। सबसे अच्छा अभ्यास या अत्यधिक सतर्क?
sudo su jenkins
mkdir ~/Library/MobileDevice
mkdir ~/Library/MobileDevice/Provisioning\ Profiles
- प्रोविजनिंग पोर्टल में प्रोविजनिंग प्रोफाइल को इस नए फोल्डर में ले जाएँ। अब हम कमांड लाइन से जेनकिंस के रूप में xcodebuild को चलाने में सक्षम होने से दो कदम दूर हैं, और इसका मतलब है कि हम जेनकिंस सीआई को चलने वाले बिल्ड प्राप्त करने में सक्षम होने के करीब भी हैं।
security unlock-keychain -p <keychain password>
xcodebuild -target MyTarget -sdk iphoneos
जेनकिंस डेमन के रूप में लॉग इन करने पर अब हमें एक कमांड लाइन से एक सफल बिल्ड मिलता है, इसलिए यदि हम एक फ्री-स्टाइल प्रोजेक्ट बनाते हैं और उन अंतिम दो चरणों (# 5 और # 6 ऊपर) को जोड़ते हैं, तो हम बिल्डिंग को स्वचालित कर पाएंगे हमारे iOS परियोजना!
यह आवश्यक नहीं हो सकता है, लेकिन मैंने बेहतर तरीके से स्थापित करने के बाद jenkins UserShell को वापस / usr / bin / false करने के लिए महसूस किया, क्योंकि मैंने सफलतापूर्वक यह सब सेटअप प्राप्त कर लिया है। क्या मैं पागल हो रहा हूँ?
समस्या 4: डिफ़ॉल्ट किचेन अभी भी उपलब्ध नहीं है!
( संपादित करें: मैंने अपने प्रश्न का संपादन पोस्ट किया है, यह सुनिश्चित करने के लिए रिबूट किया गया कि मेरा समाधान 100% है, और निश्चित रूप से, मैंने एक कदम छोड़ दिया है )
उपरोक्त सभी चरणों के बाद भी, आपको इस उत्तर में बताए अनुसार लॉन्च डेमॉन प्लिस्ट को /Library/LaunchDaemons/org.jenkins-ci.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>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 प्लगइन की भी सिफारिश करूंगा , जो कि xcodebuild स्क्रिप्ट को थोड़ा आसान बनाना है। इस बिंदु पर, मैं xcodebuild के लिए मैन पेज पढ़ने की भी सलाह दूंगा - नरक आपने इसे टर्मिनल में बहुत दूर बनाया है, है ना?
यह सेटअप सही नहीं है, और किसी भी सलाह या अंतर्दृष्टि की बहुत सराहना की जाती है।
मुझे अपनी समस्या को हल करने के लिए "सही" उत्तर का चयन करने में एक कठिन समय मिला है, क्योंकि मैं अपनी समस्या को हल करने के लिए उपयोग करने के लिए आया हूं, हर किसी के इनपुट के बारे में सिर्फ एक संग्रह था। मैंने सभी को कम से कम एक वोट देने की कोशिश की है, लेकिन साइमन को जवाब देना चाहिए क्योंकि उन्होंने ज्यादातर मूल सवाल का जवाब दिया। इसके अलावा, सामी टिक्का जेनेकिंस को ऐप्पलस्क्रिप्ट के माध्यम से एक सादे ओल 'ओएस एक्स ऐप के रूप में काम करने के अपने प्रयासों के लिए बहुत सारे श्रेय का हकदार है। यदि आप केवल जेनकिंस को प्राप्त करने और अपने उपयोगकर्ता सत्र के भीतर (यानी एक हेडलेस सर्वर के रूप में नहीं) जाने में रुचि रखते हैं, तो उसका समाधान मैक-जैसा है।
मुझे उम्मीद है कि मेरे प्रयासों ने आगे चर्चा को बढ़ावा दिया है, और अगले गरीब आत्मा की मदद करते हैं जो यह सोचकर आते हैं कि वे सप्ताहांत में अपने iOS प्रोजेक्ट के लिए जेनकिंस CI सेटअप प्राप्त कर सकते हैं क्योंकि वे सभी अद्भुत चीजों के बारे में सुन चुके हैं।
अपडेट: ९ अगस्त २०१३
इतने सारे अपवित्र और पसंदीदा होने के साथ, मैंने सोचा कि मैं 18 महीने बाद वापस आऊंगा।
पाठ 1: सार्वजनिक इंटरनेट पर जेनकींस को उजागर न करें
2012 के WWDC में मैं यह सवाल Xcode और OS X सर्वर इंजीनियरों के पास ले गया। मुझे "ऐसा मत करो!" किसी से भी मैंने पूछा। वे सभी सहमत थे कि एक स्वचालित निर्माण प्रक्रिया बहुत अच्छी थी, लेकिन यह कि सर्वर केवल स्थानीय नेटवर्क पर ही सुलभ होना चाहिए। ओएस एक्स सर्वर इंजीनियरों ने वीपीएन के माध्यम से रिमोट एक्सेस की अनुमति देने का सुझाव दिया।
पाठ 2: अब नए संस्थापन विकल्प हैं
मैंने हाल ही में अपने जेनकिंस के अनुभव के बारे में एक कोकोआइड्स बात की, और मेरे आश्चर्य के लिए मैंने कुछ नए स्थापित तरीके - होमब्रे और यहां तक कि एक बिटनामी मैक ऐप स्टोर संस्करण भी पाया। ये निश्चित रूप से जांच के लायक हैं। जोनाथन राइट में एक विस्तार है जो होमब्रेव जेनकिन्स को काम कर रहा है ।
पाठ 3: नहीं, गंभीरता से, अपने बिल्ड बॉक्स को इंटरनेट पर उजागर न करें
यह मूल पोस्ट से बहुत स्पष्ट है कि मैं न तो सिस्टम प्रशासक हूं और न ही सुरक्षा विशेषज्ञ। निजी-वाई सामान (कीचेन, क्रेडेंशियल, प्रमाण पत्र, आदि) के बारे में सामान्य ज्ञान ने मुझे इंटरनेट पर अपना जेनकींस बॉक्स लगाने के बारे में बहुत असहज महसूस किया। उपेक्षित स्थिति में निक अर्नोट इस लेख में बहुत आसानी से मेरे हेबी-जीवी की पुष्टि करने में सक्षम थे ।
टी एल; डॉ
अपनी निर्माण प्रक्रिया को स्वचालित करने की चाह रखने वाले अन्य लोगों के लिए मेरी सिफारिश पिछले डेढ़ साल में बदल गई है। सुनिश्चित करें कि आपकी Jenkins मशीन आपके फ़ायरवॉल के पीछे है। जेनकींस को एक समर्पित जेनकिंस उपयोगकर्ता के रूप में स्थापित करें और सेट करें या तो इंस्टॉलर, बिटनामी मैक ऐप स्टोर संस्करण, सामी टिक्का के ऐप्पलस्क्रिप्ट, आदि का उपयोग करें; यह सबसे अधिक सिरदर्द मैं ऊपर विस्तार से हल करता है। यदि आपको रिमोट एक्सेस की आवश्यकता है, तो ओएस एक्स सर्वर में वीपीएन सेवाओं को स्थापित करने में दस मिनट का समय लगता है। मैं एक वर्ष से अधिक समय से इस सेटअप का उपयोग कर रहा हूं और इससे बहुत खुश हूं। सौभाग्य!