إصداراتنا كانت فوضى يدوية: كيف أنقذتنا ‘أنابيب CI/CD’ من جحيم “هل قمت بالنشر؟”

“يا فلان، أنت اللي عملت deploy آخر إشي؟”… قصة من أرشيف المعاناة

برجع بالذاكرة لسنوات مضت، كنت وقتها لا أزال في بداية طريقي في عالم البرمجة. كنا في فريق صغير نعمل على مشروع لعميل مهم. كانت الساعة قد تجاوزت منتصف الليل، والموعد النهائي للتسليم كان في صباح اليوم التالي. بعد أسابيع من العمل الشاق، كان يفترض أن نقوم بنشر آخر التحديثات على الخادم (السيرفر).

بدأ كبير المطورين، وكان وجهه شاحبًا من الإرهاق، بسرد قائمة الأوامر التي يجب تنفيذها بالترتيب. “أول إشي، اعمل git pull على السيرفر… بعدين شغل npm install… لا تنسى تعمل build للمشروع… بعدها انسخ الملفات يدويًا لمجلد الإنتاج… وأخيرًا اعمل restart للسيرفر”. كانت قائمة مهام تبدو بسيطة، لكن مع ضغط الوقت والإرهاق، كانت وصفة لكارثة.

وبالفعل، حدث ما كنا نخشاه. بعد دقائق من “النشر”، بدأ هاتف مدير المشروع بالرنين. الموقع لا يعمل! ساد الصمت في الغرفة للحظات، ثم انطلق السؤال الذي كان بمثابة إعلان حالة الطوارئ: “مين اللي رفع الكود آخر إشي؟ هل حدا نسي خطوة؟”. قضينا الساعتين التاليتين في جحيم حقيقي، نحاول أن نكتشف أين الخطأ. هل هي نسخة خاطئة من الكود؟ هل نسي أحد تشغيل أمر ما؟ هل تم نسخ الملفات إلى المكان الخطأ؟

في تلك الليلة، أدركت أن طريقتنا في العمل كانت المشكلة الحقيقية. الاعتماد على خطوات يدوية متكررة في أوقات حرجة هو ببساطة طلب للمشاكل. هذه التجربة المريرة كانت هي الشرارة التي دفعتنا للبحث عن حل، حل ينقلنا من الفوضى اليدوية إلى عالم الأتمتة المنظم. هذا الحل كان يُعرف بـ CI/CD.

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

كثيرًا ما نسمع هذه المصطلحات، وقد تبدو معقدة للوهلة الأولى. لكن دعوني أبسطها لكم كما فهمتها وتعلمتها. CI/CD هي اختصار لمفهومين يكملان بعضهما البعض: التكامل المستمر (Continuous Integration) والتسليم أو النشر المستمر (Continuous Delivery/Deployment).

ما هو التكامل المستمر (CI)؟

تخيل أن فريقك عبارة عن مجموعة من الطهاة يعملون على طبق كبير. التكامل المستمر هو الممارسة التي يقوم فيها كل طاهٍ بإضافة مكوناته (الكود) إلى الطبق الرئيسي (المستودع المركزي مثل Git) بشكل متكرر، عدة مرات في اليوم.

الأهم من ذلك، في كل مرة تتم فيها إضافة جديدة، هناك “روبوت” يقوم تلقائيًا بالمهام التالية:

  • بناء المشروع (Build): يتأكد من أن كل المكونات تعمل معًا بشكل صحيح.
  • تشغيل الاختبارات (Test): يقوم “بتذوق” الطبق ليتأكد من أن المكون الجديد لم يفسد الطعم (لم يكسر أي وظيفة موجودة).

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

وماذا عن التسليم والنشر المستمر (CD)؟

هنا يأتي الجزء الممتع. بعد أن ينجح “الروبوت” في عملية التكامل المستمر (CI)، ماذا يحدث بعد ذلك؟ لدينا خياران:

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

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

تشريح أنبوب الـ CI/CD: كيف يعمل على أرض الواقع؟

المصطلح الرسمي لهذه العملية هو “الأنبوب” أو “Pipeline”. وهو ليس إلا سلسلة من المراحل (Stages) التي يمر بها الكود الخاص بك من لحظة كتابته حتى وصوله للمستخدم.

مراحل الأنبوب النموذجي

  1. مرحلة المصدر (Source): تبدأ العملية كلها عندما يقوم مطور بدفع الكود (git push) إلى فرع معين في المستودع (مثل فرع main أو develop).
  2. مرحلة البناء (Build): يتم سحب الكود الجديد، تجميع الاعتماديات (Dependencies) مثل npm install أو pip install، وبناء نسخة قابلة للتشغيل من التطبيق.
  3. مرحلة الاختبار (Test): هذه هي بوابة الجودة. يتم هنا تشغيل جميع أنواع الاختبارات الآلية:
    • اختبارات الوحدة (Unit Tests): تختبر أجزاء صغيرة ومعزولة من الكود.
    • اختبارات التكامل (Integration Tests): تختبر كيفية عمل الأجزاء المختلفة معًا.
    • تحليل الكود الثابت (Linting): يتأكد من أن الكود يتبع معايير الجودة والأناقة المتفق عليها في الفريق.
  4. مرحلة النشر (Deploy): إذا نجحت كل المراحل السابقة، تبدأ هذه المرحلة. يمكن أن تكون بسيطة مثل نسخ الملفات إلى خادم، أو معقدة مثل بناء صورة Docker، رفعها إلى مستودع (Registry)، ثم تحديث الخدمة على منصة مثل Kubernetes.

مثال عملي: بناء أنبوب بسيط باستخدام GitHub Actions

الكلام النظري جميل، لكن دعونا نرى كيف يبدو هذا بشكل عملي. سنستخدم GitHub Actions لأنه مدمج مباشرة في GitHub ومجاني للمشاريع العامة والخاصة (بحدود معينة). لنفترض أن لدينا مشروع Node.js بسيط.

كل ما نحتاجه هو إنشاء ملف بامتداد .yml داخل مجلد .github/workflows في مشروعنا. لنسمه ci-pipeline.yml.


# .github/workflows/ci-pipeline.yml

# اسم سير العمل (الأنبوب) الذي سيظهر في واجهة GitHub
name: CI Pipeline for Node.js Project

# متى يتم تشغيل هذا الأنبوب؟
# هنا، سيتم تشغيله عند كل عملية push إلى الفرع الرئيسي (main)
on:
  push:
    branches: [ "main" ]

# الوظائف (Jobs) التي سيتم تنفيذها
jobs:
  # اسم الوظيفة، يمكن أن يكون أي اسم
  build-and-test:
    # نوع الجهاز الافتراضي الذي ستعمل عليه الوظيفة
    runs-on: ubuntu-latest

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

      # الخطوة 2: إعداد بيئة Node.js بالإصدار المطلوب
      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
          # استخدام الكاش لتسريع عمليات التثبيت المستقبلية
          cache: 'npm'

      # الخطوة 3: تثبيت الاعتماديات (مثل Express, Jest, etc.)
      - name: Install dependencies
        run: npm install

      # الخطوة 4: تشغيل الاختبارات الآلية
      - name: Run tests
        run: npm test

      # خطوة إضافية اختيارية: بناء المشروع إذا لزم الأمر
      # - name: Build project
      #   run: npm run build

بهذا الملف البسيط، في كل مرة يقوم فيها أي مطور في الفريق بدفع تحديث إلى الفرع main، سيقوم GitHub تلقائيًا بإنشاء جهاز افتراضي، سحب الكود، تثبيت كل شيء، وتشغيل الاختبارات. إذا فشل أي اختبار، سيفشل الأنبوب وسيصل إشعار فوري للمطور. لقد قضينا على “هل يعمل على جهازك؟” واستبدلناها بـ “هل نجح الأنبوب؟”.

الفوائد الحقيقية التي لمسناها بأيدينا

بعد تطبيق CI/CD، لم نعد لتلك الليالي المظلمة أبدًا. التغيير كان جذريًا ولم يقتصر على الجانب التقني فقط:

  • سرعة وثقة: أصبحنا قادرين على إصدار تحديثات وتحسينات للمستخدمين عدة مرات في اليوم الواحد بثقة تامة، بدلاً من تجميعها في إصدارات ضخمة ومخيفة كل بضعة أسابيع.
  • جودة أعلى: أجبرنا الأنبوب على كتابة اختبارات أفضل. الاختبارات لم تعد شيئًا “لطيفًا” بل أصبحت جزءًا لا يتجزأ من عملية التطوير.
  • تقليل الأخطاء البشرية: الروبوت لا ينسى. لا ينسى تشغيل الاختبارات، لا ينسى نسخ ملف، لا ينسى إعادة تشغيل الخادم. الاتساق هو سر النجاح.
  • راحة بال لا تقدر بثمن: أهم فائدة برأيي. اختفى القلق المرتبط بعملية النشر. أصبح بإمكان المطورين التركيز على الإبداع وحل المشاكل، وليس على طقوس النشر اليدوية المملة. أصبح الأمر مجرد git push، والأنبوب يتكفل بالباقي.

الخلاصة: ابدأ اليوم، لا تنتظر الكارثة! 🚀

الانتقال من الفوضى اليدوية إلى الأتمتة المنظمة عبر أنابيب CI/CD ليس ترفًا تقنيًا، بل هو ضرورة حتمية لأي فريق برمجيات حديث يطمح للنمو والجودة. قد يبدو الأمر معقدًا في البداية، لكنه استثمار سيعود عليك وعلى فريقك بفوائد لا حصر لها.

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

تذكروا دائمًا، الهدف هو أن نجعل الآلات تقوم بالعمل المتكرر والممل، حتى نتفرغ نحن البشر للإبداع والابتكار. يلا، شدّوا حيلكم وابدأوا بأتمتة أول عملية لكم!

أبو عمر

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

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

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

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

آخر المدونات

البنية التحتية وإدارة السيرفرات

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

في إحدى الليالي، بينما كان الجميع نائمين، توقف كل شيء. كانت تلك الليلة نقطة التحول التي نقلتنا من عالم إطفاء الحرائق الفوضوي إلى عالم المراقبة...

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

مراجعات الكود: كيف حولنا ساحة المعركة إلى ورشة عمل إبداعية بفضل “السلامة النفسية”؟

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

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

بنيتنا التحتية كانت بيتًا من ورق: كيف أنقذتنا ‘هندسة الفوضى’ من جحيم الأعطال المفاجئة؟

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

10 أبريل، 2026 قراءة المزيد
ذكاء اصطناعي

بحثنا كان لا يفهم المعنى: كيف أنقذتنا ‘قواعد البيانات المتجهية’ (Vector Databases) من جحيم البحث الحرفي؟

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

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

عملاؤنا المحتملون كانوا أشباحًا: كيف أنقذتنا “نمذجة الإحالة القائمة على البيانات” من جحيم تتبع الإعلانات الأعمى؟

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

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