GitOps بالعربي: ليه ArgoCD بيهزم Jenkins في نشر Kubernetes
لو فريقك لسه بيعمل kubectl apply -f من لابتوب المهندس اللي ناشر، فالكلاستر بتاعك فيه configuration drift غير مرئي. GitOps بيحل المشكلة دي جذريًا، و ArgoCD بقى الأداة السائدة في 2026 بحصة سوقية تقترب من 60% من فرق الـ Kubernetes في العالم.
المشكلة باختصار
في Jenkins الكلاسيكي، الـ pipeline بتدفع الـ manifest للكلاستر. طيب لو مهندس فتح SSH على الكلاستر وعدّل replicaCount يدويًا علشان مشكلة عاجلة الساعة 3 الفجر؟ Jenkins مش هيعرف. الحالة اللي في Git مش زي الحالة اللي في الكلاستر. ده اللي اسمه configuration drift، ومع الوقت بيخلّي الـ disaster recovery مجرد تمني.
GitOps بيقلب المعادلة: Git يبقى الـ single source of truth، وأداة تانية (ArgoCD هنا) تراقب الفرق بين Git والكلاستر وتصلحه تلقائيًا.
GitOps بمثال بسيط (لو انت مبتدئ)
تخيل بيت فيه ثرموستات ذكي. انت كتبت ورقة معلقة على التلاجة مكتوب فيها: "الحرارة لازم تبقى 22 درجة". الثرموستات بيقرأ الورقة دي كل دقيقة، ولو الحرارة اتغيرت لأي سبب (بابا فتح الشباك، الشمس طلعت، حد لعب في الريموت)، الثرموستات بيرجّعها 22 من غير ما حد يتدخّل.
في GitOps: الورقة دي هي Git repository. الثرموستات هو ArgoCD. الحرارة هي حالة الـ Kubernetes cluster. أي تغيير يدوي بيترصد، وإما بيترجع تلقائيًا أو ArgoCD يطلق تنبيه إن الحالة اتفرّقت.
التعريف العلمي الدقيق
GitOps هو نمط تشغيل declarative للـ Kubernetes، قوامه 4 مبادئ من OpenGitOps (تابعة لـ CNCF):
- النظام بالكامل موصوف declaratively.
- النسخة المطلوبة من حالة النظام مخزّنة في Git وله versioning.
- التغييرات المعتمدة في Git بتتطبّق تلقائيًا.
- Software agents بتراقب الحالة الفعلية وتقارنها بالمطلوبة وتصلح الفرق.
Push vs Pull: الفرق اللي غيّر اللعبة
Jenkins بيشتغل push-based: الـ pipeline بيجري خارج الكلاستر، ومعاه credentials للكلاستر، وبيعمل kubectl apply من بره. ArgoCD بيشتغل pull-based: ArgoCD بيعيش جوه الكلاستر، بيسحب الـ manifests من Git، ويطبّقها بنفسه.
الفرق ده أمني بحت: في ArgoCD، مفيش credentials للكلاستر بتتخزّن في CI system خارجي. أي خرق في Jenkins بيضعك في خطر production مباشر؛ خرق في Git أو ArgoCD بيتحدّد في حدود واحدة. ده السبب الرئيسي إن شركات زي Intuit و BlackRock اتحولوا لـ ArgoCD.
تثبيت ArgoCD في 4 أوامر
# إنشاء namespace منفصل
kubectl create namespace argocd
# تثبيت ArgoCD من الـ manifests الرسمية
kubectl apply -n argocd \
-f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# الانتظار حتى جهوزية الـ server
kubectl wait --for=condition=available --timeout=300s \
deployment/argocd-server -n argocd
# جلب كلمة المرور الأولية لحساب admin
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d && echo
# Port forward للوصول للواجهة محليًا
kubectl port-forward svc/argocd-server -n argocd 8080:443