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

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

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

أبو عمر

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

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

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

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

آخر المدونات

الشبكات والـ APIs

كانت خوادمنا تستجدي التحديثات: كيف أنقذتنا ‘خطاطيف الويب’ (Webhooks) من جحيم الاستقصاء المستمر (Polling)؟

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

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

كانت بنيتنا التحتية قصراً من رمال: كيف أنقذتنا “البنية التحتية ككود” (IaC) من جحيم البيئات المتضاربة؟

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

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

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

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

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

كانت قاعدة بياناتنا تتوسل الرحمة: كيف أنقذنا التخزين المؤقت (Caching) من جحيم الاستعلامات البطيئة

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

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

كان التحقق من هوية عملائنا يستغرق أياماً: كيف أنقذنا الذكاء الاصطناعي (eKYC) من جحيم الإجراءات اليدوية؟

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

17 مايو، 2026 قراءة المزيد
البنية التحتية وإدارة السيرفرات

كانت أعطالنا تكتشف بعد فوات الأوان: كيف أنقذنا Prometheus من جحيم المراقبة التفاعلية؟

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

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

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

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

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