من الفوضى إلى الأتمتة: كيف أنقذتني مسارات 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 لكم سيوفر عليكم مئات الساعات من العمل اليدوي والصداع في المستقبل. لا تخافوا من الأتمتة، بل اعتبروها صديقكم المخلص في رحلة تطوير البرمجيات. ابدأوا اليوم، ولو بخطوة بسيطة، وستشكرون أنفسكم لاحقاً.

أبو عمر

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

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

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

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

آخر المدونات

تجربة المستخدم والابداع البصري

كانت واجهاتنا خليطاً عجيباً: كيف أنقذتنا ‘رموز التصميم’ (Design Tokens) من فوضى التناقضات؟

أشارككم قصة من قلب المعركة البرمجية، كيف انتقلنا من فوضى الألوان والأحجام المتضاربة بين تطبيقاتنا على الويب وiOS وأندرويد، إلى نظام متناغم وموحد. الفضل يعود...

29 أبريل، 2026 قراءة المزيد
الحوسبة السحابية

كانت الأحمال المفاجئة تكسر ظهرنا: كيف أنقذتنا الحوسبة بدون خوادم (Serverless) من جحيم التوسع اليدوي؟

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

29 أبريل، 2026 قراءة المزيد
التوظيف وبناء الهوية التقنية

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

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

29 أبريل، 2026 قراءة المزيد
التوسع والأداء العالي والأحمال

كان فشل خدمة واحدة ينهار النظام بأكمله: كيف أنقذنا نمط ‘قاطع الدائرة’ من جحيم الفشل المتتالي؟

أشارككم قصة حقيقية عن ليلة كاد فيها تطبيقنا أن ينهار بالكامل بسبب فشل خدمة صغيرة. اكتشفوا كيف أنقذنا نمط تصميم "قاطع الدائرة" (Circuit Breaker) من...

29 أبريل، 2026 قراءة المزيد
التكنلوجيا المالية Fintech

من كوابيس التحقق اليدوي إلى ثورة الـ eKYC: قصتي مع إنقاذ الشركات من الاحتيال والتأخير

أتذكر جيداً أكوام الورق التي كادت أن تدفننا في أحد المشاريع الناشئة. في هذه المقالة، أشارككم قصة تحولنا من جحيم التحقق اليدوي لهوية العملاء إلى...

29 أبريل، 2026 قراءة المزيد
ادارة الفرق والتنمية البشرية

اجتماعاتنا كانت حقل ألغام: كيف أنقذتنا ‘السلامة النفسية’ من جحيم الصمت والخوف من الخطأ؟

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

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