
مرحباً بالجميع ، أنا على اتصال مع ألكساندر بانوف ، وهو خبير تقني من Pixonic. في الشركة ، أنا مسؤول عن الحلول المشتركة بين المشاريع والأجهزة الطرفية القريبة من المشروع ، وأريد اليوم أن أشارك تجربتي وأفضل الممارسات.
تُستخدم الآن منصات التطوير والتكامل المستمر ، أو CI / CD ، في كل مكان في تلك الصناعات التي تلعب فيها العمليات التقنية التكرارية التي تعمل بشكل جيد دورًا حاسمًا. في هذه المقالة ، سوف نتحدث عن CI / CD لتنفيذ مشاريعنا Unity لتطوير ألعاب الهواتف المحمولة: ما هي المشاكل التي واجهناها ، وكيف تمكنا من حلها ، وما هي التحسينات التي حققناها وكيف يتم تسجيل تجميع خطوط الأنابيب لدينا.
توافق فورًا على أننا نستخدم TeamCity من
JetBrains كخادم CI ، و GitHub كمستودع لمستودعات Git ، و Nexus لتخزين مقتنيات التجميع.
لذلك ، واجهنا المشاكل التالية:
- عدم وجود معيار لإنشاء التجميع المشترك: عملياً ، كان بإمكان جميع المطورين الوصول إلى خادم TeamCity ، ونتيجة لذلك تمت كتابة البرامج النصية للتجميع بلغات برمجة مختلفة (BASH ، و PowerShell ، و Python) ، وغالباً ما تم تكرار المنطق ؛
- أسطول ضعيف: نظرًا لحقيقة أننا نحتاج إلى إنشاء تصميمات لنظام iOS ، كان علينا استخدام أسطول من سيارات Mac mini. ونظرًا لأن التجميع بأكمله في Unity يقع تقريبًا في مؤشر ترابط واحد ، فقد أثبتت التجميعات المتوازية على جهاز واحد أنها مشكلة.
- قليل من الكفاءة التشغيلية التي تم تصحيحها: نظرًا لانخفاض إنتاجية الدعم الفني لدينا ، استغرقت التجميعات وقتًا طويلاً للغاية ؛
- قوائم انتظار كبيرة تنتظر التجميع مع عدد كافٍ من وكلاء TeamCity ؛
- تجمع عامل منفصل لكل مشروع: نظرًا للبيئة المختلفة المثبتة على الأجهزة ، وكذلك ملفات التكوين المتعارضة بين المشاريع (ملفات تكوين ذاكرة التخزين المؤقت ، إلخ) ، كان من المستحيل تنظيم تجمع مشترك.
ماذا فعلت كنتيجة؟
بادئ ذي بدء ، أنشأنا مستودع واحد من البرامج النصية للتجمعات في بيثون. يتم تنفيذ الإطلاق في بيئة إدارة البيئة الافتراضية Pipenv مع وجود مكتبات خارجية تابعة لخادمها للتحديث السريع والتحكم في إصدار المكتبات المطلوبة. وبالتالي ، قدمنا نقطة دخول واحدة للتجميعات لجميع المشاريع القائمة. أعدنا كتابة جميع النصوص في Python ، وحدنا التكوينات ، وأدت إلى معيار مشترك ، وإزالة التكرارات من الكود.
كان من الضروري تقليل وقت التجميع ، وربما تقليل عدد الأجهزة المستخدمة.
في البداية ، كان لدينا مزرعة تضم 13 جهاز كمبيوتر صغير يعمل بنظام Mac ، ولكن هذا الحل بعيد عن المستوى الأمثل: نظرًا لخصوصية التجميعات على Unity ، سيتم تنفيذ حوالي 80٪ من وقت التجميع في خيط واحد فقط. أضف إلى ذلك قدرًا كبيرًا من إمكانية الوصول للكتابة إلى محرك الأقراص الصلبة ، ونصل إلى أن جهاز Mac mini يمكنه بالكاد التعامل مع مجموعة واحدة متزامنة.
والنتيجة هي الحاجة إلى مراجعة الأجهزة.
عند البحث عن بدائل لمجموعات Unity ومقارنتها ، لاحظنا أن أجهزة الكمبيوتر المستندة إلى AMD Ryzen ، نظرًا لأدائها ، تسمح بتجميع ما يصل إلى 8 إلى 12 مجموعة في نفس الوقت دون خسارة كبيرة في الأداء ، فيما يتعلق بذلك ، فقد تقرر شراء أربعة من هذه الأجهزة بستة من محركات أقراص SSD وتثبيتها اثنين من وكلاء لكل القرص الصلب.
يتم مقارنة مقارنة كيف كان وما أصبح في الجدول.

متوسط وقت البناء:

بالإضافة إلى ذلك ، قمنا بتنظيم أولويات اختيار وكلاء TeamCity لتقليل الوقت الذي يقضيه التجميع في قائمة الانتظار. في السابق ، كان لكل مشروع من مشاريعنا مجموعة من الوكلاء ، وبسبب طبيعة الألعاب المتعددة ، لم تسمح البيئة المعتمدة على المشروع بإنشاء تجمع مشترك. الآن ، بعد إعادة تنظيم النظام ، تركنا عددًا من الوكلاء المعينين للمشروعات ، والتي تستخدم للتجميعات التلقائية ، لكننا تمكنا من إضافة العديد من الوكلاء المشتركين لجميع المشاريع: يتم تضمينهم في العمل عندما يكون كل الوكلاء المرتبطين بالمشروع المرغوب مشغولين.
- مكتبة BuildPipeline للوحدة
لقد بدأوا مكتبة صغيرة لـ Unity ، مما يجعل من الممكن تعيين تصميمات بناء في إطار محرر Unity منفصل ، ولديه أيضًا القدرة على تشغيل builds في وضع batchmode. من الوظيفة الرئيسية للمكتبة: إنها تتيح لك إضافة وتعريفات قبل التجميع ، وتعطيل مكتبات الطرف الثالث أو ملفات محددة ، وإضافة خطوات ما قبل المعالجة وما بعدها ، ويتم تخزين جميع إعداداته في ملفات التكوين ، وهناك أيضًا إمكانية الميراث.
الإطار المحدد في مكتبة BuildPipelineلدينا خط أنابيب الحالي CI / CD
التجمع PullRequest. لكل التزام:
- إطلاق Unity للتحقق من أخطاء الترجمة وتحديد التحديثات وإنشاء الحلول ؛
- اختبارات التشغيل
- إطلاق محلل ثابت: مع مساعدته ، يتم إجراء تحليل تدريجي على الملفات المتأثرة بـ PullRequest الحالي ؛
- رسالة حول نتيجة التحقق ، والتي يتم حفظها على GitHub.
خطوات بناء مشروع الوحدة:1. تثبيت Pipenv وتشغيل البرامج النصية للبناء في Python: تحديث وتثبيت مكتبات Python التابعة لجهة خارجية من خادمنا (
بروكسي مستودع
pypi.org ) ثم تشغيل البرنامج النصي للبناء.
2. الإعداد الأولي لتجميع الوحدة:
- حذف مجلد Library ، والحزم ، والأصول الانتقائية (عن طريق القناع و / أو ملفات محددة) ، وحذف الحلول (ملفات .sln) - إذا لزم الأمر ؛
- إنشاء ملف معلومات التجميع: اسم الفرع ، رقم التجميع ، إلخ. - لمزيد من الاستخدام في الإنشاء لتصحيح الأخطاء والاختبار ؛
- إعداد خادم ذاكرة التخزين المؤقت للوحدة لمشروع. كل مشروع له قناعاته. يحتوي كل مطور أيضًا على خادم ذاكرة تخزين مؤقت تم إعداده للتعبئة بشكل أسرع: عندما يضيف أحد المطورين أصلًا جديدًا ، فسيظهر تلقائيًا على خادم ذاكرة التخزين المؤقت وعلى خادم البناء - وبالتالي فإن استيراد الأصول يكون أسرع بكثير.
3. Running Unity للتحقق من وجود أخطاء في التحويل البرمجي ، يقوم التحديث بتعريف وإنشاء الحلول.
4. قم بإجراء الاختبارات واخرج منها إذا كانت هناك أخطاء - إذا لزم الأمر.
5. إطلاق Unity BuildPipeline مع التكوين اللازم ومعلمات المشروع الإضافية.
6. بالنسبة لبنيات Android / iOS - إطلاق Gradle / Xcode:
- Gradle - GradleWrapper ؛
- Xcode - أرشفة XcodeProject التي تم الحصول عليها بعد الوحدة ونسخها إلى Mac mini. بشكل منفصل تثبيت وتحديث جميع الشهادات اللازمة وملفات التوفير الشخصي. قم بتشغيل الأوامر Clean ، الأرشفة ، التصدير.
- في مرحلة التصدير ، من الممكن فصل توقيع الإنشاء والمطور و AppStore. بناءً على ما نجمعه ، حدد اللوحة المرغوبة ، أو كل لوحة بدورها. في الإخراج ، نحصل على ملفين: Developer و Release - للتثبيت على أجهزة الاختبار وللتحميل إلى AppStore ، على التوالي.
7. صب التصميمات المجمعة والملفات ذات الصلة (السجلات ، نتائج الاختبار ، .obb ، بيان لتركيب تطبيقات iOS ، ملفات dsym ، وما إلى ذلك) على تخزين القطع الأثرية ، للتجميعات المستقلة - تحميل الإنشاء المجمّع على تخزين الأرشيف.
8. إنشاء صفحة تحتوي على رمز الاستجابة السريعة لتثبيت البنية ، مع إضافة روابط من المستودع ومعلومات البناء إلى قاعدة البيانات لمزيد من العمل مع تطبيق PixLauncher - سنتحدث عنها لاحقًا.
9. رسالة إلى سلاك حول نتيجة التجميع: إلى الشخص الذي أطلق التجمع ، وكذلك إلى القنوات اللازمة.
هذه الرسائل تأتي إلى سلاكخطوات إضافية
كخطوة أخيرة من الخطة ، يتم توزيع التصميمات التي تم جمعها على الأجهزة لمزيد من الاختبار والتحميل إلى المتجر.
لتثبيت الإنشاءات على الأجهزة ، قمنا بكتابة تطبيق صغير لنظامي التشغيل Android و iOS - PixLauncher. نقوم بتثبيته على كل جهاز حيث توجد إمكانية لاختيار بنية من TeamCity. للراحة ، يمكنك تعيين عوامل تصفية في ذلك - على سبيل المثال ، إضافة تكوين إلى المفضلة الخاصة بك ومن ثم تنفيذ إجراءات معها في نقرة واحدة. في حالة الإنشاءات لنظام Android ، إذا لزم الأمر ، يتم تنزيل الملف بدقة .obb تلقائيًا.
بالإضافة إلى ذلك ، قمنا بتنظيم إمكانية تثبيت الإصدار عبر إشعارات الدفع: لقد أضفنا مكونًا إضافيًا مكتوبًا ذاتيًا إلى خادم TeamCity ، مما يسمح لنا بتحديد عناوين MAC للأجهزة المتصلة بالشبكة المحلية في صفحة الإنشاء. ثم يتم إرسال إشعار الدفع إلى هذه الأجهزة مع رابط للتثبيت - وبهذه الطريقة يتم تنفيذه الآن بنقرة واحدة.
لذلك ، سمح التطبيق لتسريع البحث عن QA بناء المطلوب من قبل الإدارة والتثبيت على الأجهزة للتحقق لاحق.
ظهور PixLauncher دائرة الرقابة الداخلية التطبيقأخيرًا ، يتم رفع التحميلات إلى المتاجر
بعد كل الإجراءات التي يتم تنفيذها ، فإن الحاجة إلى ملء مضمون للبناء والمعلومات الوصفية حول التطبيق إلى الأطراف بشكل طبيعي.
في البداية ، نشأت معظم المشكلات مع AppStore:
- يتم ملء البوابة فقط من جهاز MacOS ؛
- يجب تحميل مقاطع الفيديو ولقطات الشاشة وأوصاف التطبيق بأكثر من 25 لغة.
أدى ذلك إلى ضياع وقت كبير لملء وتعطل تنزيل الملفات إلى لوحة المسؤول. لذلك ، فكرنا في التشغيل الآلي للعملية.
نتيجة لذلك ، لدينا ما يلي:
- في Google Disk ، حصلنا على جهاز لوحي مع وصف للتطبيق بجميع اللغات ؛
- يتم ترتيب مقاطع الفيديو ولقطات التطبيق في مجلدات مع تسمية معينة ؛
- في Teamcity ، من أجل تحديد بنية مجمعة بالفعل ، قاموا بعمل تكوين يعتمد على بناء الإصدار ؛
- من خلال GooglePlay API و iTMSTransporter لـ Apple ، قم بملء البيانات والمعلومات الوصفية حول التطبيق في المتجر لجميع اللغات اللازمة. في حالة حدوث مشاكل (على سبيل المثال ، مع شبكة) - نقوم بالعديد من المحاولات ونرسل رسالة إلى Slack مع نص الخطأ.
هذه هي الطريقة التي يبدو بها تحميل الإنشاء إلى AppStoreنتيجة لذلك - عدد قليل من الأرقام
- لدينا الآن حوالي 400 مجموعة وما يصل إلى 60 عملية تثبيت للبنية على الأجهزة يوميًا ؛
- يوجد 57 تكوينات بناء مختلفة على TeamCity؛
- نحن نستخدم 22 وكيل TeamCity ، في حين أنه من الممكن التوسع دون خسارة كبيرة في الأداء إلى 48 وكيلًا ؛
- هناك إمكانية التوسع الأفقي للأسطول.