الأسرار والبيئات والموافقات في GitHub Actions
الأسرار والبيئات والموافقات في GitHub Actions
نشر الكود في الإنتاج على نطاق واسع يعني التحكم في من يمكنه النشر، متى يُسمح للعملية بالمتابعة، وأي بيانات اعتماد يمكن لكل مرحلة في الأنبوب رؤيتها. يعالج GitHub Actions هذه المخاوف الثلاثة عبر ثلاثة مفاهيم متدرجة: الأسرار، والبيئات، وقواعد الحماية. تُعلّمك هذه الدرس كيفية تركيبها حتى يعمل أنبوبك كأنبوب مبني في شركة كبرى — مع بوابات بشرية إلزامية، ونوافذ زمنية، وقيود على الفروع، وصلاحيات حد أدنى للبيانات الاعتمادية.
الأسرار: النطاق والأولوية
لكل سر في GitHub Actions نطاق. تشكّل النطاقات هرمًا، ويُقدَّم النطاق الأكثر تحديدًا عند تعارض الأسماء:
- أسرار المنظمة — مرئية لجميع المستودعات (أو مستودعات مختارة) في المنظمة. يكفي تدوير مفتاح API جهة خارجية مرة واحدة بدلًا من 200 مستودع.
- أسرار المستودع — مقتصرة على مستودع واحد؛ مناسبة للرموز الخاصة بالمستودع كحساب خدمة Docker Hub.
- أسرار البيئة — مقتصرة على بيئة محددة (
production،staging). تُحقن فقط عندما يستهدف العمل تلك البيئة. العمل الذي يستهدفstagingلا يرى أسرارproductionأبدًا — حتى لو تشاركت البيئتان اسم سر.
AWS_ROLE_ARN ذا صلاحيات محدودة على مستوى المستودع، وآخر ذا صلاحيات عالية على مستوى بيئة production.ارجع إلى الأسرار عبر سياق secrets: ${{ secrets.MY_SECRET }}. يُخفي GitHub القيمة الحرفية في جميع مخرجات السجلات — لكن احذر من التسريب عبر Base64 أو ترميز URL (خطأ شائع). لا يمكنك استرداد قيم الأسرار عبر API؛ إن فقدت سرًا، دوّره.
البيئات: نموذج بوابة النشر
البيئة هي هدف نشر مسمّى يحمل أسراره وإعداداته المتغيرة وقواعد حمايته الخاصة. فكّر فيها على أنها حد الإنفاذ بين "الكود المدمج" و"الكود الذي يعمل في الإنتاج".
تُعلن البيئة على مستوى العمل:
حين يصل GitHub Actions إلى هذا العمل، يتوقف، يتحقق من جميع قواعد الحماية على بيئة production، ينتظر الموافقات إن كانت مطلوبة، ثم فقط يشغّل العداء ويحقن أسرار البيئة. بدون موافقة — لا سر ولا نشر.
قواعد الحماية بالتفصيل
انتقل إلى Settings → Environments → [اسم البيئة] لتهيئة القواعد. أربع قواعد أساسية في الإنتاج:
1. المراجعون المطلوبون
حدد ما يصل إلى ستة أفراد أو فرق يجب أن يوافقوا على النشر قبل المتابعة. لا يستطيع المراجع الموافقة على تشغيله الخاص — يُطبّق GitHub هذا تلقائيًا مما يمنع المهندس من تجاوز البوابة بمفرده. من الناحية العملية، اضبط هذا كفريق مناوبة أو فريق هندسة إصدار، وليس مديرًا قد يكون غائبًا.
@my-org/release-engineering) بدلًا من أفراد محددين للمراجعين المطلوبين. الفرق تتحمل تغييرات الموظفين، وأي عضو في الفريق يمكنه الموافقة — مما يمنحك تغطية دون إنشاء نقطة إخفاق واحدة.2. مؤقت الانتظار
تأخير (0–43,200 دقيقة) يُدرج قبل أن تصبح البيئة نشطة. استخدم هذا كوقت نضج إلزامي: يمكن لبيئة الاختبار استيعاب انتظار 10 دقائق بينما تعمل اختبارات الدخان تلقائيًا بعد النشر على الاختبار، قبل أن يُسمح حتى للإنتاج بالبدء. هذا ليس بديلًا عن الاختبار — بل هو دفاع متعمق.
3. فروع وعلامات النشر
حدد أي المراجع يمكنها النشر إلى هذه البيئة. الخيارات:
- جميع الفروع — بدون قيود (مناسب لـ
dev، خطير لـproduction). - الفروع المحمية فقط — فقط الفروع ذات قواعد حماية الفروع يمكنها النشر. هذا يعني ضمنيًا مراجعة طلبات السحب واجتياز فحوصات الحالة.
- فروع وعلامات مختارة — أنماط صريحة مثل
mainأوrelease/*أوv[0-9]*.[0-9]*.[0-9]*. هذا هو المعيار في الشركات الكبرى: الإنتاج يقبل فقط العلامات المطابقة لنمط semver، مما يُلزم بأن كل نشر إنتاج هو إصدار موسوم.
4. منع المراجعة الذاتية
عند التفعيل، لا يمكن للمستخدم الذي أطلق سير العمل أن يكون أحد المعتمدين. فعّل هذا بدون استثناء على بيئات الإنتاج — يُلغي أكثر تحايلات الحوكمة شيوعًا.
سير عمل كامل مع البيئات
يربط سير العمل التالي البناء ونشر الاختبار ونشر الإنتاج مع نطاق مناسب. اقرأ سلسلة needs: ينفَّذ عمل الاختبار فقط بعد نجاح الاختبارات؛ وينفَّذ عمل الإنتاج فقط بعد نجاح الاختبار وموافقة المراجع.
environment: production على أعمال البناء أو الاختبار. إن فعلت، تُطلق بوابة الموافقة قبل تشغيل الاختبارات — يوافق المراجعون على بناء قد لا يُكمل حتى، وتُحمَّل أسرار الإنتاج في عمل لا يحتاجها. إعلان البيئة ينتمي فقط إلى العمل الذي ينشر فعليًا.قواعد الحماية المخصصة للنشر (تطبيقات GitHub)
منذ 2023، يدعم GitHub قواعد الحماية المخصصة للنشر عبر تطبيقات GitHub. بدلًا من توقف GitHub وانتظار الإنسان، يستدعي webhook على تطبيقك الذي يطبق منطقه الخاص ثم يستدعي GitHub API للموافقة أو الرفض. تستخدم الفرق الكبيرة هذا لربط:
- التحقق من تذكرة لجنة مستشاري التغيير (CAB) — بدون تذكرة، لا نشر.
- فحوصات جاهزية علامات الميزات — تأكيد تعطيل العلامة قبل وصول الكود الذي يستخدمها.
- تطبيق ساعات العمل — رفض النشر تلقائيًا خارج النافذة المسموح بها، أو تصعيده إلى مراجع مناوبة.
- فحوصات صحة Canary — استعلام منصة المراقبة ورفض ترقية الإنتاج إن كانت معدلات الخطأ مرتفعة.
أوضاع الفشل الشائعة
المراجع هو من أطلق التشغيل. مع تفعيل منع المراجعة الذاتية، إن كان المراجع الوحيد المهيّأ هو المهندس الذي دفع العلامة، يتوقف النشر. اضبط دائمًا فريقًا بعضوين على الأقل، أو راجعًا احتياطيًا.
تعارض اسم السر عبر النطاقات. يضيف مطور DATABASE_URL على مستوى المستودع يشير إلى الاختبار، غير مدرك أن بيئة production لديها DATABASE_URL خاص بها. تلتقط أعمال الاختبار القيمة على مستوى المستودع بشكل صحيح. كل شيء يبدو جيدًا — حتى يحذف شخص ما سر البيئة، وفجأة يبدأ نشر الإنتاج في استخدام رابط قاعدة بيانات الاختبار. راجع وثّق هرمية الأسرار لديك.
انتهاء مهلة الموافقة. يحتفظ GitHub بالنشر المعلق لمدة 30 يومًا ثم يُنهيه. إن كان مراجعك في إجازة ولا يوجد احتياطي، تنتهي صلاحية الإصدار بصمت. اضبط تذكيرات التقويم أو إشعارات Slack لتنبيه الفريق عند انتظار نشر للموافقة.
تجاوز البوابة عبر workflow_dispatch. زناد workflow_dispatch بفرع غير موجود في قائمة الفروع المسموح بها للبيئة سيضرب قواعد الحماية رغم ذلك. لكن إن أنشأ شخص ما سير عمل بديل يتخطى عمل deploy-staging ويذهب مباشرة إلى deploy-production، تُطلق البوابة رغم ذلك — لأن قواعد الحماية هي لكل بيئة، وليس لكل ملف سير عمل. هذا هو النموذج الذهني الصحيح: البوابة على البيئة، وليس على ملف سير العمل.