Xcode Sunucusu ile iOS Sürekli Entegrasyon Açıklaması
Yayınlanan: 2022-03-11Tanıtım
Xcode 9'dan önce, Apple sürekli entegrasyon araçlarını kullanmak, ek bir macOS Sunucusu uygulamasının satın alınmasını ve yüklenmesini gerektiren sıkıcı ve karmaşık bir süreçti. Bu, birçok geliştiricinin iOS projeleri için sürekli entegrasyon fikrinden vazgeçmesine veya büyük ölçüde değişen başarı seviyeleriyle üçüncü taraf çözümlere başvurmasına neden oldu.
Ancak, Eylül 2017'de Xcode 9.0 piyasaya sürüldükten sonra, otomatik kod imzalama seçeneği de dahil olmak üzere süreç büyük ölçüde basitleştirildi ve şimdi tamamen Xcode'a entegre edildi. Bu nedenle, herhangi bir ek uygulama veya araç gerektirmez.
Fastlane, Bluepill vb. gibi üçüncü taraf çözümler çok yardımcı olsa da ve sizin için pek çok zahmetli iş yapabilirken, bu makale sürekli entegrasyon ihtiyaçlarınız için Xcode ve Apple araçlarını tek başına kullanmanın özelliklerini keşfedecektir. Ayrıca manuel kod imzalamayı da kullanacağız çünkü bu çoğu zaman birçok insan için bir sorun gibi görünüyor ve otomatik imzalama da çoklu yapı konfigürasyonları söz konusu olduğunda en uygun çözüm olmama eğiliminde.
Not: Bu makale Xcode 9.4.1'e dayanmaktadır ve iOS uygulama geliştirmeye odaklanır, ancak çoğu Xcode 10 (şu anda beta 5 derlemesi olarak mevcuttur) ve macOS uygulama geliştirme için geçerlidir.
Xcode Sunucusunu Kurma
Gerçek entegrasyon sürecini basitleştirmenin yanı sıra Xcode 9, Xcode Server kurulum sürecini de basitleştirdi.
CI sunucunuz olarak belirlenmiş macOS makinenizde Xcode uygulamasını başlatın ve Tercihler'i açın.
Sunucu ve Botlar adlı son sekmeye gidin.
Sağ üst köşedeki anahtara tıklayarak Xcode Server özelliklerini açın. Ardından, bu makinede derleme komut dosyalarını çalıştırmak ve yürütmek için bir kullanıcı seçmeniz istenecektir. Önceden var olan bir kullanıcıyı kullanmak yerine, yalnızca bu amaç için ayrılmış bir kullanıcıya sahip olmak muhtemelen iyi bir fikirdir.
Herhangi bir Xcode botunun çalışması için bu kullanıcının sistemde oturum açması gerektiğini unutmayın. Giriş yaptıktan sonra, kullanıcı adının yanında yeşil bir daire görmelisiniz.
Bu kadar! Xcode botlarına daha yakından bakalım.
Xcode Botları Nasıl Yapılandırılır
Artık Xcode botlarını bu sunucuda çalışacak şekilde yapılandırmaya başlamaya hazırsınız. Bu, sunucuyla aynı ağa bağlı herhangi bir geliştirme makinesinde yapılabilir.
Geliştirme makinenizde Xcode'u açın ve üst menüden Xcode > Tercihler'e tıklayın. Ardından Hesaplar sekmesine gidin ve sol alt köşedeki + simgesine tıklayın. Görüntülenen iletişim kutusundan Xcode Sunucusu'nu seçin.
Bir bot oluşturmak için projenizi Xcode'da açın ve üst menüden Ürün > Bot Oluştur… seçeneğini seçin. Bot kurulumunun birkaç adımı vardır ve bunları sonraki bölümlerde inceleyeceğiz.
Uygulama Dağıtımını Otomatikleştirme
iOS uygulama oluşturma otomasyonunun en sık kullanılan uygulamalarından biri, bir uygulamayı TestFlight, Fabric vb. bir iOS dağıtım platformuna yüklemek için bir bot yapılandırmaktır.
Daha önce açıkladığım gibi, bu makale yalnızca Apple'ın iOS uygulama dağıtımı için yerel araçları olduğundan, App Store Connect'e yüklemeyi ve doğrudan Xcode Sunucunuzdan indirmeyi keşfedecektir.
Xcode Kullanarak App Store Connect Dağıtımı
Bir botu yapılandırmadan önce, uygulama geliştirme projenizin paket kimliğiyle eşleşen bir App Store Connect uygulama kaydınız olduğundan emin olun. Ayrıca, her yapının, yapı sürümü ve yapı numarasından oluşan benzersiz bir tanımlayıcıya sahip olması gerektiğini belirtmekte fayda var. Xcode bot ayarlarını daha sonra tartışırken bu koşulların nasıl karşılanacağını keşfedeceğiz.
Adım 1: Doğru yapı yapılandırmasını ayarlamak, istediğinizi elde etmek için çok önemli bir adımdır. App Store Connect'e yüklemek istediğiniz uygulamayı oluşturan şemayı ve yapılandırmayı seçtiğinizden emin olun. Buna, derleme yapılandırmasının, ekibinizin Apple Developer portalında (kod imzalama için kullanılır) ve App Store Connect portalınızda (bu, uygulamayı otomatik olarak yüklemek için kullanılır) kayıtlı olan uygun paket kimliğini kullandığından emin olmak dahildir. .
Adım 2: Henüz “Yapılandırma” sekmesindeyken dışa aktarma seçeneklerini belirlememiz gerekiyor. Dışa aktarma seçenekleri özellik listesini inceleyeceğiz, bu nedenle “Özel Dışa Aktarma Seçenekleri Plistini Kullan” öğesinin seçili olduğundan emin olun.
Adım 3: Şimdi ihracat seçenekleri özellik listemizi oluşturmanın zamanı geldi. xcodebuild --help
girerseniz bu dosyada kullanılacak anahtarların tam listesi mevcuttur, ancak bu bot yapılandırmasında kullanılanları burada keşfedeceğiz:
-
compileBitcode
– Bitcode, Apple'ın uygulama kaynak kodu için geçici çıktı biçimidir. Başka bir deyişle, kaynak kodunuzun belirli bir mimari için makine koduna derlenmeden önce dönüştürüldüğü biçimdir. Komut setinde bir optimizasyon yapılırsa daha da optimize edilebilecek tek bir kod konteynerine sahip olmayı ve aynı formattan gelecekteki mimarilere derleyebilmeyi amaçlamaktadır. Ancak bunun başvurunuz üzerinde herhangi bir etkisi yoktur. Etkinleştirmek isteyip istemediğinize karar vermek size kalmış. -
method
– Bu bağımsız değişken, ne tür bir ürün dışa aktardığınızı belirtir. Apple, ürünleri belirlenmiş hedef kitlelerine göre ayırt eder; geliştirme , yalnızca ön hazırlık profilinde belirtilen aygıtlara yüklemenize izin verir, kuruluş herkesin yüklemesine izin verir, ancak uygulamayı çalıştırmadan önce bu geliştirme profiline açıkça güvenmeleri gerekir ve uygulama mağazası bunun içindir. App Store veya App Store Connect'e dağıtıyoruz, bu yüzden bu değeri kullanacağız. -
provisioningProfiles
– Bu kendi kendini açıklayıcıdır. Ancak burada dikkat edilmesi gereken birkaç nokta vardır: Dışa aktarma seçenekleri özellik listesindeki ön hazırlık profilleri, bir anahtarın bir ürünün paket kimliğine karşılık geldiği ve değerin onu kod imzalamak için kullanılan ön hazırlık profilinin adına karşılık geldiği bir sözlüktür. -
signingCertificate
– Kendi kendini açıklayan başka bir argüman. Bu alanın değeri, tam bir sertifika adı veya bir SHA-1 karması olabilir. -
teamID
– Kendi kendini açıklayan başka bir argüman. Bu, Apple Developer programına kaydolduğunuzda Apple'ın kuruluşunuza verdiği 10 karakter uzunluğundaki tanımlayıcıdır. -
uploadBitcode
– AppStore Connect'te yeni optimize edilmiş yapılar veya gelecekteki mimariler için yapılar oluşturmak üzere kullanılabilmesi için bit kodunun yüklenip yüklenmeyeceği (içine derlemeyi seçtiyseniz). -
uploadSymbols
– Yalnızca bir bellek dökümü ve derleme yığını yerine anlamlı bir kilitlenme raporu alabilmeniz için hata ayıklama sembollerinizi yükler.
Şimdi, dışa aktarma seçenekleri özellik listeniz şöyle görünebilir:
<?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>compileBitcode</key> <false/> <key>method</key> <string>app-store</string> <key>provisioningProfiles</key> <dict> <key>com.bundle.id</key> <string>ProvisioningProfileName</string> </dict> <key>signingCertificate</key> <string>Signing Certificate Exact Name or SHA-1 hash value</string> <key>teamID</key> <string>??????????</string> <key>uploadBitcode</key> <false/> <key>uploadSymbols</key> <true/> </dict> </plist>
Adım 4: Dışa aktarma seçenekleri özellik listesi olarak oluşturduğunuz .plist'i seçin.
Adım 5: Sıradaki "Program" sekmesi - tercihlerinize göre ayarlayın.
Adım 6: İmzalama sekmesinde, "Xcode Sunucusunun sertifikalarımı ve profillerimi yönetmesine izin ver" seçeneğinin işaretini kaldırdığınızdan ve Sertifikalar ve Profiller sayfasında eşleşen bir imzalama sertifikası ve ön hazırlık profilini kendiniz yüklediğinizden emin olun.
Adım 7: Uygulamayı test etmek yerine yüklediğimiz için Cihazlar sekmesi olduğu gibi bırakılmalıdır.
Adım 8: Bağımsız Değişkenler sekmesi, derleme veya entegrasyon öncesi ve entegrasyon sonrası komut dosyalarınızda kullanılabilecek xcodebuild bağımsız değişkenlerini veya ortam değişkenlerini açıkça ayarlamanıza olanak tanır.
Adım 9: Son olarak, Xcode sürekli entegrasyon botunun yapılandırılmasında da son sekme olan Tetikleyiciler sekmesine ulaşıyoruz. Bu, Xcode Server cephaneliğindeki en güçlü araçtır. Yeni başlayanlar için, entegrasyon öncesi komut dosyası olarak aşağıdaki iki komutu eklemeyi seviyorum:
#!/bin/sh set printenv
İlki, mevcut entegrasyon çalışmasında Xcode Server'ın kullandığı tüm değişkenleri ve bunların değerlerini yazdırır. İkincisi, tüm ortam değişkenlerini ve değerlerini yazdırır. Beklendiği gibi, bu, komut dosyalarınızda hata ayıklamada yardımcı olabilir, bu yüzden buna uygun bir şekilde "hata ayıklama bilgisi" adını verdim.

App Store Connect'e yüklenen her yapının benzersiz bir yapı sürümüne ve yapı numarası çiftine sahip olması gerektiğinden emin olmamız gerektiğinden bahsettiğimizi unutmayın. Yerleşik PlistBuddy aracını kullanabiliriz, ancak benzersiz bir yapı numarasına sahip olmak için bir yola da ihtiyacımız var. Xcode Server entegrasyonu sırasında her zaman mevcut olan ve aynı zamanda uygun bir şekilde benzersiz olan bir şey, otomatik olarak artırıldığından entegrasyon numarasıdır. Her seferinde benzersiz bir yapı numarasına sahip olmamızı sağlamak için aşağıdaki içeriklerle birlikte "yapı numarası ayarla" adlı başka bir entegrasyon öncesi komut dosyası oluşturacağız:
#!/bin/sh buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}") buildNumber=$XCS_INTEGRATION_NUMBER /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
CocoaPods kullanıyorsanız ve Pods dizinini DVCS'nize kaydetmemeyi seçtiyseniz, aşağıdaki içeriğe sahip bir entegrasyon öncesi komut dosyası da eklemelisiniz:
#!/bin/sh cd $XCS_PRIMARY_REPO_DIR pod install
Adım 10: Neredeyse bitirdik, ancak derlemeyi AppStore Connect'e veya hangi hesaba yüklemek istediğimizi hiçbir yerde belirtmedik. Bu amaçla, entegrasyon sonrası komut dosyası ve Application Loader adlı başka bir yerleşik araç ekleyeceğiz. Aşağıdakileri komut dosyasına koyun:
#!/bin/sh /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Support/altool --upload-app -f $XCS_PRODUCT -u $TESTFLIGHT_USERNAME -p $TESTFLIGHT_PASSWORD
$XCS_PRODUCT
, bir Xcode Sunucusu değişkenidir ve mevcut entegrasyon çalışmasında oluşturulan uygulamanın yolunu içerir. Ancak, $TESTFLIGHT_USERNAME
ve $TESTFLIGHT_PASSWORD
ne sistem ne de Xcode Sunucusu değişkenleridir. Bunlar sizin tarafınızdan ayarlanmalı ve Apple Kimliğinizin ve parolanızın değerine sahip olmalıdır. Maalesef Apple, AppStore Connect derleme yüklemesi için bir API anahtarı oluşturma desteğini durdurdu. Bu gizli bilgi olduğundan, Xcode Server bot yapılandırması yerine doğrudan Mac sunucusunda (kendinize ait olduğunu varsayarak) bir ortam değişkeni olarak ayarlamak en iyi uygulamadır.
Xcode Sunucu Dağıtımı
Xcode Server dağıtım botu, entegrasyon sonrası komut dosyaları dışında aslında App Store Connect dağıtımıyla aynı yapılandırmayı kullanır. Ancak, uygulamayı indirmek ve yüklemek yine de zor olabilir. Yine de, uygulamanızı imzaladığınız temel hazırlık profilinin, uygulamanın kullandığınız cihaza yüklenmesine izin verdiğinden emin olmanız gerekir.
Bu durumda, iOS cihazınızda Safari'yi açmanız ve sunucunuzun Xcode Server web panosuna gitmeniz gerekecek. Örneğin, sunucunuzun adı “Mac sunucusu” ise, sunucuyla aynı ağdaysanız “mac-sunucu-adı.local/xcode” adresinde bulabilirsiniz. Orada, tüm Xcode botlarınızın bir listesini ve en son entegrasyonlarının istatistiklerini bulacaksınız.
İndirmek istediğiniz uygulamayı oluşturan uygulamayı seçin. Aşağıdaki ekranda iki düğmeniz olacak: Yükle ve Profil . Bu sunucudan ilk kez indiriyorsanız, sertifikasını güvenilir kaynaklar listesine eklemek için Profil'e tıklamanız gerekir. Daha sonra, aynı sayfadaki Yükle düğmesine tıklayın ve iOS onay iletişim kutusu ile karşılaşacaksınız “Cihazınıza * yüklemek istediğinizden emin misiniz?” Evet'i tıklatarak onaylayın, uygulamanız yüklenecek ve ana ekrandan çalıştırılabilir olacaktır.
iOS 10.3 ve üstü için, "*.local'a bağlanamıyor" ile başarısız olmasının bir nedeni, kendinden imzalı sertifikaya test cihazındaki Ayarlar'da manuel olarak güvenilmesi gerektiğidir.
Bu adımları takip et:
Adım 1: iPhone'unuzdaki Xcode sunucusunun botlar sayfasından kendinden imzalı sertifikaları yükleyin.
2. Adım: iPhone'un Ayarlar > Genel > Hakkında > Sertifika Güven Ayarları'na gidin .
Adım 3: KÖK SERTİFİKALAR İÇİN TAM GÜVENİ ETKİNLEŞTİR bölümü altında sunucunuzun kendinden imzalı sertifikalarını bulun ve anahtarı AÇIK konuma getirin.
Adım 4: Xcode Server'da bot entegrasyon sayfasına dönün, Install'a tıklayın.
Xcode Sunucusu Otomatik Uygulama Testi
Xcode Server'ın bir başka harika kullanımı, ister birim ister UI testi olsun, otomatik uygulama testidir. Bunu yapmak için, projeniz için uygun hedefin oluşturulması gerekir. Yani, hedefinize bağlı olarak birim veya UI testleri çalıştıran bir hedefiniz olması gerekir.
Kurulum işlemi öncekiyle aynıdır, ancak farklı seçenekler seçeceğiz. İlk büyük fark, Yapılandırma sekmesindedir. Açıkçası, birincil hedefimiz bu olduğu için “Analiz Et” ve “Test Etme” kutularını işaretleyeceğiz. Ayrıca ürünü bu botla ne arşivlemenizi ne de dışa aktarmanızı tavsiye ederim. Aynı bot konfigürasyonu ile hem test hem de dağıtım yapmak mümkündür. Ancak bu iki senaryo, çıktıları ve zamanlamaları bakımından farklılık gösterir. Dağıtım genellikle döngünün sonunda yapılır.
İster Scrum'da, ister Kanban'da veya başka bir çerçevede çalışıyor olun, önceden tanımlanmış zaman odaklı veya olay odaklı bir döngü olmalıdır, bunun sonunda dışa aktarılmış ve kullanılabilir ürüne sahip olmanız gerekir. Öte yandan, gerilemelere karşı ilk savunma hattınız olduğundan, test botunuzu her işlemde çalıştırmalısınız. Test botu açıkça daha sık çalıştırıldığından, bu iki botu tek bir botta birleştirmek, sunucunuzdaki disk alanını hızla tüketebilir. Ayrıca her entegrasyonun tamamlanması daha fazla zaman alacaktır.
Bunun dışında, “Program” sekmesine geçiyoruz ve bunu bir önceki paragrafta zaten ele almıştık. Dolayısıyla, bir sonraki ilgi konusu kod imzalamadır. Test hedefinizin proje ayarları sayfanızda ön hazırlık profiline ihtiyaç duymadığını belirtse bile, ana bilgisayar uygulamasıyla aynı ekibi ve imzalama sertifikasını kullanacak şekilde ayarlamanız gerektiğine dikkat edin. Uygulamanızı yalnızca bir simülatör yerine bir iOS cihazında test etmek istiyorsanız bu gereklidir. Durumunuz buysa, test için kullanılan iOS cihazının hareketsizlik nedeniyle kilitlenmeyeceğinden emin olmanız gerekir, çünkü bu, entegrasyon çalışmanızın size haber vermeden süresiz olarak askıda kalmasına neden olabilir.
Şimdi, özel bir açıklama gerektirmeyen "Cihazlar" sekmesindeyiz. Kodunuzu test etmek istediğiniz bir, birden fazla veya tüm cihazları (iOS ve simülatör) seçmeniz yeterlidir. Testlerin birden fazla cihazda paralel mi yoksa sıralı olarak mı çalıştırılacağını da kontrol edebilirsiniz. Bunu ayarlamak için proje ihtiyaçlarınızı (belirli bir cihaz grubunu veya desteklenen tüm iOS cihazlarını hedefliyor olun) ve ayrıca sunucunun donanım kaynaklarını göz önünde bulundurmalısınız.
Argümanlar sekmesinde. Yalnızca yerleşik ortam değişkenlerini kullanacağımız için açıkça bir şey belirtmeye gerek yok.
Son olarak, Tetikleyiciler sekmesinde, bir entegrasyon öncesi ve bir entegrasyon sonrası komut dosyası tanıtacağız. İlki, bazı sorunlarla karşılaşmamız durumunda hata ayıklamamıza yardımcı olmak için orada. Aslında daha önce kullandığımız şey:
#!/bin/sh set printenv
İkincisi, mevcut entegrasyonda bir veya daha fazla testimizin başarısız olması durumunda bizi bilgilendirecek olanıdır. Yalnızca test başarısızlıklarında çalışacak şekilde ayarlandığından emin olun. Ve şunu girin:
#!/bin/sh echo "$XCS_TEST_FAILURE_COUNT test(s) failed for $XCS_BOT_NAME bot on build $XCS_INTEGRATION_NUMBER" echo "You can see bot integration at:" echo "https://$HOSTNAME/xcode/bots/$XCS_BOT_TINY_ID/integrations/$XCS_INTEGRATION_TINY_ID"
Burada açıklanması gereken birkaç şey var. Her şeyden önce, $HOSTNAME değişkenleri şu biçimin değerini depolar: bilgisayar-adı.local. Açıkçası, bağlantı yalnızca o sunucuya yerel ağ üzerinden erişebiliyorsanız çalışır. Ayrıca, bu bağlantıyı ziyaret ettiğinizde, güvenilmeyen bir hedefe https bağlantısı olduğu için büyük olasılıkla tarayıcınızdan bir güvenlik uyarısı alırsınız. Son olarak, bu, "Test hatası" komut dosyanız için yalnızca bir başlangıç noktasıdır. Tüm geliştirme ekibine bir e-posta gönderebilir veya bir API isteği veya en uygun ve verimli olduğunu düşündüğünüz herhangi bir şey aracılığıyla JIRA sorununu açabilirsiniz.
Toplama
Umarım bu makale, yalnızca bir uygulama oluşturmanın dışında Xcode Sunucusu özelliklerini keşfetmeye zaman ayırmanız için sizi teşvik etmiştir. Bu gönderi size tam olarak istediğiniz veya beklediğiniz şekilde yardımcı olmamış olsa da amaç, daha yüksek düzeyde bir otomasyon elde etmek için size yerleşik ortamları ve Xcode Server değişkenlerini kullanmanın açık fikirli bir yolunu tanıtmaktı.
Fabric, Bluepill ve Fastlane dahil olmak üzere daha fazla işlevsellik sağlayan ve sizin için çok daha fazla iş yapabilen çok sayıda üçüncü taraf hizmeti vardır. Ancak, kaçınılmaz olarak, üçüncü bir tarafa güvenmek projenize yeni bir bağımlılık getirir ve bazen basit, bazen karmaşık kurulum ve yapılandırma gerektirir. Burada açıklanan teknikler, yalnızca her Mac'te yüklü olan araçları gerektirir, bu nedenle otomatik yapılarınızı çalıştıracak botları yapılandırmanın yanı sıra kurulum süresi gerektirmez!