GitOps والتسليم المستمر
GitOps + Crossplane + Backstage
3 دقيقة للقراءة
القوة الحقيقية لهندسة المنصات تظهر عند دمج Backstage وCrossplane وGitOps في سير عمل موحد. يوضح هذا الدرس كيفية بناء منصة خدمة ذاتية شاملة.
بنية IDP الكاملة
┌─────────────────────────────────────────────────────────┐
│ بوابة المطورين │
│ (Backstage) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ الكتالوج │ │ القوالب │ │ TechDocs │ │
│ └──────────────┘ └──────┬───────┘ └──────────────┘ │
│ │ │
└───────────────────────────┼──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ مستودع GIT │
│ (مصدر الحقيقة) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ تكوينات App │ │ مطالبات Infra│ │ Rollouts │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │
└───────────────────────────┼──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ ArgoCD │
│ (وحدة تحكم GitOps) │
│ │ │
│ ┌────────────────┼────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ نشر App │ │ مطالبات │ │ Rollouts │ │
│ │ (K8s) │ │ Crossplane │ │ │ │
│ └────────────┘ └─────┬──────┘ └────────────┘ │
│ │ │
└─────────────────────────┼───────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ CROSSPLANE │
│ (البنية التحتية) │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ AWS │ │ GCP │ │ Azure │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
قالب Backstage لخدمة كاملة
إنشاء قالب يوفر التطبيق والبنية التحتية وGitOps:
# backstage-template-fullstack.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: create-fullstack-service
title: إنشاء خدمة كاملة
description: |
ينشئ خدمة جديدة مع:
- مستودع كود التطبيق
- قاعدة بيانات PostgreSQL (عبر Crossplane)
- تطبيق ArgoCD لـ GitOps
- المراقبة والتنبيهات
tags:
- recommended
- platform
spec:
owner: platform-team
type: service
parameters:
- title: معلومات الخدمة
required:
- name
- description
- owner
properties:
name:
title: اسم الخدمة
type: string
pattern: '^[a-z][a-z0-9-]*$'
description:
title: الوصف
type: string
owner:
title: المالك
type: string
ui:field: OwnerPicker
- title: التكوين التقني
properties:
language:
title: اللغة
type: string
enum: [nodejs, python, go, java]
default: nodejs
framework:
title: إطار العمل
type: string
enum:
- express
- fastapi
- gin
- spring-boot
default: express
- title: البنية التحتية
properties:
database:
title: حجم قاعدة البيانات
type: string
enum: [small, medium, large]
default: small
environment:
title: البيئة
type: string
enum: [development, staging, production]
default: development
steps:
# الخطوة 1: إنشاء مستودع التطبيق
- id: create-repo
name: إنشاء مستودع التطبيق
action: publish:github
input:
repoUrl: github.com?repo=${{ parameters.name }}&owner=acme
description: ${{ parameters.description }}
defaultBranch: main
repoVisibility: internal
# الخطوة 2: بناء هيكل كود التطبيق
- id: scaffold-app
name: بناء هيكل التطبيق
action: fetch:template
input:
url: ./templates/${{ parameters.language }}-${{ parameters.framework }}
targetPath: ./app
values:
name: ${{ parameters.name }}
description: ${{ parameters.description }}
owner: ${{ parameters.owner }}
# الخطوة 3: إنشاء مطالبة Crossplane لقاعدة البيانات
- id: create-database
name: إنشاء قاعدة البيانات
action: kubernetes:apply
input:
namespaced: true
manifest:
apiVersion: platform.acme.com/v1alpha1
kind: Database
metadata:
name: ${{ parameters.name }}-db
namespace: ${{ parameters.environment }}
labels:
app: ${{ parameters.name }}
owner: ${{ parameters.owner }}
spec:
size: ${{ parameters.database }}
engine: postgres
writeConnectionSecretToRef:
name: ${{ parameters.name }}-db-credentials
# الخطوة 4: الإضافة لمستودع GitOps
- id: gitops-pr
name: إنشاء تكوين GitOps
action: publish:github:pull-request
input:
repoUrl: github.com?repo=gitops-repo&owner=acme
branchName: add-${{ parameters.name }}
title: "إضافة ${{ parameters.name }} إلى GitOps"
description: |
إضافة خدمة جديدة: ${{ parameters.name }}
المالك: ${{ parameters.owner }}
البيئة: ${{ parameters.environment }}
targetPath: apps/overlays/${{ parameters.environment }}/${{ parameters.name }}
commitMessage: "feat: إضافة تطبيق ${{ parameters.name }}"
# الخطوة 5: إنشاء تطبيق ArgoCD
- id: create-argocd-app
name: إنشاء تطبيق ArgoCD
action: kubernetes:apply
input:
namespaced: true
manifest:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: ${{ parameters.name }}
namespace: argocd
labels:
owner: ${{ parameters.owner }}
spec:
project: ${{ parameters.owner }}
source:
repoURL: https://github.com/acme/gitops-repo.git
path: apps/overlays/${{ parameters.environment }}/${{ parameters.name }}
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: ${{ parameters.environment }}
syncPolicy:
automated:
prune: true
selfHeal: true
# الخطوة 6: التسجيل في الكتالوج
- id: register
name: التسجيل في الكتالوج
action: catalog:register
input:
repoContentsUrl: ${{ steps['create-repo'].output.repoContentsUrl }}
catalogInfoPath: /catalog-info.yaml
output:
links:
- title: المستودع
url: ${{ steps['create-repo'].output.remoteUrl }}
- title: PR GitOps
url: ${{ steps['gitops-pr'].output.pullRequestUrl }}
- title: العرض في الكتالوج
icon: catalog
entityRef: ${{ steps['register'].output.entityRef }}
هيكل مستودع GitOps
gitops-repo/
├── apps/
│ ├── base/
│ │ └── user-service/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ ├── rollout.yaml # Argo Rollout
│ │ └── kustomization.yaml
│ └── overlays/
│ ├── development/
│ │ └── user-service/
│ │ ├── database-claim.yaml # Crossplane
│ │ └── kustomization.yaml
│ ├── staging/
│ └── production/
│
├── infrastructure/
│ ├── crossplane/
│ │ ├── xrds/
│ │ │ └── database-xrd.yaml
│ │ ├── compositions/
│ │ │ ├── database-aws.yaml
│ │ │ └── database-gcp.yaml
│ │ └── provider-configs/
│ └── argocd/
│ ├── projects/
│ └── applicationsets/
│
└── clusters/
└── production/
├── apps.yaml
└── infrastructure.yaml
بيان التطبيق الموحد
دمج نشر التطبيق مع Rollout والبنية التحتية:
# apps/base/user-service/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- rollout.yaml
- service.yaml
- service-canary.yaml
- ingress.yaml
# apps/overlays/production/user-service/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../../base/user-service
- database-claim.yaml # مطالبة Crossplane
- analysis-template.yaml # تحليل Argo Rollouts
patches:
- path: patch-replicas.yaml
- path: patch-image.yaml
# apps/overlays/production/user-service/database-claim.yaml
apiVersion: platform.acme.com/v1alpha1
kind: Database
metadata:
name: user-service-db
spec:
size: medium
engine: postgres
version: "15"
writeConnectionSecretToRef:
name: user-service-db-credentials
ApplicationSet لكل شيء
إدارة جميع المكونات مع ApplicationSet واحد:
# infrastructure/argocd/applicationsets/all-apps.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: all-platform-apps
namespace: argocd
spec:
generators:
- matrix:
generators:
- list:
elements:
- environment: development
cluster: https://dev.k8s.acme.com
- environment: staging
cluster: https://staging.k8s.acme.com
- environment: production
cluster: https://prod.k8s.acme.com
- git:
repoURL: https://github.com/acme/gitops-repo.git
revision: main
directories:
- path: apps/overlays/{{environment}}/*
template:
metadata:
name: '{{environment}}-{{path.basename}}'
namespace: argocd
labels:
environment: '{{environment}}'
app: '{{path.basename}}'
spec:
project: default
source:
repoURL: https://github.com/acme/gitops-repo.git
targetRevision: main
path: '{{path}}'
destination:
server: '{{cluster}}'
namespace: '{{path.basename}}'
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
سير العمل الشامل
سير عمل المطور:
┌─────────────────────────────────────────────────────────┐
│ │
│ 1. المطور يفتح Backstage │
│ └─► "إنشاء خدمة كاملة" │
│ │
│ 2. يملأ النموذج: │
│ └─► name: payment-service │
│ └─► database: medium │
│ └─► environment: production │
│ │
│ 3. Backstage ينشئ: │
│ └─► مستودع GitHub مع قالب الكود │
│ └─► PR لـ gitops-repo مع التكوينات │
│ └─► مطالبة Database Crossplane │
│ └─► تطبيق ArgoCD │
│ └─► إدخال الكتالوج │
│ │
│ 4. PR مدمج → ArgoCD يزامن: │
│ └─► Deployment/Rollout يُنشأ │
│ └─► Crossplane يوفر RDS │
│ └─► سر الاتصال متاح │
│ │
│ 5. الخدمة تعمل مع: │
│ └─► تسليم تدريجي (canary) │
│ └─► قاعدة البيانات جاهزة │
│ └─► مراقبة كاملة │
│ │
│ الوقت: ~10 دقائق (مؤتمت بالكامل) │
│ │
└─────────────────────────────────────────────────────────┘
في الوحدة التالية، سنستكشف أنماط مراقبة وموثوقية المنصة. :::