4.5 · CI : بناء صورة ودفعها مع كل commit

المستوى 4 · السجلات (registres)، والموثوقية (fiabilité) و CI

4.5CI : بناء صورة ودفعها مع كل commit

الهدف: أتمتة بناء + دفع صورة مُصدَرة مع GitHub Actions.
الوقت المقدّر: 13 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 30 ثانية

  • CI هي مصنع الصور الوحيد : مع كل دفع على main، تسترجع الكود، وتتصل بالسجل وتبني + تدفع — وانتهت البناءات « باليد على الحاسوب ».
  • نُصدِر بـ SHA + إصدار : بصمة الcommit للتتبع الدقيق، والإصدار للقراءة — وينشر الإنتاج SHA أو الإصدار، وليس اسما متحركا أبدا.
  • منعكس إدير : التخزين المؤقت (cache) مفعل لبناءات سريعة، وبيانات الاعتماد في أسرار المستودع، وليست في ملف سير العمل أبدا.

حالة مصغرة متواصلة — إدير يوصّل مصنع صور فريقه

إدير، مهندس devops مبتدئ في الجزائر، سئم الصور المبنية باليد التي لا يعرف أحد محتواها : فيكتب سير عمل يتصل، مع كل دفع على main، بـ GHCR عبر رمز المستودع، ويبني مع تخزين مؤقت ويدفع الصورة مُصدَرة ببصمة الcommit. ويسحب الفريق بعدها صورة الcommit بالضبط. آخر محطة في الخيط الرابط : كل commit يعطي صورة قابلة للنشر وقابلة للتتبع، دون تدخل يدوي.

آخر حالة في الخيط 4.1-4.5 — يُغلق إدير مستواه : النشر، وجعل الموثوقية، والعرض، والنسخ، والأتمتة.

1. خط الأنابيب الأدنى الذي يغير كل شيء

مع كل دفع على main : استرجاع الكود، واتصال بالسجل (سر المستودع)، وبناء + دفع مُصدَرين. ولا بناء بعد « باليد على الحاسوب » : CI هي المصنع الوحيد للصور — مثل مصنع إدير، لكل صورة أصل معروف.

ولا نُصدِر إلا الأخضر : فمهمة اختبارات قبل البناء تتفادى دفع صور مكسورة.

2. التصدير بذكاء في CI

ندفع بصمة الcommit (تتبع دقيق : هذه الصورة = هذا الكود) + الإصدار (مقروء، على وسم git) + اسما مستعارا للفرع في التطوير. وفي الإنتاج ننشر البصمة أو الإصدار، وليس اسما متحركا أبدا — فيستطيع إدير إعادة نشر الcommit المعتمَد بالضبط.

ودفع الاسم المتحرك وحده عودة إلى عدم التتبع : فيجب أن ينتج خط الأنابيب دائما وسما دقيقا واحدا على الأقل.

3. التخزين المؤقت والأسرار : الضبطان

يعيد التخزين المؤقت (cache) استعمال الطبقات بين التشغيلات ويقسم أزمنة البناء. وتعيش بيانات الاعتماد في أسرار المستودع، وليست في ملف سير العمل أبدا. وخط أنابيب يعرض سرا في السجلات خط يُصحح باستعجال — ثم نبطل السر المكشوف.

صلاحية دنيا : لا تتلقى المهمة إلا الصلاحيات التي تحتاجها (كتابة الحزم، ولا شيء أكثر).

خطأ شائع في الفهم: « البناء محليا ثم الدفع سريعا، والتصدير بالاسم المتحرك فقط ووضع الرمز في الملف : أسرع ». لا. فالبناء المحلي غير قابل لإعادة الإنتاج، والاسم المتحرك وحده غير قابل للتتبع في الإنتاج، والرمز بالنص الصريح في الملف يتسرب من أول مشاركة. CI مصنعا وحيدا، ووسم دقيق منهجي، وأسرار خارج الملف : هذا الثلاثي هو ما يصنع مصنعا موثوقا.
مصنع الصور Commit، وبناء مخزن، ودفع مُصدَر دفع على main اختباراتثم بناءاتصال بالسجل سرالمستودعبناء + تخزين مؤقت طبقاتمعاد استعمالهادفع مُصدَر دقيق بصمة+ إصدار
Commit، وبناء مخزن، ودفع مُصدَر
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) يكتب إدير سير عمل يُطلَق مع كل دفع على main، مع مهمة اختبارات قبل البناء. 2) يتصل سير العمل بـ GHCR عبر الرمز المخزن في سر المستودع، بصلاحيات دنيا. 3) يبني مع تخزين مؤقت ويدفع الصورة مُصدَرة ببصمة الcommit (زائد الإصدار على وسم git). 4) ينشر الفريق البصمة بالضبط، وليس الاسم المتحرك أبدا. الدرس : CI تبني وتدفع، والوسم الدقيق يتتبع، والأسرار تبقى خارج الملف.

🔎 مثال ملموس — 🔎 مثال ملموس — سير عمل GitHub Actions أدنى

مصنع إدير : اتصال برمز المستودع، وبناء + دفع البصمة.

name: image
on:
  push:
    branches: [main]
jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      packages: write
    steps:
      - uses: actions/checkout@v4
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/build-push-action@v6
        with:
          push: true
          tags: ghcr.io/monequipe/app:${{ github.sha }}

القراءة : اتصال برمز تلقائي، وبناء + دفع بصمة الcommit.

الدرس : كل commit يعطي صورة قابلة للنشر وقابلة للتتبع.

مفردات القسم

خط الأنابيب (Pipeline)
السلسلة المؤتمتة : اختبار، ثم بناء، ثم دفع (ثم نشر).

مثال بسيط: مع كل دفع، يختبر مصنع إدير ويبني ويدفع دون تدخل.

ما ليس كذلك: أوامر تُكتَب باليد على حاسوب.

رد فعل: لتكرار بناء باليد : اكتبوه خط أنابيب.

SHA
بصمة الcommit : وسم تتبع دقيق (هذه الصورة = هذا الكود).

مثال بسيط: يعيد إدير نشر صورة الcommit المعتمَد بالضبط.

ما ليس كذلك: اسم متحرك يتغير محتواه.

رد فعل: في الإنتاج : انشروا بصمة أو إصدارا، وليس اسما أبدا.

سر CI
متغير حساس مخزن في المستودع، محجوب عن السجلات ولا يُكتَب في الملف أبدا.

مثال بسيط: يعيش رمز سجل إدير في سر، وليس في سير العمل.

ما ليس كذلك: كلمة مرور ملصقة بالنص الصريح في الملف.

رد فعل: لبيان اعتماد في CI : سر المستودع، دائما.

مصنع وحيد
CI وحدها تنتج الصور المنشورة : أصل معروف، وبناءات قابلة لإعادة الإنتاج.

مثال بسيط: لا ينشر فريق إدير إلا صورا خرجت من خط الأنابيب.

ما ليس كذلك: صور مدفوعة « سريعا » من حاسوب.

رد فعل: لصورة يُجهَل أصلها : امنعوا، ومرروا عبر CI.

في التطبيق — عمليا — مصنعكم الأول

  1. أنشئوا سير العمل أعلاه في .github/workflows/image.yml.
  2. ادفعوا على main وتابعوا التشغيل (أخضر ؟).
  3. تحققوا من الصورة المُصدَرة في حزم السجل.
  4. اسحبوها وشغلوها : الcommit يدور.
ينتج كل commit صورة قابلة للتتبع، دون تدخل يدوي.

نص جاهز للقول — إعلان المصنع للفريق (30 ثانية)

« معكم إدير : مع كل دفع على main، تختبر CI وتبني مع تخزين مؤقت وتدفع الصورة مُصدَرة ببصمة الcommit. ويبقى الرمز في سر المستودع، وليس في الملف أبدا. وننشر البصمة بالضبط : انتهت الصور التي لا يعرف أحد محتواها. »

يُقال في المراجعة : اعرضوا التشغيل الأخضر وصورة الcommit في السجل.

نموذج للنسخ واللصق — سير عمل بناء + دفع (عام، صالح)

name: image
on:
  push:
    branches: [main]
jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read
    steps:
      - uses: actions/checkout@v4
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: ghcr.io/monequipe/app:${{ github.sha }}

إصدار مقروء زيادة

مثل إدير : بصمة الcommit + إصدار على وسم git — تتبع دقيق وقراءة بشرية.

بناءات بطيئة جدا

فعلوا التخزين المؤقت بين التشغيلات : تُعاد الطبقات غير المتغيرة، وتُقسَّم البناءات.

صورة مكسورة مدفوعة

أضيفوا مهمة الاختبارات قبل البناء : لا نُصدِر إلا الأخضر.

سر معروض في سجل

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

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

✓ ممارسات جيدة

  • وسم دقيق منهجي + إصدار على وسم git.
  • تفعيل التخزين المؤقت للبناءات.
  • أسرار في أسرار المستودع، وليست بالنص الصريح أبدا.

✗ أخطاء شائعة

  • البناء محليا ثم الدفع « سريعا ».
  • دفع الاسم المتحرك فقط (غير قابل للتتبع).
  • عرض سر في echo تنقيح.

النقاط الأساسية

  • CI تبني + تدفع، وليس الحاسوب.
  • البصمة = تتبع، والإصدار = قراءة.
  • التخزين المؤقت = بناءات سريعة.
  • أسرار خارج سير العمل، دائما.

تحدي 48 ساعة — طبّق غدا

على مستودع حقيقي : أنشئوا سير العمل، وادفعوا على main، وتحققوا من الصورة المُصدَرة في السجل ثم شغلوها.

قائمة الخروج من القسم
  • أستطيع كتابة سير عمل بناء + دفع يُطلَق على main.
  • أستطيع تصدير البصمة + الإصدار ونشر الدقيق.
  • أستطيع تدبير الأسرار والتخزين المؤقت والصلاحيات الدنيا.
تقييم ذاتي 1-5 : هل أستطيع قول أي commit أنتج صورة الإنتاج ؟هل يكشف سير عملي سرا في مكان ما ؟

أسئلة شائعة

هل نختبر قبل البناء ؟

نعم : فمهمة اختبارات قبل البناء تتفادى دفع صور مكسورة. ولا نُصدِر إلا الأخضر.

والنشر التلقائي ؟

خطوة تالية : أولا مصنع موثوق (بناء + دفع قابلان للتتبع)، ثم التسليم. ودون مصنع موثوق، لا تفعل أتمتة النشر إلا تسريع الأخطاء.

تحقّق من فهمك

في CI، أي وسم ننشر في الإنتاج ؟

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 4أسئلة جديدة وأصعب للتحقق من مكتسباتك