Özet:
Jenkins'in OS X üzerinde kurulması, en son yükleyiciyle ( 1.449 - 9 Mart 2012 itibariyle ) önemli ölçüde daha kolay hale getirilmiştir , ancak kod imzalama sürecini yönetmek, açık bir yanıt olmadan hala çok zordur.
Motivasyon:
OS X'te hizmetlerin çalıştırılmasına yönelik yaygın en iyi uygulamaları izleyen başsız bir CI sunucusu çalıştırın ( Bazıları burada sade bir dille açıklanmıştır ).
Arka fon:
- 12 Ekim 2009 - Hudson ile iPhone uygulama derlemelerini otomatikleştirme
- 15 Haziran 2011 - Mac OS X üzerinde Jenkins; git w / ssh genel anahtar
- 23 Haziran 2011 - iOS Uygulamalarının Jenkins ve TestFlight ile Sürekli Dağıtımı
- 26 Temmuz 2011 - iOS ve Mac geliştirme için Sürekli Entegrasyon olarak Jenkins / Hudson kullanırken anahtar zincirinde eksik sertifikalar ve anahtarlar
- 30 Ağustos 2011 - Jenkins ile Xcode Sağlama Dosyası bulunamadı
- 20 Eylül 2011 - Mac'te Jenkins CI nasıl kurulur?
- 14 Eylül 2011 - Bir Mac'te Jenkins Çalıştırma
- 12 Kasım 2011 - Nasıl Yapılır: Jenkins'i OS X'e yükleyin ve Mac şeyler oluşturmasını sağlayın
- 23 Ocak 2012 - Yaklaşan Jenkins OSX yükleyici değişiklikleri
- 7 Mart 2012 - OSX Yükleyiciyi kullandığınız için teşekkürler
Süreç:
Jenkins CI'yi OS X yükleyici paketi aracılığıyla yükleyin . "Kurulum Türü" adımı için, Özelleştir düğmesini tıklayın ve "Açılışta 'jenkins' olarak başla" seçeneğini seçin.
Tartışma:
Bu noktadaki saf beklenti, inşa betiğine sahip serbest stil bir projenin xcodebuild -target MyTarget -sdk iphoneos
çalışması gerektiğiydi. Bu gönderinin başlığından da anlaşılacağı gibi, aşağıdakileri yapmaz ve başarısız olur:
Code Sign error: The identity 'iPhone Developer' doesn't match any valid certificate/private key pair in the default keychain
Ne olması gerektiği yeterince açıktır - varsayılan anahtar zincirine geçerli bir kod imzalama sertifikası ve özel bir anahtar eklemeniz gerekir. Bunu nasıl başaracağımı araştırırken, sistemi belli bir düzeyde zafiyete açmayan bir çözüm bulamadım.
Sorun 1: Jenkins arka plan programı için varsayılan anahtar zinciri yok
sudo -u jenkins security default-keychain
... "Varsayılan bir anahtar zinciri bulunamadı" sonucunu verir
Aşağıda Ivo Dancet tarafından belirtildiği gibi, UserShell varsayılan olarak jenkins arka plan programı için / usr / bin / false olarak ayarlanmıştır (bence bu bir özelliktir, bir hata değildir); UserShell'i bash olarak değiştirmek için onun cevabını izleyin. Daha sonra sudo su jenkins
jenkins kullanıcısı olarak oturum açmak ve bir bash istemi almak için kullanabilirsiniz.
sudo su jenkins
cd ~/Library
mkdir Keychains
cd Keychains
security create-keychain <keychain-name>.keychain
security default-keychain -s <keychain-name>.keychain
Tamam harika. Artık varsayılan bir anahtar zincirimiz var; Hadi devam edelim mi? Ama önce neden varsayılan bir anahtarlık yapmakla uğraştık?
Araştırma boyunca okuduğum hemen hemen tüm cevaplar, öneriler veya konuşmalar, kod imzalama sertifikalarını ve anahtarlarını sistem anahtarlığına atması gerektiğini gösteriyor. security list-keychains
Jenkins'te serbest stil proje olarak çalıştırırsanız , mevcut tek anahtar zincirinin sistem anahtar zinciri olduğunu görürsünüz; Sanırım bu, çoğu insanın sertifikalarını ve anahtarlarını oraya koyma fikrini ortaya çıkardığı yer. Ancak, bu çok kötü bir fikir gibi görünüyor - özellikle anahtar zincirini açmak için parolayla düz bir metin komut dosyası oluşturmanız gerekeceği düşünüldüğünde .
Sorun 2: Kod imzalama sertifikaları ve özel anahtar ekleme
Burası gerçekten gevrekleşmeye başladığım yer. Jenkins ile kullanım için benzersiz yeni bir genel / özel anahtar oluşturmam gerektiğine dair içimde bir his var. Düşünme sürecim, eğer jenkins arka plan programı tehlikeye atılırsa, Apple'ın Provisioning Portal'da sertifikayı kolayca iptal edebilir ve başka bir genel / özel anahtar oluşturabilirim. Kullanıcı hesabım ve Jenkins için aynı anahtarı ve sertifikayı kullanırsam, jenkins hizmetine saldırılırsa bu daha fazla güçlük (hasar?) Anlamına gelir.
İşaret ediyor Simon Urbanek'in cevabına , anahtar zincirini düz metin şifresiyle bir komut dosyasından açacaksınız. Jenkins arka planının anahtarlığında "tek kullanımlık" sertifikalar ve anahtarlar dışında herhangi bir şeyi saklamak sorumsuz görünüyor.
Aksine herhangi bir tartışmayla çok ilgileniyorum. Aşırı ihtiyatlı mıyım?
Terminal'de jenkins arka plan programı olarak yeni bir CSR yapmak için aşağıdakileri yaptım ...
sudo su jenkins
certtool r CertificateSigningRequest.certSigningRequest
Sizden aşağıdakiler istenecektir (bunların çoğu doğru cevapta eğitimli tahminler yaptım; daha iyi içgörünüz var mı? Lütfen paylaşın.) ...- Anahtar ve sertifika etiketini girin:
- Algoritma seçin:
r
(RSA için) - Anahtar boyutunu bit cinsinden girin:
2048
- İmza algoritması seçin:
5
(MD5 için) - Meydan okuma dizesini girin:
- Sonra RDN için bir sürü soru
- Oluşturulan CSR dosyasını (CertificateSigningRequest.certSigningRequest) yeni bir Apple Kimliği altında Apple'ın Provisioning Portal'a gönderin
- İsteği onaylayın ve .cer dosyasını indirin
security unlock-keychain
security add-certificate ios_development.cer
Bu bizi bir adım daha yaklaştırıyor ...
Sorun 3: Temel hazırlık profili ve Anahtar zinciri kilidini açma
Yetkilendirme Portalı'nda, kötü bir şey olursa etkiyi biraz daha küçültmeyi umduğum için CI ile kullanmak için özel bir ön hazırlık profili yaptım. En iyi uygulama mı yoksa aşırı ihtiyatlı mı?
sudo su jenkins
mkdir ~/Library/MobileDevice
mkdir ~/Library/MobileDevice/Provisioning\ Profiles
- Temel Hazırlık Portalı'nda kurduğunuz ön hazırlık profilini bu yeni klasöre taşıyın. Artık xcodebuild'i jenkins olarak komut satırından çalıştırabilmekten iki kısa adım uzaktayız ve bu, aynı zamanda Jenkins CI çalışan yapıları elde etmeye yakın olduğumuz anlamına geliyor.
security unlock-keychain -p <keychain password>
xcodebuild -target MyTarget -sdk iphoneos
Şimdi, jenkins arka plan programı olarak oturum açtığımızda bir komut satırından başarılı bir yapı elde ediyoruz, bu nedenle serbest tarzda bir proje oluşturur ve bu son iki adımı eklersek (yukarıdaki # 5 ve # 6) iOS projemiz!
Gerekli olmayabilir, ancak tüm bu kurulumu başarıyla tamamladıktan sonra jenkins UserShell'i / usr / bin / false olarak ayarlamanın daha iyi olduğunu hissettim. Ben paranoyak mıyım?
Sorun 4: Varsayılan anahtarlık hala mevcut değil!
( DÜZENLEME: Soruma düzenlemeleri gönderdim, çözümümün% 100 olduğundan emin olmak için yeniden başlattım ve elbette bir adımı atladım )
Yukarıdaki tüm adımlardan sonra bile, bu yanıtta belirtildiği gibi /Library/LaunchDaemons/org.jenkins-ci.plist adresindeki Launch Daemon plistini değiştirmeniz gerekecektir . Lütfen bunun da bir openrdar hatası olduğunu unutmayın .
Şöyle görünmeli:
<?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>
Bu kurulumla, Jenkins için Xcode eklentisini de tavsiye ederim xcodebuild komut dosyasının kurulumunu biraz daha kolaylaştıran . Bu noktada, xcodebuild için man sayfalarını da okumanızı tavsiye ederim - Terminal'de bu kadar ileri gitmişsiniz değil mi?
Bu kurulum mükemmel değil ve herhangi bir tavsiye veya anlayış çok takdir ediliyor.
Sorunumu çözmek için kullanmaya başladığım şey hemen hemen herkesin girdilerinin bir toplamı olduğu için "doğru" bir yanıt seçmekte zorlandım. Herkese en azından bir olumlu oy vermeye çalıştım, ancak cevabı Simon'a verdim çünkü orijinal soruyu çoğunlukla o cevapladı. Ayrıca Sami Tikka Jenkins'in AppleScript'te basit bir OS X uygulaması olarak çalışmasını sağlama çabalarından dolayı çok fazla övgüyü hak ediyor. Jenkins'i sadece kullanıcı oturumunuzda hızlı bir şekilde kurmakla ilgileniyorsanız (yani, başsız bir sunucu olarak değil), çözümü çok daha Mac'e benzer.
Umarım çabalarım daha fazla tartışmaya yol açar ve bir sonraki zavallı kişiye iOS projeleri için Jenkins CI kurulumunu duydukları harika şeyler nedeniyle bir hafta sonu içinde alabileceklerini düşünerek yardımcı olur.
Güncelleme: 9 Ağustos 2013
Bu kadar çok oy ve favoriyle, 18 ay sonra öğrendiğim bazı kısa derslerle bu konuya geri döneceğimi düşündüm.
Ders 1: Jenkins'i halka açık internete maruz bırakmayın
2012 WWDC'de bu soruyu Xcode ve OS X Server mühendislerine götürdüm. "Bunu yapma!" Diye bir kakofoni aldım. sorduğum herkesten. Hepsi otomatik bir derleme işleminin harika olduğu, ancak sunucuya yalnızca yerel ağ üzerinden erişilebilmesi gerektiği konusunda hemfikirdi. OS X Server mühendisleri, VPN aracılığıyla uzaktan erişime izin vermeyi önerdi.
2. Ders: Artık yeni yükleme seçenekleri var
Geçenlerde bir CocoaHeads konuşmasında Jenkins deneyimimle ilgili bir konuşma yaptım ve şaşırtıcı bir şekilde bazı yeni yükleme yöntemleri buldum - Homebrew ve hatta bir Bitnami Mac App Store sürümü. Bunlar kesinlikle kontrol edilmeye değer. Jonathan Wright , Homebrew Jenkins'i çalıştırma konusunda ayrıntılara sahip .
3. Ders: Hayır, cidden, yapı kutunuzu internette göstermeyin
Orijinal gönderiden ne sistem yöneticisi ne de güvenlik uzmanı olduğum oldukça açık. Özel şeyler (anahtarlıklar, kimlik bilgileri, sertifikalar, vb.) Hakkındaki sağduyu, Jenkins kutumu internete koyma konusunda oldukça huzursuz hissetmeme neden oldu. İhmal Edilmiş Potansiyelden Nick Arnott , bu yazıda huysuzluklarımı oldukça kolay bir şekilde doğrulamayı başardı .
TL; DR
Oluşturma sürecini otomatikleştirmek isteyenlere tavsiyem geçen bir buçuk yılda değişti. Jenkins makinenizin güvenlik duvarınızın arkasında olduğundan emin olun. Jenkins'i yükleyici, Bitnami Mac App Store sürümü, Sami Tikka'nın AppleScript'i vb. Kullanarak özel bir Jenkins kullanıcısı olarak kurun ve ayarlayın; bu, yukarıda detaylandırdığım baş ağrısının çoğunu giderir. Uzaktan erişime ihtiyacınız varsa, OS X Sunucusunda VPN hizmetlerini kurmak en fazla on dakika sürer. Bu kurulumu bir yılı aşkın süredir kullanıyorum ve bundan çok memnunum. İyi şanslar!