شرح التكامل المستمر لنظام iOS مع خادم Xcode

نشرت: 2022-03-11

مقدمة

قبل Xcode 9 ، كان استخدام أدوات التكامل المستمر من Apple عملية شاقة ومعقدة تتطلب شراء وتثبيت تطبيق macOS Server إضافي. أدى ذلك إلى تخلي العديد من المطورين عن فكرة التكامل المستمر لمشاريع iOS الخاصة بهم أو اللجوء إلى حلول الجهات الخارجية ، بمستويات متفاوتة بشكل كبير من النجاح.

ومع ذلك ، بعد إصدار Xcode 9.0 في سبتمبر 2017 ، تم تبسيط العملية إلى حد كبير ، بما في ذلك خيار التوقيع الآلي للرمز ، والآن تم دمجها بالكامل في Xcode. لذلك ، لا يتطلب أي تطبيقات أو أدوات إضافية.

في حين أن حلول الجهات الخارجية مثل Fastlane و Bluepill وما إلى ذلك تعد مساعدة كبيرة ويمكنها القيام بالكثير من الأعمال الشاقة لك ، فإن هذه المقالة ستستكشف إمكانيات استخدام أدوات Xcode و Apple وحدها لتلبية احتياجات التكامل المستمر. سنستخدم أيضًا توقيع الكود اليدوي نظرًا لأن ذلك غالبًا ما يمثل مشكلة لكثير من الأشخاص ، كما أن التوقيع التلقائي لا يميل أيضًا إلى أن يكون الحل الأمثل عندما يتعلق الأمر بتكوينات بناء متعددة.

ملاحظة: تستند هذه المقالة إلى Xcode 9.4.1 وتركز على تطوير تطبيقات iOS ، ولكن الكثير منها ينطبق على Xcode 10 (متاح حاليًا كإصدار بيتا 5) وتطوير تطبيقات macOS.

إعداد خادم Xcode

إلى جانب تبسيط عملية التكامل الفعلية ، قام Xcode 9 أيضًا بتبسيط عملية إعداد خادم Xcode.

قم بتشغيل تطبيق Xcode على جهاز macOS الخاص بك والذي تم تعيينه كخادم CI الخاص بك وافتح التفضيلات.

انتقل إلى علامة التبويب الأخيرة ، المسماة Server & Bots .

أدوات التكامل المستمر: لقطة شاشة لعلامة التبويب الخوادم والروبوتات

قم بتشغيل قدرات خادم Xcode بالنقر فوق المفتاح الموجود في الزاوية العلوية اليمنى. بعد ذلك ، سيُطلب منك تحديد مستخدم لتشغيل وتنفيذ البرامج النصية للبناء على هذا الجهاز. ربما تكون فكرة جيدة أن يكون لديك مستخدم مخصص لهذا الغرض فقط ، بدلاً من استخدام مستخدم موجود مسبقًا.

لاحظ أنه يجب تسجيل دخول هذا المستخدم إلى النظام حتى يتم تشغيل أي روبوت Xcode. بعد تسجيل الدخول ، سترى دائرة خضراء بجوار اسم المستخدم.

Xcode Server و Bots بعد تسجيل الدخول بنجاح

هذا هو! دعنا نلقي نظرة فاحصة على روبوتات Xcode.

كيفية تكوين روبوتات Xcode

أنت الآن جاهز لبدء تكوين روبوتات Xcode لتعمل على هذا الخادم. يمكن القيام بذلك على أي جهاز تطوير متصل بنفس الشبكة مثل الخادم.

افتح Xcode على جهاز التطوير الخاص بك وانقر فوق Xcode> تفضيلات من القائمة العلوية. بعد ذلك ، انتقل إلى علامة التبويب الحسابات وانقر على أيقونة + في الركن الأيسر السفلي. حدد خادم Xcode من مربع الحوار الذي يظهر.

لقطة شاشة لاختيار نوع الحساب

لإنشاء روبوت ، ما عليك سوى فتح مشروعك في Xcode واختيار المنتج> إنشاء بوت… من القائمة العلوية. يحتوي إعداد الروبوت على عدد من الخطوات وسنستكشفها في الأقسام القادمة.

أتمتة توزيع التطبيق

أحد التطبيقات الأكثر شيوعًا لأتمتة إنشاء تطبيقات iOS هو تكوين روبوت لتحميل تطبيق على نظام توزيع iOS مثل TestFlight و Fabric وما إلى ذلك.

كما أوضحت سابقًا ، ستستكشف هذه المقالة فقط التحميل إلى App Store Connect والتنزيل مباشرة من خادم Xcode الخاص بك ، لأن هذه هي أدوات Apple الأصلية لتوزيع تطبيقات iOS.

App Store Connect Distribution باستخدام Xcode

قبل تكوين الروبوت ، تأكد من أن لديك سجل تطبيق App Store Connect الذي يطابق معرّف الحزمة لمشروع تطوير التطبيق الخاص بك. من الجدير بالذكر أيضًا أن كل بناء يحتاج إلى معرف فريد يتكون من إصدار الإصدار ورقم البنية. سنستكشف كيفية ضمان تلبية هذه الشروط عندما نناقش إعدادات روبوت Xcode لاحقًا.

الخطوة 1: يعد إعداد التكوين الصحيح للبناء هو الخطوة الحاسمة للحصول على ما تريد. تأكد من تحديد النظام والتكوين اللذين ينتجان التطبيق الذي تريد تحميله إلى App Store Connect. يتضمن ذلك التأكد من أن تكوين الإنشاء يستخدم معرف الحزمة المناسب المسجل في بوابة Apple Developer لفريقك (يستخدم هذا لتوقيع الكود) وكذلك في بوابة App Store Connect (يستخدم هذا لتحميل التطبيق تلقائيًا) .

الخطوة 2: بينما لا نزال في علامة التبويب "التكوين" ، نحتاج إلى تحديد خيارات التصدير. سنقوم باستكشاف قائمة خصائص خيارات التصدير ، لذا تأكد من تحديد "Use Custom Export Options Plist".

الخطوة 3: حان الوقت الآن لإعداد قائمة خصائص خيارات التصدير. تتوفر قائمة كاملة بالمفاتيح التي سيتم استخدامها في هذا الملف إذا قمت بإدخال xcodebuild --help ، لكننا سنستكشف المفاتيح المستخدمة في تكوين الروبوت هذا هنا:

  • compileBitcode - Bitcode هو تنسيق الإخراج المؤقت من Apple لكود مصدر التطبيق. بمعنى آخر ، إنه التنسيق الذي يتم تحويل شفرة المصدر به قبل تحويله إلى رمز آلة لهندسة معمارية معينة. يهدف إلى الحصول على حاوية رمز واحدة يمكن تحسينها بشكل أكبر إذا تم إجراء تحسين في مجموعة التعليمات ، وأيضًا لتكون قادرًا على تجميعها في البنى المستقبلية من نفس التنسيق. ومع ذلك ، هذا ليس له أي تأثير على التطبيق الخاص بك. الأمر متروك لك لتقرر ما إذا كنت تريد تمكينه أم لا.
  • method - تحدد هذه الوسيطة نوع المنتج الذي تقوم بتصديره. تميز Apple المنتجات حسب جمهورها المعين - يسمح لك التطوير فقط بتثبيتها على الأجهزة المحددة في ملف التوفير ، وتسمح المؤسسة للجميع بتثبيتها ، لكنهم بحاجة إلى الوثوق صراحة بملف تعريف التطوير هذا قبل تشغيل التطبيق ، ومتجر التطبيقات مخصص توزيعها على App Store أو App Store Connect ، لذلك سنستخدم هذه القيمة.
  • provisioningProfiles الشخصية - هذا لا يحتاج إلى شرح. ولكن هناك شيئان يجب ملاحظتهما هنا: ملفات تعريف التوفير في قائمة خصائص خيارات التصدير عبارة عن قاموس حيث يتوافق المفتاح مع معرف الحزمة للمنتج والقيمة تتوافق مع اسم ملف تعريف التوفير المستخدم لتوقيع الرمز.
  • signingCertificate - حجة أخرى تشرح نفسها بنفسها. يمكن أن تكون قيمة هذا الحقل اسم شهادة كامل أو تجزئة SHA-1.
  • teamID - حجة أخرى تشرح نفسها بنفسها. هذا هو المعرف الطويل المكون من 10 أحرف والذي أصدرته Apple لمؤسستك عند التسجيل في برنامج Apple Developer.
  • uploadBitcode - سواء أكنت تريد تحميل رمز البت أم لا (إذا اخترت التحويل إليه) بحيث يمكن استخدامه في AppStore Connect لإنشاء تصميمات محسّنة جديدة أو إنشاءات للبنى المستقبلية.
  • uploadSymbols - يقوم بتحميل رموز التصحيح الخاصة بك بحيث يمكنك الحصول على تقرير تعطل ذي مغزى بدلاً من مجرد تفريغ ذاكرة ومكدس تجميع.

حتى الآن ، قد تبدو قائمة خصائص خيارات التصدير كما يلي:

 <?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>

الخطوة 4: اختر .plist الذي أنشأته كقائمة خصائص خيارات التصدير.

الخطوة 5: التالي هو علامة التبويب "جدولة" - قم بإعدادها وفقًا لتفضيلاتك.

الخطوة 6: في علامة التبويب "التوقيع" ، تأكد من إلغاء تحديد الخيار "السماح لخادم Xcode بإدارة شهاداتي وملفات التعريف" وتحميل شهادة توقيع مطابقة وتوفير ملف شخصي بنفسك ، في صفحة الشهادات وملفات التعريف.

الخطوة 7: يجب ترك علامة التبويب " الأجهزة " كما هي لأننا نقوم بتحميل التطبيق بدلاً من اختباره.

الخطوة 8: تسمح لك علامة التبويب Arguments بتعيين وسيطات xcodebuild أو متغيرات البيئة التي يمكن استخدامها في البرامج النصية للبناء أو ما قبل التكامل وما بعد التكامل.

الخطوة 9: أخيرًا ، وصلنا إلى علامة التبويب Triggers ، وهي أيضًا علامة التبويب الأخيرة في تكوين روبوت التكامل المستمر Xcode. هذه هي أقوى أداة في ترسانة خادم Xcode. بالنسبة للمبتدئين ، أود إضافة الأمرين التاليين كبرنامج نصي للتكامل المسبق:

 #!/bin/sh set printenv

الأول يطبع جميع المتغيرات التي يستخدمها خادم Xcode وقيمها في عملية التكامل الحالية. الثاني يطبع جميع متغيرات البيئة وقيمها. كما هو متوقع ، يمكن أن يكون هذا مفيدًا في تصحيح أخطاء البرامج النصية ، لذلك أطلق عليها اسم "معلومات التصحيح".

تذكر أننا ذكرنا أننا بحاجة إلى التأكد من أن كل تصميم تم تحميله على App Store Connect يحتاج إلى إصدار بناء فريد وزوج رقم بناء. يمكننا استخدام أداة PlistBuddy المضمنة ، لكننا نحتاج أيضًا إلى طريقة للحصول على رقم إصدار فريد. هناك شيء واحد موجود دائمًا أثناء تكامل خادم Xcode - وهو فريد أيضًا بشكل ملائم - وهو رقم التكامل ، نظرًا لأنه يتزايد تلقائيًا. سنقوم بإنشاء نص برمجي آخر للتكامل المسبق ، يسمى "رقم البنية المحددة" بالمحتويات التالية لضمان حصولنا على رقم إصدار فريد في كل مرة:

 #!/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 واخترت عدم الالتزام بدليل Pods بـ DVCS ، فيجب عليك أيضًا تضمين نص برمجي للتكامل المسبق بالمحتويات التالية:

 #!/bin/sh cd $XCS_PRIMARY_REPO_DIR pod install

الخطوة 10: لقد انتهينا تقريبًا ، لكننا لم نحدد في أي مكان نريد تحميل الإصدار إلى AppStore Connect أو إلى أي حساب. تحقيقًا لهذه الغاية ، سنقوم بإضافة برنامج نصي لما بعد الدمج وأداة مضمنة أخرى تسمى Application Loader. ضع ما يلي في البرنامج النصي:

 #!/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 هو متغير خادم Xcode ويحتوي على المسار إلى التطبيق الذي تم إنشاؤه في تشغيل التكامل الحالي. ومع ذلك ، فإن $TESTFLIGHT_USERNAME و $TESTFLIGHT_PASSWORD ليسا متغيرين للنظام ولا Xcode Server. يجب أن تقوم بإعدادها وأن تكون لها قيمة معرف Apple وكلمة المرور الخاصين بك. لسوء الحظ ، أوقفت Apple دعم إنشاء مفتاح API لتحميل بناء AppStore Connect. نظرًا لأن هذه معلومات سرية ، فمن الأفضل إعدادها مباشرة على خادم Mac (بافتراض أنها ملكك) كمتغير بيئة بدلاً من تكوين روبوت Xcode Server.

توزيع خادم Xcode

يستخدم روبوت توزيع Xcode Server في الواقع نفس التكوين الخاص بتوزيع App Store Connect ، باستثناء البرامج النصية للتكامل اللاحق. ومع ذلك ، لا يزال تنزيل التطبيق وتثبيته أمرًا صعبًا. لا يزال يتعين عليك التأكد من أن ملف تعريف التوفير الذي قمت بتسجيل تطبيقك به يسمح بتثبيت التطبيق على الجهاز الذي تستخدمه.

مع وجود ذلك في مكانه ، ستحتاج إلى فتح Safari على جهاز iOS الخاص بك والانتقال إلى لوحة معلومات الويب Xcode Server الخاصة بالخادم. على سبيل المثال ، إذا كان اسم الخادم الخاص بك هو "Mac server" ، فيمكنك العثور عليه في "mac-server-name.local / xcode" إذا كنت على نفس الشبكة مثل الخادم. ستجد هناك قائمة بجميع روبوتات Xcode الخاصة بك وإحصائيات أحدث عمليات الدمج الخاصة بهم.

حدد التطبيق الذي أنشأ التطبيق الذي تريد تنزيله. في الشاشة التالية ، سيكون لديك زرين - التثبيت والملف الشخصي . إذا كانت هذه هي المرة الأولى التي تقوم فيها بالتنزيل من هذا الخادم ، فيجب عليك النقر فوق ملف التعريف لإضافة شهادته إلى قائمة المصادر الموثوقة. بعد ذلك ، انقر فوق الزر " تثبيت " في نفس الصفحة وسيتم الترحيب بك من خلال مربع حوار تأكيد iOS "هل أنت متأكد أنك تريد التثبيت * على جهازك؟" قم بتأكيده بالنقر فوق " نعم " ، وسيتم تثبيت التطبيق الخاص بك وتشغيله من الشاشة الرئيسية.

لقطة شاشة لخيارات تثبيت التطبيق

بالنسبة لنظام التشغيل iOS 10.3 والإصدارات الأحدث ، فإن أحد أسباب فشلها مع "لا يمكن الاتصال بـ * .local" هو أنه يجب الوثوق بالشهادة الموقعة ذاتيًا يدويًا في الإعدادات على جهاز الاختبار.

اتبع هذه الخطوات:

الخطوة 1: قم بتثبيت شهادة (شهادات) موقعة ذاتيًا من صفحة روبوت خادم Xcode على جهاز iPhone الخاص بك.

الخطوة 2: اذهب إلى إعدادات iPhone> عام> حول> إعدادات الثقة بالشهادة .

الخطوة 3: ابحث عن الشهادة (الشهادات) الموقعة ذاتيًا للخادم الخاص بك ضمن القسم تمكين الثقة الكاملة لشهادات الجذر ، وقم بتشغيل المفتاح.

الخطوة 4: العودة إلى صفحة تكامل الروبوت على خادم Xcode ، انقر فوق تثبيت .

اختبار التطبيق التلقائي لخادم Xcode

استخدام آخر رائع لخادم Xcode هو الاختبار التلقائي للتطبيق ، سواء كان اختبارًا للوحدة أو لواجهة المستخدم. للقيام بذلك ، تحتاج إلى إعداد الهدف المناسب لمشروعك. أي أنك تحتاج إلى هدف يقوم بإجراء اختبارات الوحدة أو واجهة المستخدم ، حسب هدفك.

عملية الإعداد هي نفسها العملية السابقة ، لكننا سنحدد خيارات مختلفة. الاختلاف الرئيسي الأول موجود في علامة التبويب " التكوين ". من الواضح أننا سنقوم بفحص مربعي "تحليل" و "اختبار" لأن هذا هو هدفنا الأساسي. أنصح أيضًا بعدم أرشفة المنتج أو تصديره باستخدام هذا الروبوت. من الممكن تحقيق كل من الاختبار والتوزيع بنفس تكوين الروبوت. ومع ذلك ، فإن هذين السيناريوهين يختلفان في مخرجاتهما بالإضافة إلى جدولهما الزمني. غالبًا ما يتم تشغيل التوزيع في نهاية الدورة.

سواء كنت تعمل في Scrum أو Kanban أو أي إطار عمل آخر ، يجب أن تكون هناك دورة مدفوعة بالوقت محددة مسبقًا أو دورة مدفوعة بالحدث والتي في نهايتها يجب أن تكون قد قمت بتصدير منتج قابل للاستخدام. من ناحية أخرى ، يجب عليك تشغيل روبوت الاختبار الخاص بك في كل التزام ، لأنه خط دفاعك الأول ضد الانحدارات. نظرًا لأنه من الواضح أن روبوت الاختبار يتم تشغيله في كثير من الأحيان ، فإن دمج هذين الروبوتين في روبوت واحد يمكن أن يستهلك بسرعة مساحة القرص على الخادم الخاص بك. وسيستغرق إكمال كل تكامل مزيدًا من الوقت.

بعد ذلك ، ننتقل إلى علامة التبويب "الجدول الزمني" ، وقد تناولنا هذا بالفعل في الفقرة السابقة. لذا ، فإن الموضوع التالي الذي يثير الاهتمام هو توقيع الرمز. لاحظ أنه على الرغم من أن هدف الاختبار الخاص بك قد يشير إلى أنه لا يحتاج إلى ملف تعريف التوفير في صفحة إعدادات المشروع ، يجب عليك إعداده لاستخدام نفس الفريق وشهادة التوقيع مثل التطبيق المضيف. هذا مطلوب إذا كنت ترغب في اختبار التطبيق الخاص بك على جهاز iOS بدلاً من مجرد جهاز محاكاة. إذا كانت هذه هي حالتك ، فأنت بحاجة أيضًا إلى التأكد من أن جهاز iOS المستخدم للاختبار لن يتم قفله بسبب عدم النشاط لأن هذا قد يتسبب في توقف تشغيل التكامل إلى أجل غير مسمى دون إخطارك.

نحن الآن في علامة التبويب "الأجهزة" التي لا تحتاج إلى شرح محدد. ما عليك سوى اختيار جهاز واحد أو أجهزة متعددة أو جميعها (iOS وجهاز محاكاة) التي تريد اختبار الكود الخاص بك عليها. يمكنك أيضًا التحقق مما إذا كنت تريد تشغيل الاختبارات على أجهزة متعددة بالتوازي أو بالتتابع. لإعداد هذا ، يجب أن تضع في اعتبارك احتياجات مشروعك (سواء كنت تستهدف مجموعة معينة من الأجهزة أو جميع أجهزة iOS المدعومة) وكذلك موارد أجهزة الخادم.

في علامة التبويب الوسائط . ليست هناك حاجة لتحديد أي شيء بشكل صريح ، حيث سنستخدم فقط متغيرات البيئة المدمجة.

أخيرًا ، في علامة التبويب المشغلات ، سنقدم برنامجًا نصيًا واحدًا للتكامل المسبق وآخر بعد التكامل. الأول موجود فقط لمساعدتنا في تصحيح الأخطاء في حالة مواجهة بعض المشكلات. إنه في الواقع الشخص الذي استخدمناه بالفعل:

 #!/bin/sh set printenv

والثاني هو الذي سيُعلمنا في حالة فشل واحد أو أكثر من اختباراتنا في التكامل الحالي. تأكد من ضبطه للتشغيل فقط عند فشل الاختبار. وأدخل ما يلي:

 #!/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"

هناك شيئان يجب شرحهما هنا. بادئ ذي بدء ، تقوم متغيرات $ HOSTNAME بتخزين قيمة التنسيق التالي: computer-name.local. من الواضح أن الرابط سيعمل فقط إذا تمكنت من الوصول إلى هذا الخادم عبر الشبكة المحلية. أيضًا ، من المرجح أن تتلقى تحذيرًا أمنيًا من متصفحك عند زيارة هذا الرابط ، لأنه اتصال https إلى وجهة لا يمكن الوثوق بها. أخيرًا ، هذه مجرد نقطة بداية للبرنامج النصي "Test failure". يمكنك إرسال بريد إلكتروني إلى فريق التطوير بأكمله ، أو فتح مشكلة JIRA عبر طلب واجهة برمجة التطبيقات أو أي شيء آخر تشعر أنه الأنسب والأكثر إنتاجية.

تغليف

نأمل أن تكون هذه المقالة قد شجعتك على قضاء وقتك في استكشاف إمكانات خادم Xcode خارج مجرد إنشاء تطبيق. على الرغم من أن هذا المنشور قد لا يساعدك بالطريقة التي تريدها أو تتوقعها بالضبط ، فقد كان الهدف هو تعريفك بطريقة منفتحة لاستخدام البيئات المدمجة ومتغيرات خادم Xcode لتحقيق مستوى أعلى من الأتمتة.

هناك الكثير من خدمات الجهات الخارجية التي تتيح المزيد من الوظائف ويمكنها القيام بالكثير من العمل من أجلك ، بما في ذلك Fabric و Bluepill و Fastlane. ولكن ، لا محالة ، الاعتماد على طرف ثالث يقدم تبعية جديدة لمشروعك ويتطلب أحيانًا إعدادًا وتكوينًا بسيطًا ومعقدًا في بعض الأحيان. تتطلب الأساليب الموضحة هنا فقط أدوات مثبتة بالفعل على كل جهاز Mac ، لذا فهي لا تتطلب وقت إعداد إلى جانب تكوين الروبوتات ذاتها التي ستقوم بتشغيل البنيات الآلية الخاصة بك!