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 خدمة مصغرة؟"
النقاط الرئيسية للتغطية:
- Monorepo مقابل polyrepo: يؤثر على كيفية تشغيل الخطوط
- قوالب خطوط مشتركة: تقليل التكرار
- تجاوزات خاصة بالخدمة: عند الحاجة
- التنفيذ المتوازي: الخدمات المستقلة تُبنى بالتوازي
- معالجة التبعيات: الخدمات التي تعتمد على بعضها
- ترقية البيئة: 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. :::