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 دقائق (مؤتمت بالكامل)                      │
│                                                         │
└─────────────────────────────────────────────────────────┘

في الوحدة التالية، سنستكشف أنماط مراقبة وموثوقية المنصة. :::

اختبار

الوحدة 4: GitOps والتسليم المستمر

خذ الاختبار