من الفوضى إلى الأتمتة: كيف أنقذتني مسارات CI/CD من جحيم النشر اليدوي؟

ليلة لا يعلم بها إلا ربنا..

يا جماعة، خليني أحكيلكم قصة صارت معي زمان، في بداياتي قبل ما يصير كل إشي مؤتمت وحلو زي اليوم. كنا شغالين على مشروع كبير لعميل مهم، تطبيق ويب معقد شوي. وصلنا لمرحلة إطلاق نسخة جديدة فيها ميزات كان العميل مستنيها على نار. الساعة كانت حوالي 11 بالليل، وأنا وفريقي الصغير سهرانين على مكاتبنا، وريحة القهوة معبية الغرفة، والتوتر سيد الموقف.

بدأنا عملية النشر اليدوية، اللي كانت عبارة عن قائمة خطوات طويلة ومعقدة مكتوبة على ملف “instructions.txt”. كانت العملية كالتالي: ادخل على السيرفر عن طريق SSH، اسحب آخر نسخة من الكود من Git، وقّف السيرفر القديم، اعمل build للمشروع، انقل الملفات للمجلد الصحيح، شغل السيرفر الجديد، وبعدين ادعي ربنا إنه كل شي يشتغل صح.

في تلك الليلة، وبعد ما مشينا على كل الخطوات بحذر شديد، وضغطنا “Enter” لتشغيل السيرفر الجديد… الموقع وقع! شاشة بيضاء ورسالة خطأ “500 Internal Server Error”. بدأ العرق يتصبب منا، والعميل بلّش يبعت رسايل. حاولنا نرجع للنسخة القديمة بسرعة، بس لخبطنا بالخطوات من كثر العجقة والتوتر، فصار الوضع أسوأ.

بعد ساعتين من البحث والتدقيق، اكتشفنا المصيبة: زميلنا نسي يرفع ملف إعدادات البيئة (environment file) الجديد على السيرفر، وملف تاني كان فيه تعديل بسيط ما انعمل له build صح. خطأين بسيطين كلفونا سمعتنا مع العميل، وساعات من الضغط النفسي اللي ما له داعي. يومها، بعد ما حلينا المشكلة ورجع الموقع يشتغل الساعة 3 الفجر، أقسمت إني ما راح أكرر هالكابوس مرة ثانية. ومن هنا بدأت رحلتي مع ما يسمى بـ “CI/CD”.

ما هي حكاية الـ CI/CD هذه؟

ببساطة شديدة، تخيلوا الـ CI/CD زي خط تجميع في مصنع سيارات. بدل ما كل عامل يشتغل على قطعة لحاله وآخر إشي يجمعوها وممكن ما تركب صح، خط التجميع بيضمن إنه كل قطعة بتتركب في مكانها الصحيح وبشكل تلقائي وسريع، وفي كل مرحلة بيتم فحص الجودة. هذا بالضبط ما يفعله الـ CI/CD للكود تبعنا.

الاسم هو اختصار لمصطلحين رئيسيين:

  • التكامل المستمر (Continuous Integration – CI): هذا هو الجزء الأول من خط التجميع.
  • النشر المستمر أو التسليم المستمر (Continuous Deployment/Delivery – CD): هذا هو الجزء الأخير اللي بيسلّم المنتج النهائي.

الجزء الأول: التكامل المستمر (CI) – وداعاً لأخطاء الدمج

التكامل المستمر هو عملية أتمتة دمج التغييرات البرمجية من عدة مطورين في مستودع مركزي واحد. كل ما مطور يعمل “push” للكود تبعه، بشتغل “روبوت” (الـ CI server) بشكل تلقائي وبيعمل الآتي:

  1. بناء المشروع (Build): بيتأكد إنه الكود الجديد ما كسر عملية البناء الأساسية.
  2. تشغيل الاختبارات (Tests): بيشغّل كل الاختبارات التلقائية (Unit Tests, Integration Tests) عشان يتأكد إنه الميزات الجديدة ما خربت إشي قديم.
  3. إصدار تقرير (Report): لو كل شي تمام، بيعطي ضوء أخضر. لو في مشكلة، بيرسل تنبيه فوري للفريق مع تفاصيل الخطأ.

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

نصيحة من أبو عمر: القاعدة الذهبية عندي في الفريق: “ممنوع تعمل merge لأي فرع على الـ main branch إذا ما نجح في كل اختبارات الـ CI”. هذه القاعدة وحدها بتحميك من 90% من المشاكل اللي ممكن تصير في بيئة الإنتاج (Production).

الجزء الثاني: التسليم/النشر المستمر (CD) – جسر الأمان إلى المستخدم

بعد ما نتأكد من سلامة الكود تبعنا عن طريق الـ CI، بيجي دور الـ CD. وهنا في نوعين لازم نميز بينهم:

  • التسليم المستمر (Continuous Delivery): بعد نجاح مرحلة الـ CI، يتم نشر الكود تلقائياً على بيئة شبيهة ببيئة الإنتاج (مثل Staging). هنا، بكون كل شي جاهز للنشر النهائي بضغطة زر واحدة. القرار الأخير بكون يدوي، وهذا بيعطي فرصة للفحص البشري الأخير أو انتظار وقت معين للإطلاق.
  • النشر المستمر (Continuous Deployment): هذه هي المرحلة الأكثر تقدماً. إذا نجح الكود في كل مراحل الـ CI والاختبارات في بيئة الـ Staging، يتم نشره تلقائياً على بيئة الإنتاج (Production) بدون أي تدخل بشري. هذا الأسلوب يتطلب ثقة عالية جداً في جودة الاختبارات المكتوبة.

باختصار، الـ CD هو اللي أخذ مني مهمة الدخول على السيرفر يدوياً ونقل الملفات. صار كل شي مؤتمت، موثوق، وسريع.

كيف نبدأ رحلتنا مع CI/CD؟ (مثال عملي)

الكلام النظري جميل، بس “الشغل المرتب” بيظهر بالتطبيق. خلينا نأخذ مثال بسيط جداً باستخدام أداة مشهورة ومجانية لمعظم المشاريع مفتوحة المصدر: GitHub Actions.

لنفترض أن لدينا مشروع Node.js بسيط. كل ما نريده هو أنه عند كل عملية `push` على الفرع `main`، يقوم GitHub بتشغيل الاختبارات تلقائياً.

الخطوة الأولى: إنشاء ملف الـ Workflow

داخل مشروعك، قم بإنشاء مجلد جديد اسمه .github وبداخله مجلد آخر اسمه workflows. ثم قم بإنشاء ملف بامتداد .yml، مثلاً ci.yml.

المسار سيكون: .github/workflows/ci.yml

الخطوة الثانية: كتابة الـ “بايبلاين” (Pipeline)

افتح ملف ci.yml والصق الكود التالي:


# اسم الـ workflow الذي سيظهر في تبويب Actions في GitHub
name: Node.js CI

# متى يتم تشغيل هذا الـ workflow؟
on:
  # عند أي عملية push على الفرع main
  push:
    branches: [ "main" ]
  # وعند أي pull request يستهدف الفرع main
  pull_request:
    branches: [ "main" ]

# المهام (Jobs) التي سيتم تنفيذها
jobs:
  # يمكن أن يكون لدينا أكثر من job، هنا لدينا واحد فقط اسمه build
  build:
    # نوع النظام الذي ستعمل عليه المهمة
    runs-on: ubuntu-latest

    # الخطوات (Steps) التي سيتم تنفيذها بالترتيب
    steps:
      # الخطوة 1: سحب الكود من المستودع إلى بيئة العمل
      - uses: actions/checkout@v3

      # الخطوة 2: إعداد بيئة Node.js بالإصدار 18
      - name: Use Node.js 18.x
        uses: actions/setup-node@v3
        with:
          node-version: 18.x
          cache: 'npm' # لتسريع عملية تحميل الحزم في المرات القادمة

      # الخطوة 3: تحميل الاعتماديات (dependencies) الخاصة بالمشروع
      - name: Install dependencies
        run: npm install

      # الخطوة 4: تشغيل الاختبارات (أهم خطوة في الـ CI)
      - name: Run tests
        run: npm test

هذا كل شيء! الآن، بمجرد حفظ هذا الملف ورفعه إلى GitHub، ستبدأ GitHub Actions تلقائياً بتنفيذ هذه الخطوات مع كل تغيير على الكود. ستظهر لك علامة صح خضراء ✅ بجانب الـ commit إذا نجحت كل الخطوات، أو علامة خطأ حمراء ❌ إذا فشلت أي خطوة.

نصائح من خبرة أبو عمر

بعد سنوات من العمل مع CI/CD، هذه بعض الدروس اللي تعلمتها بالطريقة الصعبة أحياناً:

  • ابدأ صغيراً: لا تحاول أتمتة كل شيء من اليوم الأول. ابدأ بأتمتة الاختبارات (CI). عندما تتقنها، انتقل إلى أتمتة النشر على بيئة تجريبية، ثم إلى بيئة الإنتاج.
  • الاختبارات هي العمود الفقري: الـ CI/CD بدون اختبارات جيدة هو مجرد أتمتة لنشر الأخطاء بشكل أسرع. استثمر وقتك في كتابة اختبارات شاملة وموثوقة.
  • اجعل الـ Pipeline سريعاً: إذا كان الـ pipeline يأخذ 30 دقيقة ليعمل، سيتوقف المطورون عن استخدامه بفعالية. حاول تحسين سرعته عن طريق التخزين المؤقت (caching) وتشغيل المهام على التوازي.
  • راقب كل شيء: تأكد من وجود تنبيهات فورية عند فشل أي مرحلة من مراحل الـ pipeline. الفشل يجب أن يكون حدثاً استثنائياً وليس روتيناً.
  • لا تضع الأسرار في الكود: استخدم مدير الأسرار (Secrets Manager) المدمج في أدوات الـ CI/CD (مثل GitHub Secrets) لتخزين مفاتيح الـ API وكلمات المرور. لا تكتبها أبداً بشكل مباشر في ملفات الـ YAML.

الخلاصة: من الكابوس إلى الحلم 🚀

التحول من النشر اليدوي المليء بالتوتر إلى عالم الـ CI/CD المؤتمت كان أحد أفضل القرارات المهنية التي اتخذتها. لم يقتصر الأمر على تقليل الأخطاء والتأخير، بل حررني أنا وفريقي من الأعمال الروتينية المملة، وأعطانا المزيد من الوقت للتركيز على ما نحب فعلاً: كتابة كود رائع وحل مشاكل حقيقية.

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

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

التوسع والأداء العالي والأحمال

قاعدة بياناتي كانت على وشك الانهيار: كيف أنقذني ‘التخزين المؤقت’ (Caching) من جحيم الاستعلامات المتكررة؟

أشارككم قصة حقيقية عن يوم كادت فيه قاعدة بياناتي أن تنهار تحت ضغط الاستعلامات المتكررة. سأشرح لكم بالتفصيل كيف كان "التخزين المؤقت" (Caching) هو طوق...

30 مارس، 2026 قراءة المزيد
التكنلوجيا المالية Fintech

معاملاتي كانت هدفًا سهلاً للمحتالين: كيف أنقذني التعلم الآلي لكشف الاحتيال من جحيم الخسائر المالية؟

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

30 مارس، 2026 قراءة المزيد
اختبارات الاداء والجودة

اختباراتي كانت تمر، لكن الكود كان هشًا: كيف أنقذني ‘الاختبار الطفري’ (Mutation Testing) من جحيم الثقة الزائفة؟

كنت أظن أن تغطية الاختبارات بنسبة 100% هي درع الأمان لكودي، إلى أن كشف لي "الاختبار الطفري" (Mutation Testing) عن هشاشة هذه الثقة. في هذه...

30 مارس، 2026 قراءة المزيد
أدوات وانتاجية

كنت أقضي ساعاتي في كتابة الكود المتكرر: كيف أنقذني ‘المبرمج الزوجي الاصطناعي’ من جحيم إعادة اختراع العجلة؟

أشارككم تجربتي كـ "أبو عمر"، مبرمج فلسطيني، وكيف حولت أدوات الذكاء الاصطناعي مثل GitHub Copilot طريقة عملي. اكتشفوا كيف تخلصت من الكود المتكرر وزدت إنتاجيتي...

30 مارس، 2026 قراءة المزيد
نصائح برمجية

الكود الخاص بي كان هرمًا: كيف أنقذتني ‘شروط الحماية’ (Guard Clauses) من جحيم الكود السهمي؟

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

30 مارس، 2026 قراءة المزيد
​معمارية البرمجيات

تطبيقي المونوليثي كان وحشًا: كيف أنقذني نمط ‘التين الخانق’ (Strangler Fig) من جحيم التحديث المستحيل؟

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

30 مارس، 2026 قراءة المزيد
خوارزميات

بحثي كان يقرأ كل سطر: كيف أنقذتني خوارزمية ‘البحث الثنائي’ (Binary Search) من جحيم الانتظار الطويل؟

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

30 مارس، 2026 قراءة المزيد
تسويق رقمي

ميزانيتي التسويقية كانت ثقبًا أسود: كيف أنقذني ‘نموذج الإحالة’ (Attribution Model) من جحيم الإنفاق الأعمى؟

بصفتي أبو عمر، مطور برمجيات فلسطيني، أحكي لكم كيف تحولت ميزانيتي التسويقية من حفرة لا قرار لها إلى أداة دقيقة تحقق الأرباح. اكتشفوا معي عالم...

30 مارس، 2026 قراءة المزيد
تجربة المستخدم والابداع البصري

واجهاتي كانت فوضى من الألوان والأزرار: كيف أنقذني ‘نظام التصميم’ (Design System) من جحيم التناقض البصري؟

أشارككم تجربتي كـ "أبو عمر"، مبرمج فلسطيني، مع الفوضى البصرية في المشاريع وكيف كان "نظام التصميم" (Design System) هو طوق النجاة. سنتعلم معاً ما هو...

30 مارس، 2026 قراءة المزيد
البودكاست