ترقية البيئات
ترقية البيئات
ترقية البيئات هي عملية نقل منضبطة لأرتيفاكت تم التحقق منه — صورة حاوية عند digest محدد — من بيئة ذات ثقة منخفضة (dev) عبر بيئة staging وأخيراً إلى الإنتاج، مع commit في Git كسجل تدقيق غير قابل للتغيير في كل خطوة. في GitOps، الترقية ليست زراً في واجهة مستخدم أو علماً في سكريبت Shell. إنها تغيير متعمد للحالة المطلوبة المخزّنة في Git. هذا التمييز هو جوهر المسألة بأكملها.
نموذج الترقية المستخدم في شركات مثل Shopify وStripe وWeaveworks يعامل البيئات كمجلدات منفصلة (أو فروع) في مستودع الإعدادات، يُصالَح كل منها بشكل مستقل. لا تُرقّي "كوداً" أبداً — بل تُرقّي عنوان image أو digest محدد تم بناؤه وفحصه واختباره بالفعل من قِبل CI. السؤال الوحيد الذي يجب على Git الإجابة عليه هو: أي نسخة من هذا الأرتيفاكت مسموح لكل بيئة بتشغيلها؟
تشريح تدفق الترقية
مسار الترقية من ثلاث بيئات يبدو كالتالي من حيث Git:
- dev: يتم تحديث عنوان الـ image تلقائياً من قِبل CI عند كل دمج إلى فرع
main. يُصالح عميل GitOps خلال ثوانٍ. لا موافقة بشرية. - staging: يتم تحديث عنوان الـ image بواسطة سكريبت ترقية أو PR بشري. قد يتطلب أن تجتاز اختبارات smoke آلية أولاً. مُقيَّد بقاعدة حماية فرع أو فحص حالة مطلوب.
- production: يتم تحديث عنوان الـ image فقط بعد موافقة بشرية على PR (أو موافقة آلية من محرك سياسات مثل OPA Gatekeeper). نوافذ تجميد التغييرات مُفعَّلة عبر قواعد حماية الفروع في مستودع الإعدادات.
هيكل المستودع للـ GitOps متعدد البيئات
الهيكل القانوني الذي يتوسع مع المنظمات الكبيرة يستخدم مجلدات بيئة داخل مستودع إعدادات واحد (أو مستودعات منفصلة لكل بيئة لأقصى درجات العزل). إليك هيكلاً حقيقياً مبنياً على Kustomize:
v1.2.3 يمكن استبدالها بـ docker push. الـ digest مثل sha256:a3f7... غير قابل للتغيير تشفيرياً. استخدم kustomize edit set image مع الـ digest الكامل في سكريبت الترقية. ArgoCD Image Updater وFlux ImagePolicy يمكنهما أتمتة تثبيت الـ digest في dev وstaging مع إبقاء الإنتاج مثبتاً على digest موافق عليه بشرياً.
أتمتة ترقية Dev من CI
بعد نجاح بناء CI، تُحدِّث الـ pipeline طبقة dev تلقائياً. هذه هي البيئة الوحيدة التي تكتب فيها CI مباشرةً إلى مستودع الإعدادات. النمط يستخدم توكن بوت بصلاحيات كتابة محدودة على مستودع الإعدادات فقط:
الترقية إلى Staging: PR مدفوع بسكريبت
ترقية staging تُشغَّل عادةً يدوياً (مطور يشغّل سكريبتاً أو ينقر زراً في واجهة مستخدم بعد مراقبة dev) أو تلقائياً بعد فترة نقع محددة بالوقت في dev. يفتح السكريبت pull request؛ الدمج البشري مطلوب. فحوصات الحالة المطلوبة على الـ PR (اختبارات smoke، فحوصات أمان) تعمل كبوابة:
ImageUpdateAutomation يمكنه مراقبة سجل الحاويات والـ commit بعناوين محدثة إلى Git تلقائياً، مع سياسات تتحكم في نطاقات semver المؤهلة. هذا ممتاز لـ dev وstaging. بالنسبة للإنتاج، عطّل الأتمتة واحتفظ ببوابة PR البشرية. ArgoCD يُفوِّض إلى أدوات خارجية مثل Renovate أو إضافة ArgoCD Image Updater لأتمتة مماثلة.
الترقية إلى الإنتاج: البوابة البشرية
ترقية الإنتاج تتبع نفس النمط كـ staging، لكن الـ PR يتطلب مراجعة بشرية صريحة. على نطاق big-tech يُفرض هذا هيكلياً وليس باتفاقية:
- ملف CODEOWNERS:
apps/api-service/overlays/production/ @myorg/oncall-approvers— GitHub/GitLab يطلب تلقائياً مراجعة هذا الفريق ويمنع الدمج حتى يوافق أحدهم. - قواعد حماية الفروع: تتطلب موافقتين، إلغاء المراجعات القديمة عند commits جديدة، تمرير جميع فحوصات الحالة (بما في ذلك فحص "تجميد التغيير" المخصص الذي يفشل خلال نوافذ التجميد المُعلنة).
- محركات السياسات: سياسات OPA Conftest أو Kyverno تعمل في فحص CI على PR مستودع الإعدادات، للتحقق من أن الصورة اجتازت الفحص الأمني المطلوب، وأن الـ digest يطابق ما تمت ترقيته عبر staging، وأنه لم تُحذف حدود الموارد عن طريق الخطأ.
أنماط فشل الإنتاج وكيفية تجنبها
الترقيات تفشل بطرق يمكن التنبؤ بها. معرفة هذه الأنماط يتيح لك بناء حواجز قبل وصولها للإنتاج:
- ترقية عنوان قابل للتغيير: CI تبني
:latest، staging تجتاز، لكن بحلول وقت ترقية الإنتاج، يشير:latestإلى بناء مختلف. دائماً رقّ image digests بشكلsha256:...، ولا تُرقِّ عناوين قابلة للتغيير. - انجراف الإعدادات بين الطبقات: مطور يُعدِّل يدوياً طبقة staging لاختبار شيء، ينسى إزالته، وترقية staging-to-prod تحمل التغيير في صمت. استخدم
kustomize buildفي CI لمقارنة الناتج المُعرض لـ staging مقابل prod قبل الدمج. - ظروف السباق في ترقيات الخدمات المتعددة: عندما تعتمد الخدمة A على API جديد للخدمة B، ترقية A قبل B تسبب أخطاء. استخدم sync waves في ArgoCD (annotation
argocd.argoproj.io/sync-wave) أوdependsOnفي Flux لتسلسل عمليات النشر. - نسيان تحديث الأسرار الخاصة بالبيئة: متغير بيئة جديد يُضاف في dev لكن الـ Secret أو ExternalSecret لا يُضاف إلى طبقة prod. التطبيق ينشر لكنه يتعطل. دائماً تحقق من صلاحية المانيفستات المُعرضة مقابل schema.
تتبع حالة الترقية
في نهاية الترقية، يجب أن تتمكن من الإجابة من Git وحده: أي image digest يعمل حالياً في كل بيئة؟ اتفاقية بسيطة هي VERSIONS.md أو versions.json منظم في جذر المستودع يتم تحديثه بواسطة سكريبت الترقية. الأفضل من ذلك، استعلم ArgoCD أو Flux مباشرةً:
ترقية البيئات المُنفَّذة بشكل صحيح هي الفرق بين عملية نشر يمكنك الوثوق بها في الساعة الثانية صباحاً وعملية تتهابها كل جمعة مساءً. انضباط "كل تغيير في كل بيئة هو Git commit مع سلسلة موافقة بشرية" هو ما يجعل GitOps أساس التسليم الآمن والقابل للتدقيق على نطاق واسع.