CI/CD هو العمود الفقري التقني لـ DevOps. مجموعة الممارسات التي تؤتمت المسار بين «الشفرة التي كتبها مطوّر» و«التطبيق الذي يعمل في الإنتاج».
| الاختصار | الاسم | في جملة واحدة |
|---|---|---|
| CI | التكامل المستمر (Continuous Integration) | ندمج الشفرة ونختبرها مراراً وتلقائياً. |
| CD | التسليم المستمر (Continuous Delivery) | الشفرة المختبَرة دائماً جاهزة للنشر (وضع الإنتاج يدوي). |
| CD | النشر المستمر (Continuous Deployment) | الشفرة المختبَرة تذهب تلقائياً إلى الإنتاج. |
بلا CI/CD، تسليم برمجيات يشبه الانتقال يدوياً: بطيء، ومرهق، وخطر. مع CI/CD، هو سير ناقل آلي: تضع الشفرة في طرف، والتطبيق يصل جاهزاً في الطرف الآخر.
تمرين مصغّر — اربط كل اختصار بتعريفه: (1) CI، (2) Continuous Delivery، (3) Continuous Deployment.
(1) CI = دمج + بناء + اختبارات آلية متكررة. (2) Continuous Delivery = دائماً جاهز للنشر، زر يدوي للإنتاج. (3) Continuous Deployment = وضع الإنتاج تلقائي بعد نجاح الاختبارات.
التكامل المستمر هو الدمج المتكرر لشفرة جميع المطوّرين في فرع مشترك، والتحقق التلقائي من كل دمج عبر بناء واختبارات.
| بلا CI | مع CI |
|---|---|
| ندمج الكل في نهاية الشهر ← تعارضات كبيرة مؤلمة | ندمج عدة مرات في اليوم ← تعارضات صغيرة سهلة |
| تُكتشَف الأخطاء متأخراً | تُكتشَف الأخطاء خلال دقائق |
| «كان يعمل على جهازي» | بناء قابل لإعادة الإنتاج على الخادم |
تشبيه: ترتيب المطبخ أولاً بأول (CI) بدل انتظار أن يتسخ كل شيء (تكامل «انفجار كبير»). الجهد الصغير المتكرر يتجنّب الكارثة النادرة.
تمرين مصغّر — مطوّر يحتفظ بشفرته 3 أسابيع دون دمج، ثم يحاول دمجاً كبيراً. أي مبدأ تكامل مستمر لم يحترمه، وما النتيجة المحتملة؟
لم يدمج مراراً. النتيجة المحتملة: تعارض دمج ضخم وصعب الحل، وأخطاء تُكتشَف متأخراً جداً. توصي CI بدمج صغير متكرر.
يشبه «CD» أحدهما الآخر ويختلفان في نقطة واحدة: من يضغط زر وضع الإنتاج.
| Continuous Delivery | Continuous Deployment | |
|---|---|---|
| وضع الإنتاج | يدوي (إنسان ينقر) | تلقائي |
| الرقابة | قرار بشري نهائي | بلا تدخل |
| مثالي لـ | قطاعات منظَّمة، إصدارات مخطَّطة | فرق ناضجة، تغطية اختبارات قوية |
Continuous Delivery = السيارة مركونة أمام الباب، جاهزة، المفاتيح في الكونتاكت؛ أنت تقرر متى تنطلق. Continuous Deployment = السيارة الذاتية تنطلق وحدها ما إن تصبح جاهزة.
تمرين مصغّر — بنك يريد أن يوافق مسؤول على كل وضع إنتاج. أي «CD» يختار؟
Continuous Delivery: يجعل خط الأنابيب الإصدار جاهزاً تلقائياً، لكن وضع الإنتاج يبقى قراراً بشرياً (موافقة المسؤول).
خط الأنابيب (pipeline) سلسلة مراحل آلية تُسمّى stages تحوّل شفرة المصدر إلى تطبيق منشور. إذا فشلت مرحلة، يتوقف الخط ويُبلَّغ الفريق.
| المرحلة | الدور | مثال أداة |
|---|---|---|
| Checkout | استرجاع الشفرة من Git | Git |
| Build | التجميع / التركيب | Maven، npm، javac |
| Test | التحقق الآلي | JUnit، pytest |
| Package | إنتاج أثر قابل للتسليم | .jar، صورة Docker |
| Staging | النشر في ما قبل الإنتاج | خادم اختبار |
| Deploy | الوضع في الإنتاج | خادم / سحابة |
مبدأ «fail fast»: نضع المراحل السريعة والرخيصة (تجميع، اختبارات وحدية) أولاً. لا فائدة من النشر إن كانت الشفرة لا تُجمَع أصلاً.
تمرين مصغّر — بأي ترتيب تضع هذه المراحل: Deploy، Build، Test، Checkout؟
Checkout → Build → Test → Deploy. نسترجع الشفرة، نجمّعها، نختبرها، ولا ننشر إلا إذا كان كل شيء أخضر.
نتابع مسار سطر شفرة واحد صحّحته مطوّرة، ليلى، في تطبيق ويب.
التسلسل خطوة بخطوة:
git push.v1.4.1.قارن: قبل CI/CD، كان التصحيح نفسه يتطلب وضع إنتاج مخطَّطاً، مساءً، يدوياً، مع توتر «ليته يعمل». هنا روتين بست دقائق.
تمرين مصغّر — في الخطوة 3، يفشل اختباران من 124. ماذا يفعل خط الأنابيب، وهل يذهب الإصدار إلى الإنتاج؟
يتوقف خط الأنابيب عند مرحلة Test، ويبلّغ ليلى، ولا ينشر. يبقى الإنتاج على الإصدار المستقر السابق. هذا مبدأ «fail fast» الذي يحمي الإنتاج.
| الفائدة | ما الذي يتغيّر عملياً |
|---|---|
| أخطاء بشرية أقل | المهام المتكررة مكتوبة سكربتات: لا نسيان لمرحلة |
| تغذية راجعة سريعة | نعلم خلال دقائق إن كان تغيير يكسر شيئاً |
| نشر متكرر | يمكن التسليم عدة مرات في اليوم بثقة |
| قابلية إعادة الإنتاج | كل بناء مطابق — انتهى «يعمل على جهازي» |
| قابلية التتبع | كل تغيير مسجَّل: من، ماذا، متى |
كلما نشرنا أكثر، صار كل نشر أصغر، إذن أقل مخاطرة. هذا عكس الحدس: النشر الأكثر تكراراً يجعل النشر أكثر أماناً، لا أخطر.
تمرين مصغّر — اذكر سببين يجعلان نشر 10 مرات في اليوم لتغييرات صغيرة أقل مخاطرة من نشر كبير واحد في الشهر.
السؤال 1: ماذا يعني « CI »؟
a) Code Inspection
b) Continuous Integration
c) Container Initialization
d) Central Infrastructure
الإجابة: b) — Continuous Integration: دمج وتحقق آلي متكرر للشفرة.
السؤال 2: ما الفرق بين Continuous Delivery و Continuous Deployment؟
a) لا فرق، هما مترادفان
b) في Delivery وضع الإنتاج يدوي؛ في Deployment تلقائي
c) Deployment لا يجري اختبارات
d) Delivery ينشر تلقائياً
الإجابة: b) — كلاهما يجهّز إصداراً جاهزاً؛ وحده وضع الإنتاج يختلف (يدوي مقابل تلقائي).
السؤال 3: ماذا يحدث إذا فشلت مرحلة Test في خط أنابيب؟
a) يستمر الخط رغم ذلك حتى الإنتاج
b) يتوقف الخط ويُبلَّغ الفريق
c) تُحذف الشفرة من المستودع
d) يعيد الخط البدء بلا نهاية
الإجابة: b) — مبدأ «fail fast»: الفشل يوقف الخط ويطلق تنبيهاً؛ لا شيء يذهب إلى الإنتاج.
السؤال 4: ما الأثر (artefact) في خط أنابيب؟
a) خطأ أُدخل بالخطأ
b) نتيجة البناء المغلفة (مثال .jar، صورة)
c) رسالة في السجلات
d) مستخدم للنظام
الإجابة: b) — الأثر هو المخرج الذي ينتجه البناء، جاهز للنشر.
السؤال 5: لماذا يجعل النشر المتكرر عمليات النشر أكثر أماناً؟
a) لأن كل نشر أصغر، إذن أسهل تشخيصاً وإلغاءً
b) لأننا نحذف الاختبارات
c) لأن الخوادم تصبح أقوى
d) لأن المستخدمين لا يلاحظون
الإجابة: a) — تغييرات صغيرة متكررة تقلّل سطح المخاطرة وتسهّل التراجع.
فريق يطوّر تطبيقاً بلغة Java. صمّم (على الورق / بخط أنابيب شبه رمزي) مراحل خط أنابيب CI/CD لهذا التطبيق، مبيناً لكل مرحلة: اسمها، ودورها، وما الذي يجب أن يوقف الخط. حدّد أيضاً إن كنت توصي بـ Continuous Delivery أو Continuous Deployment، ولماذا.
| الترتيب | المرحلة | الدور | شرط التوقف |
|---|---|---|---|
| 1 | Checkout | استرجاع الشفرة من Git | المستودع غير متاح |
| 2 | Build | التجميع بـ Maven (mvn package) | خطأ تجميع |
| 3 | Test | تشغيل اختبارات JUnit | فشل اختبار |
| 4 | Package | إنتاج أثر .jar / صورة | فشل التغليف |
| 5 | Staging | النشر في ما قبل الإنتاج | فشل بدء التطبيق |
| 6 | Deploy | الوضع في الإنتاج | رفض التحقق اليدوي |
الخيار الموصى به للبداية: Continuous Delivery.
التبرير: ما دامت تغطية الاختبارات غير ناضجة، نبقي تحققاً بشرياً قبل الإنتاج (Delivery). عندما يثق الفريق باختباراته الآلية، يمكن الانتقال إلى Continuous Deployment (وضع إنتاج تلقائي).
المخطط المتوقع:
الدرس 05 — Git: التثبيت والإعداد: تثبيت Git وإعداده على جهازك قبل أول مستودع.
جميع الحقوق محفوظة. يُحظَر نسخ هذه الدورة أو نشرها أو استخدامها أو تكييفها، كلياً أو جزئياً، دون إذن كتابي مسبق من الدكتور هيثم رحومة.
دورة من إعداد الدكتور هيثم رحومة — تطوير ونشر حلول البيانات