4.5CI : بناء صورة ودفعها مع كل commit
الأساسي في 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) استعمال الطبقات بين التشغيلات ويقسم أزمنة البناء. وتعيش بيانات الاعتماد في أسرار المستودع، وليست في ملف سير العمل أبدا. وخط أنابيب يعرض سرا في السجلات خط يُصحح باستعجال — ثم نبطل السر المكشوف.
صلاحية دنيا : لا تتلقى المهمة إلا الصلاحيات التي تحتاجها (كتابة الحزم، ولا شيء أكثر).
🔎 مثال ملموس — 🔎 مثال ملموس — سير عمل 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.
في التطبيق — عمليا — مصنعكم الأول
- أنشئوا سير العمل أعلاه في .github/workflows/image.yml.
- ادفعوا على main وتابعوا التشغيل (أخضر ؟).
- تحققوا من الصورة المُصدَرة في حزم السجل.
- اسحبوها وشغلوها : ال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 — تتبع دقيق وقراءة بشرية.
بناءات بطيئة جدا
فعلوا التخزين المؤقت بين التشغيلات : تُعاد الطبقات غير المتغيرة، وتُقسَّم البناءات.
صورة مكسورة مدفوعة
أضيفوا مهمة الاختبارات قبل البناء : لا نُصدِر إلا الأخضر.
سر معروض في سجل
صححوا باستعجال، وأزيلوا كل عرض تنقيح، ثم أبطلوا السر المكشوف واستبدلوه.
✓ ممارسات جيدة
- وسم دقيق منهجي + إصدار على وسم git.
- تفعيل التخزين المؤقت للبناءات.
- أسرار في أسرار المستودع، وليست بالنص الصريح أبدا.
✗ أخطاء شائعة
- البناء محليا ثم الدفع « سريعا ».
- دفع الاسم المتحرك فقط (غير قابل للتتبع).
- عرض سر في echo تنقيح.
النقاط الأساسية
- CI تبني + تدفع، وليس الحاسوب.
- البصمة = تتبع، والإصدار = قراءة.
- التخزين المؤقت = بناءات سريعة.
- أسرار خارج سير العمل، دائما.
تحدي 48 ساعة — طبّق غدا
على مستودع حقيقي : أنشئوا سير العمل، وادفعوا على main، وتحققوا من الصورة المُصدَرة في السجل ثم شغلوها.
- أستطيع كتابة سير عمل بناء + دفع يُطلَق على main.
- أستطيع تصدير البصمة + الإصدار ونشر الدقيق.
- أستطيع تدبير الأسرار والتخزين المؤقت والصلاحيات الدنيا.
أسئلة شائعة
هل نختبر قبل البناء ؟
نعم : فمهمة اختبارات قبل البناء تتفادى دفع صور مكسورة. ولا نُصدِر إلا الأخضر.
والنشر التلقائي ؟
خطوة تالية : أولا مصنع موثوق (بناء + دفع قابلان للتتبع)، ثم التسليم. ودون مصنع موثوق، لا تفعل أتمتة النشر إلا تسريع الأخطاء.
في CI، أي وسم ننشر في الإنتاج ؟