تصميم مستودع GitOps
تصميم مستودع GitOps
القرار الأكثر أهمية الذي تتخذه عند اعتماد GitOps هو كيفية تنظيم مستوداتك. إذا أخطأت في ذلك، ستجد نفسك تصارع الأدوات كل يوم — انجراف بين البيئات، وترقيات غير مقصودة، وتسرب للأسرار بين حدود الفرق، وخطوط أنابيب CI تخشى الدمج. أما إذا أصبت، فلديك نظام تسليم يتوسع من فريق واحد ومجموعة واحدة إلى خمسين فريقاً ومئات المجموعات بأقل قدر من التعقيد.
يغطي هذا الدرس القرارات الهيكلية الثلاثة التي يجب على كل مؤسسة GitOps اتخاذها: مستودعات التطبيق مقابل مستودعات البنية التحتية، ومجلدات البيئة مقابل فروع البيئة، والمستودع الموحد مقابل المستودعات المتعددة. لكل قرار تكلفته الحقيقية، والإجابة الصحيحة تعتمد على هيكل فريقك ومتطلبات الامتثال لديك ومعدل التغيير المتوقع.
مستودعات التطبيق مقابل مستودعات البنية التحتية
الفصل الأساسي في GitOps هو بين المستودع الذي يحتوي على شفرة مصدر التطبيق والمستودع الذي يحتوي على ملفات الحالة المطلوبة للمجموعة. هذان اهتمامان مختلفان بمعدلات تغيير مختلفة وجماهير مختلفة وضوابط وصول مختلفة — إبقاؤهما منفصلين ليس مجرد اتفاقية، بل هو نظافة معمارية.
يحتوي مستودع التطبيق (يُسمى أحياناً "مستودع المصدر") على شفرة Go أو Python أو TypeScript أو Java، وDockerfile الخاصة به، وتعريف خط أنابيب CI. كل دمج إلى main يُطلق بناءً، ويشغّل الاختبارات، ويدفع صورة موسومة بـ SHA الخاص بـ Git، ثم — والأهم — يفتح طلب سحب ضد مستودع البنية التحتية لتحديث وسم الصورة. مستودع التطبيق لا ينشر أي شيء مباشرةً.
يحتوي مستودع البنية التحتية (مستودع الإعدادات أو مستودع GitOps) فقط على ملفات بيان Kubernetes وملفات قيم Helm أو تراكبات Kustomize. ليس فيه أي عناصر بناء أو منطق تطبيقي. مهمته الوحيدة هي أن يكون مصدر الحقيقة لما يجب تشغيله في كل مجموعة. يراقب ArgoCD أو Flux هذا المستودع ويتوافق مع المجموعة باستمرار.
يبدو تدفق CI الملموس الذي يربط هذين المستودعين على النحو التالي. يقوم سير عمل GitHub Actions أو GitLab CI في مستودع التطبيق بالبناء والدفع، ثم يستخدم PAT أو مفتاح نشر لفتح طلب سحب ضد مستودع البنية التحتية:
يراجع مهندس مناوب طلب السحب (أو يُدمج تلقائياً إذا كنت تثق باختبارات التكامل)، ويلتقط ArgoCD أو Flux التغيير المدموج في غضون ثوانٍ. نمط المستودعين هذا هو ما توثّقه Weaveworks وGoogle وLyft باعتباره البنية المعيارية لـ GitOps.
مجلدات البيئة مقابل فروع البيئة
بمجرد حصولك على مستودع بنية تحتية، تواجه قراراً ثانياً: كيف تمثل بيئات متعددة (dev، staging، production) داخله؟ مدرستا فكر موجودتان، وإحداهما ستسبب لك ألماً على نطاق واسع.
فروع البيئة — فرع Git مخصص لكل بيئة (env/dev، env/staging، env/prod) — تبدو بديهية لأن "الترقية تتم بالدمج". في الواقع، للفروع المخصصة للبيئة أوضاع فشل كارثية. تفشل الانتقاءات الدقيقة بصمت. تتراكم تعارضات الدمج بين فروع البيئة على مدى أسابيع. لا يمكنك بسهولة معرفة ما هو في staging ولكن ليس في prod دون مقارنة رؤوس الفروع عبر الشجرة بأكملها. الفروع المتباعدة طويلة الأمد هي بالضبط ما صُممت سير عمل Git الحديثة للقضاء عليه. لا تستخدم فروع البيئة.
مجلدات البيئة — فرع main واحد مع دلائل لكل بيئة — هي النهج الصحيح. كل تغيير هو طلب سحب عادي إلى main، والتاريخ خطي وقابل للقراءة، ومقارنة البيئات هي مقارنة نظام ملفات وليست مقارنة فروع Git. صُمم Kustomize خصيصاً لهذا النموذج؛ وصُممت ApplicationSets في ArgoCD وموارد Kustomization في Flux للإشارة إلى دلائل داخل فرع واحد.
تخطيط مستودع بنية تحتية جيد الهيكل:
staging/values.yaml إلى prod/values.yaml — ولا شيء آخر يتغير. هذا يجعل فرق الترقية سطراً واحداً والتراجع عنه عملية من سطر واحد — وكلاهما موثق في تاريخ Git للأبد.
المستودع الموحد مقابل المستودعات المتعددة
المحور الثالث هو ما إذا كانت جميع إعدادات بنية تحتية تطبيقاتك تعيش في مستودع واحد أو مقسمة لكل فريق أو لكل خدمة. هنا تهم طبولوجيا الفريق — قانون كونواي — أكثر من أي شيء آخر.
يعمل المستودع الموحد (جميع الخدمات في مستودع بنية تحتية واحد) بشكل ممتاز للمؤسسات التي تضم حتى ما بين عشرين وثلاثين فريقاً. يمنحك مكاناً واحداً لفرض السياسات، ويجعل تغييرات التبعية بين الخدمات ذرية، ويبسط إعداد مشغل GitOps. يشغّل Google وSpotify وShopify بنجاح مستودعات موحدة. التحدي التشغيلي هو التحكم في الوصول: يجب ألا تتمكن الفرق من تعديل دلائل بعضها البعض. حل ذلك عبر ملفات CODEOWNERS.
يوفر المستودعات المتعددة (مستودع بنية تحتية واحد لكل خدمة أو لكل فريق) حدود عزل صارمة وهو الاختيار الطبيعي عندما يتطلب الامتثال التنظيمي ذلك (عزل منطقة PCI DSS، وتجزئة بيانات HIPAA) أو عندما تكون الفرق في كيانات قانونية منفصلة. التكلفة هي تكاثر مشغّلات: كل كائن ArgoCD Application أو Flux GitRepository يتضاعف، والتغييرات بين الخدمات تحتاج إلى طلبات سحب منسقة في مستودعات متعددة.
قاعدة عملية: ابدأ بمستودع موحد مقسم إلى دلائل فرعية teams/، مفروضة بـ CODEOWNERS. قم بنقل الفريق إلى مستودعه الخاص فقط عندما تكون هناك حدود امتثال أو تنظيمية موثقة تجعل ذلك إلزامياً. إليك نمط CODEOWNERS للتحكم في الوصول بالمستودع الموحد:
مع حماية الفروع التي تتطلب مراجعة CODEOWNERS، لا يستطيع مطور في فريق payment بصورة عرضية أو متعمدة دفع تغيير يعدّل ملفات بيان خدمة checkout. هذا الملف الواحد يفرض العزل متعدد الفرق دون الحاجة إلى تقسيم المستودعات.
الجمع بين كل العناصر
تصميم مستودع GitOps المعياري للمؤسسات الهندسية المتنامية هو: فصل مستودعات التطبيق عن البنية التحتية، ومجلدات البيئة على فرع واحد، ومستودع موحد مع CODEOWNERS حتى تصل إلى سبب ملموس للتقسيم. يرقّي نظام CI في مستودع التطبيق بفتح طلبات سحب ضد مستودع البنية التحتية. يراقب مشغّل GitOps مسارات محددة داخل مستودع البنية التحتية لكل بيئة، ويطبق التغييرات تلقائياً عند الدمج.