في هذه الصفحة
المقدمة
بعد ما اتعلمنا استخدام Fastlane وFirebase مع Flutter احنا لسة نقدر نوصل لمرحلة اعلي في الAutomation و توفر وقتك وتريح نفسك من المهام المتكررة فيهم اكتر تخيل! 🤯
مع وجود GitHub Actions بمجرد ما تضيف كود جديد، بيبدأ يشتغل من وراك: يبني التطبيق، يختبره، ويتأكد إن كل حاجة تمام. ولو فيه أي مشكلة بيقولك عليها و مش بيطلع النسخة الجديدة الا اما تحلها .
في المقال ده هنتعرف اكتر ازاي نستخدم GitHub Actions علشان نخلي شغلنا Automated اكتر 🚀
هنتكلم النهاردة عن:
📌 ايه هو GitHub Actions
📌 مميزاته ايه
📌 نظرة عامة على GitHub Actions
📌 ايه هو GitHub Market Place
📌 إعداد GitHub Actions للـ Flutter
📌 هنكتب اول workflow
📌 في الختام
المرة اللي فاتت اتكلمنا عن اهمية الـ CI/CD وعرفنا قد ايه هو بيوفر وقت و مجهود في عملية Deployment و Monitoring.
النهاردة بقي هنتعرف علي Tools من ضمن Tools اللي بتساعد في عملية CI/CD و بتوفر وقت اكتر علينا في عملية Build & Test بعد ما بنضيف او بنعدل حاجة جديدة .
ايه هو GitHub Actions
هي عبارة عن CI/CD Platform وفرتها GitHub بتخلي عملية الـ build , test , deploy تكون automated بطريقة اسهل بمجرد ما بتوصل للريبو بتاعك ... طب ازاي برضو ؟
المرة اللي فاتت بعد ما ربطنا ب fastlane كنا بنضطر نكتب command علشان نعمل build و نطلع نسخة جديدة في GitHub Actions بقي تقدر تعمل build بمجرد ما تعمل push او merge او pull request حتي ، و بيبدأ ينفذ شوية اوامر عن طريق workflow بنكتبه ولو كل حاجة تمام، يرفع الإصدار الجديد على Firebase أو حتى يرفعه على Google Play.
لو عايز تعرف أكتر، دا الـ documentation الرسمي بتاعه :
طب ايه هي مميزات الـ GitHub Actions
- تاريخ محفوظ من الـ releases: من غير ما تكتب أوامر، بيبقى عندك سجل كامل لكل الـ releases المختلفة اللي عملتها. وإمكانية عمل release على أكتر من بيئة: سواء ويب، موبايل، أو ديسكتوب، وكمان لأنظمة زي Android وiOS.
- الكاشينج (Caching): دي ميزة بتخليك تقدر تخزن الـ dependencies اللي بتستخدمها، وده بيساعد إن وقت الـ build يكون أسرع ويقلل استهلاك الـ resources.
- تخزين الـ GitHub Action Logs: بيحتفظ بالـ logs، وده بيخلي الوصول ليها سهل ومشاركتها مع التيم بتاعك أسهل.
- الأمان (Security): بيحمي أي بيانات حساسة زي الـ configurations أو الـ tokens، وبيخليها أكثر أمان، بحيث محدش يقدر يوصل ليها أو يشوف قيمتها. كمان بيعمل (code scanning)، و(secret scanning)، ومراجعة للـ dependencies عشان يتأكد إن مفيش مشاكل.
- تقليل وقت الـ merge: بيساعدك تطلع البرودكت أسرع، وتختصر وقت كبير في عمليات الدمج بين الكود.
- سهولة البدء: GitHub Actions بييجي جاهز مع GitHub، يعني مش هتحتاج تدور على خدمات خارجية أو تربطها، كل اللي عليك تبدأ تكتب الـ workflows بتاعتك.
طيب قبل ما نبتدي نعمل workflow للابلكيشن بتاعنا خلونا نشوف بشكل مختصر ازاي GitHub Actions بيشتغل.
ازاي GitHub Action بيشتغل
📌 Event:
هو حدث بيحصل في وقت ما بقول مثلا كل يوم الساعة 5 نزل تحديث جديد للموقع ، و زيه انه اما اعمل push علي main يعمل build
و هكذا عندنا كذا event زي pull request , create issue , merge , schedule
📌 Workflow :
هي process كلها اللي عايزة اعملها run بيكون جواها ( event, runner, action - job ) .
يعني مثلا بقوله كل اما اعمل new issue اكتبلي فيها Hello , rowan وعلشان أنفذ ده، بستفيد من الـ actions اللي بيقدمها GitHub.
📌 Actions :
دا بقي الحاجة اللي بعملها بسطب حاجة او بعمل run test بتعمل build كدا وفي ناس عملت شوية actions علشان تسهل على المطورين حاجات كتير و دا موجود علي GitHub Market Place هنعرف عنه اكتر كمان شوية .
فاللي بيحصل إن عندي حدث معين، GitHub بيعمل check عليه، ولما يحصل الحدث، بيبدأ يشغل workflow المكتوب باستخدام الـ action اللي حددته.
📌 Runner :
هو المكان اللي بيشتغل فيه الـ workflows. يعني هو زي الخادم (server) اللي بتنزل عليه الكود وبيشغل الأوامر اللي كتبتها زي انظمة التشغيل المختلفة windows , ubuntu , macos
فيه حاجة كمان اسمها الـ self-hosted runners، يعني بتكون عندك خادم على جهازك أو سيرفر خاص بيك. ده بيخليك تتحكم أكتر في البيئة، وده مفيد لو عندك متطلبات خاصة.
📌 Jobs :
هو مجموعة من الخطوات (steps) اللي بتتنفذ على الـ Runner. يعني بتكون مجموعة من الأوامر اللي بتحصل في وقت واحد.
📌 Steps :
ده الجزء اللي بيعمل حاجة محددة جوا الـ Job. كل Step يعني أمر معين زي install library أو run test أو رفع الكود.
فببساطة، عندنا:
- الـ Workflow جواه job أو أكتر.
- كل Job فيه step أو أكتر.
- وكل Step هو أمر معين أو action محدد.
هنجيب ال actions دي منين ؟
على الـ Marketplace، تقدر تلاقي مجموعة كبيرة من الـ actions اللي ممكن تستخدمها في الـ workflow بتاعك، وده الرابط: https://github.com/marketplace
لكن رغم إن الـ Marketplace بتاع GitHub فيه أكشنز كتير جاهزة تقدر تستخدمها، في بعض الأحيان ممكن تكتشف إن GitHub Actions مفيهوش دعم مباشر لبعض الخدمات الخارجية. في الحالة دي، هتحتاج إنك تعمل actions مخصصة بنفسك أو تدور على حلول بديلة تكون مناسبة لاحتياجاتك.
Flutter and GitHub Acions
دلوقت هنبتدي نستخدم GitHub Actions مع Flutter وهنكمل علي البروجكت اللي بدأناه المرة اللي فاتت
- اول حاجة هنخلي firebase cli token بتاعنا يكون secure هنروح علي الريبو ع جت هاب و نختار settings .
- بعد كدا هنختار secrets و منها actions
- هنعمل new repo secret هنضيف فيها الvalue بتاعة firebase cli token اللي عندنا في البروجكت كنا حاطنها في fastlane قبل كدا
و نحط الاسم بتاعها و نعملها save كدا خلاص عملها secure لو دخلنا نشوف الvalue بتاعتها هنلاقيه عملها hidden و مش باينة
- بعد كدا هنبتدي نكتب workflow بقي عندنا في البروجكت اول حاجة هنعمل فولدرفي البروجكت هنسميه .github جواه فولدر اسمه workflows و هنعمل جواه الفايل اللي هنكتب فيه الworkflow و يكون معبر عن الهدف بتاعه علشان لو عندنا اكتر من workflow
الفايل بيتكتب بلغة الyml فبيكون .yml و دي لغة بيتكتب بيها configrations file زي فايل pubsec.yml اللي عندنا و عارفين انها sensitive for indentation و بتعتمد علي line separation
تقدروا دلوقتي تشتركوا في النشرة الأسبوعية لاقرأ-تِك بشكل مجاني تمامًا عشان يجيلكوا كل جديد بشكل أسبوعي فيما يخص مواضيع متنوعة وبشروحات بسيطة وسهلة وبجودة عالية 🚀
النشرة هيكون ليها شكل جديد ومختلف عن شكلها القديم وهنحاول انها تكون مميزة ومختلفة وخليط بين المحتوى الأساسي اللي بينزل ومفاجآت تانية كتير 🎉
- نكمل دا الworkflow كامل بتاعنا
خلينا نشوفه واحدة واحدة .. احنا دلوقت عايزين نعمل build app و نعمله distribute عن طريق firebase , fastlane ف انت ك developer علشان تعمل كدا بتعمل ايه ؟
- بتنزل java jdk بعدين بتنزل flutter sdk و تشتغل عادي و هنا احنا رابطينه ب fastlane ف منزلين ruby كمان ، ف دي الحاجات اللي هنحتاج ننزلها علشان نعمل build و دا نفس اللي هنديه لل github نقوله يعمله علشان يعرف يعمل build برضو
- ف هقوله اما اعمل push علي master ابتدي اعمل الحاجات اللي هقولك عليها
- بعد كدا هقوله ال jobs اللي هيعملها بقي
- اول حاجة بدي ال job ال name اللي انا عايزاه
- بعد كدا بقوله هيعمل run علي ايه قلتله هنا ubuntu علشان هعمل distribute for android لو ios هنحتاج نكتب mac
- ال name دا optional بقول بس الاكشن دا بيعمل ايه علشان ابقي فاهمة
- بعد كدا بكتب الsteps و علشان اعرف انا هكتب ايه او اسم الاكشن ايه فهنروح زي ما قلنا علي marketplace و نعمل سيرش باسم الحاجة اللي عايزنها هيطلعلنا مثال عليها و نستخدمها ازاي هناخدها copy بس .
ف اول حاجة بقوله ادخل علي الريبو بتاعي علشان يبقي ليه اكسيسس عليه:
- اما بستخدم كلمة uses: بيعرف انه مفروض يجبها من market place و يدور علي الاكشن اللي بالاسم دا ممكن يكون url او action check out اسم الاكشن
- بعد كدا بقوله ينزل ال tools اللي هيحتاجها علشان يعمل build
- اول حاجة هينزل java jdk لان الاندرويد بيحتاج جافا ف بشوف الفيرجن stable عندي هتبقي 11
و بنستخدم with علشان اقوله اني عايزة properties معينة هنا فهقوله عايزة distribution دا packaged version of the JDK ، وبيتأكد بس ان JDK مناسب مع systems مختلفة فيه كذا نوع distributed بس هنا هنستخدم Temurin علشان هو stable برضو و تقدر تشوف بقيت distributions من هنا :
بعد كدا لو دخلت دورت و كتبت flutter action هتلاقيه مطلعلك عايزك تعمل ايه بالظبط بتاخده كوبي عندك و خلاص هتلاقيه هنا
https://github.com/marketplace/actions/flutter-action
اما تدخل هتلاقي الaction بتاع install flutter بيتكتب ازاي و محتاج ايه
بعد كدا هنحتاج نسطب ruby علشان fastlane
- ال bundler cache بيسرع ال workflow و عملية build
- ال working directory بقوله يدخل جوه android علشان يلاقي gem files بتاعة fastlane
- بعد كدا علشان استخدم ال secret اللي عملته بتاع فاير بيز
- هكتب اخر سطر و دا من secrets documentation عادي
- بعدين هديله الامر بتاع run بقي في الاخر و بعد كلمة android دا اسم lane بتاعي في fastlanefile
بس كدا و متنساش كل مرة بترفع apk جديد بتغير الversion في pubsec.yml علشان يقبله و بكدا نبقي عملنا اول work flow بنجاح 🥳
علشان نشوف نتيجة اللي عملناه بقي هنعمل اي تعديل و نعمله push و هنروح علي repo و ندخل علي actions هنشوف الworkflow بتاعنا و نقدر نشوف logs و لو حصله fail هنشوف السبب ايه
دا شكل الخطوات اللي عملناها
خلي بالك versions ل rupy و java مش بتكون ثابتة عندنا كلنا ف بنشوف الversion بتاعتنا و نكتبها في workflow
ممكن كمان نحسن workflow و نعمل cache للجافا و flutter sdk علشان مش كل مرة ينزلهم من الاول يعمل check يشوف موجود و لا لا
دا في حالة لو انا عايزة اعمل حاجة custom و اكتب workflow بنفسي بس github بتوفر في marketplace workflows لاكشنز جاهزة اقدر اخد منها و اعمل configration علطول
لو دخلت علي الريبو و رحت لجزء action
هعمل سيرش عن الحاجة اللي عايزة اعملها workflow ل دارت مثلا او اندرويد او ios ، هلاقيه مديلي الworkflow جاهز
دا هيخلينا نطلع apk لو عايزين نطلع app و نرفعه علي جوجل بلاي تقدروا تشوفوا المقالة دي :
و دا بودكاست مفيد جدا بيتكلم عن DevOps في الموبايل جميل تقدروا تشوفوه :
في الختام
عملية الـ CI/CD مهمة في تطوير تطبيقات Flutter لأنها بتوفر وقت ومجهود كبير وبتقلل الأخطاء لأقل حد ممكن. استخدام GitHub Actions بيوفر لك بيئة متكاملة للـ CI/CD وبيسهّل عليك عملية automation انت ممكن تروح تتمشى شوية، ترجع تلاقي التطبيق بتاعك اتبنى، اتجرب، وجاهز و مطلعك لو فيه اي مشاكل علشان تحلها .
كمان فيه أدوات تانية كتير ممكن تستخدمها مع Flutter، وفي الجزء الجاي و الأخير هنتعرف على واحدة مخصصة Flutter بس.
Happy coding and happy deploying!