CI/CD والبنية التحتية كرمز

تصميم خطوط CI/CD

4 دقيقة للقراءة

أسئلة خطوط CI/CD تختبر فهمك لتسليم البرمجيات الحديث. دعنا نغطي ما يتوقعه المقابلون.

أساسيات CI/CD

التكامل المستمر (CI)

المطور → Commit → البناء → الاختبار → التكامل
                    ردود الفعل (سريعة!)

أهداف CI:

  • اكتشاف مشاكل التكامل مبكراً
  • ردود فعل سريعة (< 10 دقائق مثالي)
  • اختبار آلي
  • بناء متسق

التسليم المستمر مقابل النشر المستمر

التسليم المستمر النشر المستمر
كل commit قابل للنشر كل commit يُنشر
تشغيل النشر يدوياً نشر تلقائي
بوابة موافقة بشرية بوابات آلية فقط
أكثر شيوعاً يتطلب اختبار ناضج

خط GitHub Actions

name: CI/CD Pipeline

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install dependencies
        run: pip install -r requirements.txt

      - name: Run tests
        run: pytest --cov=app tests/

      - name: Upload coverage
        uses: codecov/codecov-action@v4

  build:
    needs: test
    runs-on: ubuntu-latest
    outputs:
      image-tag: ${{ steps.meta.outputs.tags }}
    steps:
      - uses: actions/checkout@v4

      - name: Build image
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}

  deploy-staging:
    needs: build
    runs-on: ubuntu-latest
    environment: staging
    steps:
      - name: Deploy to staging
        run: |
          kubectl set image deployment/app \
            app=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}

  deploy-production:
    needs: deploy-staging
    runs-on: ubuntu-latest
    environment:
      name: production
      url: https://app.example.com
    steps:
      - name: Deploy to production
        run: |
          kubectl set image deployment/app \
            app=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}

خط GitLab CI

stages:
  - test
  - build
  - deploy

variables:
  DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

test:
  stage: test
  image: python:3.11
  script:
    - pip install -r requirements.txt
    - pytest --cov=app tests/
  coverage: '/TOTAL.*\s+(\d+%)/'

build:
  stage: build
  image: docker:24.0
  services:
    - docker:24.0-dind
  script:
    - docker build -t $DOCKER_IMAGE .
    - docker push $DOCKER_IMAGE
  rules:
    - if: $CI_COMMIT_BRANCH == "main"

deploy_staging:
  stage: deploy
  environment:
    name: staging
  script:
    - kubectl set image deployment/app app=$DOCKER_IMAGE
  rules:
    - if: $CI_COMMIT_BRANCH == "main"

deploy_production:
  stage: deploy
  environment:
    name: production
  script:
    - kubectl set image deployment/app app=$DOCKER_IMAGE
  when: manual  # موافقة يدوية مطلوبة
  rules:
    - if: $CI_COMMIT_BRANCH == "main"

أفضل ممارسات الخطوط

تحسين السرعة

التقنية التحسين
المهام المتوازية أسرع 2-4x
التخزين المؤقت يوفر وقت تنزيل التبعيات
البناء التزايدي إعادة بناء المتغير فقط
صور أساسية نحيفة أوقات سحب أسرع
موازاة الاختبارات التوسع مع المشغلين
# مثال التخزين المؤقت في GitHub Actions
- name: Cache pip packages
  uses: actions/cache@v4
  with:
    path: ~/.cache/pip
    key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
    restore-keys: |
      ${{ runner.os }}-pip-

الأمان في الخطوط

# إدارة الأسرار
env:
  AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }}

# لا تفعل هذا أبداً:
# AWS_ACCESS_KEY: AKIAXXXXXXXXXXXXXXXX

# فحص الأمان
- name: Run Trivy vulnerability scanner
  uses: aquasecurity/trivy-action@master
  with:
    image-ref: ${{ env.IMAGE }}
    format: 'sarif'
    severity: 'CRITICAL,HIGH'

أسئلة المقابلة

س: "كيف ستصمم خط CI/CD لـ 100 خدمة مصغرة؟"

النقاط الرئيسية للتغطية:

  1. Monorepo مقابل polyrepo: يؤثر على كيفية تشغيل الخطوط
  2. قوالب خطوط مشتركة: تقليل التكرار
  3. تجاوزات خاصة بالخدمة: عند الحاجة
  4. التنفيذ المتوازي: الخدمات المستقلة تُبنى بالتوازي
  5. معالجة التبعيات: الخدمات التي تعتمد على بعضها
  6. ترقية البيئة: Dev → Staging → Prod
# مثال: نهج القالب المشترك
.deploy_template:
  script:
    - deploy.sh $ENVIRONMENT
  rules:
    - if: $CI_COMMIT_BRANCH == "main"

deploy_service_a:
  extends: .deploy_template
  variables:
    SERVICE: service-a

س: "ما المقاييس التي تتتبعها لصحة CI/CD؟"

المقياس الهدف الجيد لماذا يهم
وقت البناء < 10 دقائق إنتاجية المطور
معدل النجاح > 95% موثوقية الخط
تكرار النشر يومي+ سرعة التسليم
وقت الوصول < يوم الوقت للقيمة
MTTR < ساعة سرعة الاسترداد
تغطية الاختبار > 80% ثقة الجودة

التالي، سنغطي البنية التحتية كرمز مع Terraform—ضروري لأي دور DevOps/SRE. :::

اختبار

الوحدة 3: CI/CD والبنية التحتية كرمز

خذ الاختبار