ما بعد بناء التطبيق

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

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

هنا تقفز لنا مصطلحات مثل DevOps و CI و CD. كلمة DevOps مكونة من شقين Dev من Development و Op من Operation و كأنها تشير للعمليات اليومية لإدارة المنتج و المرافقة للتطوير و بشكل عام يمكن تعريف  DevOps بأنها مجموعة أو وحدة مكونة من الأشخاص و الإجراءات و الأدوات التي تمكننا من تقديم شيء ذي قيمة بصورة مستمرة للعميل.

اما ال CI و هي اختصار Continuous integration و الCD للـ Continuous Delivery بمعنى اني اتمكن من عمل Compile و Deploy للتطبيق او المنتج بطريقة آلية و بصورة مستمرة . لأن الأعمال الروتينية عادة مزعجة للتقني, هذا غير أن الإنسان معرض للخطأ فقد ينسى ملف هنا او مكتبة هناك أو ينسى بعض الاختبارات اللازمة ظناً منه أن التغيير بسيط و لا يحتاج لذلك.

لنأخذ هذين المصطلحين بشيء من التفصيل.

ال Continuous Integration

لما يكون هناك مبرمج واحد فقط مسؤول عن التطوير فسيكون وحده المسؤول عن أي مشكلة فيه , لكن عند العمل ضمن فريق فقد يتحجج المطور عند ظهور مشكلة معينة بأن الكود يعمل بصورة طبيعية على جهازه و قد يريك ان الUnit Testing كله اخضر لكن عندما قام برفع جزئيته CheckIn تعارضت مع تعديل قام به مطور آخر. هذا هو المقصود بال Integration هنا يعني التكامل مع الأكواد الأخرى.

ال Continuous Delivery

احيانا يكون المطور يعمل على تعديل جديد , خلال التعديل قام بعدة بناءات ناجحة و أكمل بعدها. و من الممكن فجأة أن يطلب منه أن يعرض آخر نسخة عملت معه بشكل صحيح . بالطرق العادية يحتاج ليمسح الكود الذي يعمل عليه حالياً و يرجع لآخر نسخة بناء صحيحة. ايضا من الممكن أن يكون بنى ميزة جديدة لكن مديره اخبره انه لا يحتاجها الآن و ان يريه التطبيق بدون تلك الاضافة, هذه الأشياء الطارئة قد نتداركها  بال Continuous Delivery. الفكرة الأساسية في الDevOps و CD/CI هي كيف تقوم بعمل كل ذلك بشكل آلي automated.

لننتقل عملياً :

في البداية ضروري يكون عندك مخزن و مدير للأكواد , ممكن تستخدم Git مثلاً او اذا كنت تستخدم منتجات مايكروسوفت فلديك TFVC و امازون لديها CodeCommit. بشكل عام يرمز لهذا النوع من الادوات بـ VCS او SCM. هذا يضبط لك عملية حفظ الكود و ادارة النسخ من حيث يعطيها رقم نسخة و ايضا يقارن بين النسخ و يريك الفرق بين الكود الموجود و الكود الجديد اي يتابع لك التغييرات اللي حدثت على الكود و من أضاف هذه الجزئية او تلك.

تلك التغييرات عادة لن تأتي من فراغ بل ستأتي عن طريق طلبات Change Request لذا نحتاج ان يكون لدينا نظام او جزئية لإدارة تلك الطلبات و هذا ما توفره الكثير من ادوات الDevOps بحيث ان لديك قائمة طلبات او UserStory و عندما ترفع الكود تربطه بأحد تلك الطلبات. و بهذا يكون من السهل تتبع أي تغيير في الكود و معرفة السبب ورائه و من قام به. ايضا يمكن ربطه بأي Build او Test أو Release 

مرحلة ال Build 

هي المرحلة التي تضغط فيها زر Build في الIDE الخاص بك  او تنفذ تشغل الكومبايلر , الBuild قد يسبقه عمليات Debug كثيرة لذا تجد بعض الIDEs تعطيك خيار إما Build او Debug و جميعها تنتج في النهاية الbinary الجاهز للتشغيل.

ما تقدمه ادوات الCI/DI انه في البداية ستربط مع مخزن الاكواد لديك وتقوم بعمل  الBuild من خلالها إما اوتوماتيكياً عند كل عملية رفع للكود Check-In او من خلال Trigger ينبهك بوجود تعديل جديد على الكود , كما يمكن أيضا تنبيه آخرين مثل فريق الTesting بوجود نسخة Build جديدة 

مرحلة الTesting

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

مرحلة الRelease

الفرق بين الBuild و الRelease هو ان الBuild يقدم إلى فريق الTesting اما الRelease فيقدم الى العميل. او ممكن نقول ان الRelease هو اخر Build و الذي يُقدم للعميل. لنفترض انه تمت الموافقة على الTesting وجاء الApproval تمكنك بعض الادوات من نشر التطبيق مباشرة من خلالها على الApp Store  او الApple Store او في موقع التطبيق بطريقة آلية.

المراحل السابقة تدخل فيما يسمى Pipeline و هناك برامج و خدمات سحابية كثيرة تفيدك في ادارة ماسبق منها Jenkins اللي عبارة عن تطبيق ويب من 2005 و كان قبلها اسمه Hudson. من مميزات Jenkins ان له مكتبة كبيرة من الPlugins ممكن تربطه بأي Compiler تقريباً و بأي مخزن كود مثل GitHub و استخدامه بسيط بالاضافة انه مجاني. ايضا من الادوات المشهورة TeamCity و Buddy و Travis CI و Azure DevOps 

جرب اي منهم و اضف خبرتك في التعامل معه في سيرتك الذاتية , يفرق كثير. ستجد الكثير من الفيديوهات تشرح كيفية استخدامها مع تقنيتك المفضلة.