Preview Environments بالعربي: اختبر كل Pull Request قبل الدمج
لو كل Pull Request عندك بيتراجع بالعين فقط، المقال ده هيديك طريقة تشغل نسخة مؤقتة من التطبيق وتكشف مشاكل التكامل قبل الدمج.
المشكلة باختصار
اللي بيحصل فعلاً إن المراجعة بتشوف naming، structure، وربما test unit بسيط. لكن أول مرة الـ frontend يكلم الـ API والـ API يكلم PostgreSQL بتكون بعد الدمج أو على staging. هنا الباج بيبقى أغلى.
الافتراض إن عندك تطبيق صغير أو متوسط: API، قاعدة بيانات، وربما frontend. أقل من 20 خدمة. لو عندك منصة Kubernetes كبيرة، نفس الفكرة تنفع، لكن التنفيذ هيبقى بأدوات مختلفة.
الفكرة ببساطة
Preview Environment يعني نسخة مؤقتة من التطبيق مرتبطة بـ Pull Request معين. افتح PR رقم 42، يتبني image، يتشغل compose project باسم مختلف، وبعدها يتعمل smoke test. لو الاختبار فشل، الـ PR يتوقف قبل ما يلمس main.
ركز في النقطة دي: الهدف مش تعمل staging ثاني دائم. الهدف إنك تعمل بيئة قصيرة العمر. مثل مكتب صغير بيجهز عينة من المنتج للعميل، وبعد الموافقة يرجع يفكها. التكلفة وقت runner ومساحة Docker، والمكسب إنك تكشف كسر التكامل قبل الدمج.
في سيناريو واقعي، فريق عنده 8 مطورين و12 Pull Request يوميًا. لو كل PR بياخد 5 دقائق Preview وSmoke Test، هتدفع تقريبًا 60 دقيقة runner يوميًا. مقابل ده، ممكن تمنع incident واحد أسبوعيًا كان بياخد ساعتين debug على staging.
إعداد Docker Compose لبيئة مؤقتة
أفضل طريقة للمشاريع الصغيرة: استخدم Docker Compose project name مختلف لكل PR. كده الشبكات والـ volumes تتعزل بدل ما الخدمات تدوس على بعض.
# compose.preview.yml
services:
api:
build: .
environment:
DATABASE_URL: postgres://app:app@db:5432/app
depends_on:
db:
condition: service_healthy
ports:
- "8080"
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: app
POSTGRES_DB: app
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d app"]
interval: 5s
timeout: 3s
retries: 10
smoke:
image: curlimages/curl:8.7.1
depends_on:
api:
condition: service_started
command: ["sh", "-c", "curl -fsS http://api:3000/health"]
profiles: ["test"]
الـ healthcheck هنا مش رفاهية. Docker Compose يدعم انتظار الخدمة التي عليها service_healthy قبل تشغيل الخدمة التابعة لها. ده يمنع حالة شائعة: الـ API يبدأ قبل PostgreSQL بثانيتين، فيفشل الاختبار مع إن الكود سليم.
GitHub Actions Workflow قابل للنسخ
استخدم workflow بسيط على حدث pull_request. الرقم المهم هنا هو . بدل ما كل PR يستخدم نفس الشبكة، كل PR ياخد namespace منفصل.