Python Programming

إتقان البيئات القابلة للتكرار: عزل التطوير المحلي عن CI/CD باستخدام Docker و Poetry

أحد التحديات الأكثر استمرارية في هندسة البرمجيات الحديثة هو متلازمة "إنه يعمل على جهازِي". مع نمو تعقيد مشاريع بايثون، يصبح إدارة التبعيات بين إعدادات التطوير المحلي وخطوط أنابيب التكامل المستمر/النشر المستمر (CI/CD) أمرًا بالغ الأهمية. تؤدي البيئات غير المتسقة إلى اختبارات غير مستقرة، وفشل في النشر، وهدر لساعات عمل المهندسين.

في هذا المنشور، سنستكشف كيفية دمج Python Poetry لإدارة التبعيات مع Docker لعزل البيئة. من خلال الاستفادة من هذه الأدوات معًا، يمكننا إنشاء سير عمل قوي يضمن أن بيئة التطوير المحلية الخاصة بك تعكس مراحل الإنتاج وCI/CD بدقة.

المشكلة مع إدارة التبعيات القياسية

تقليديًا، يستخدم المطورون requirements.txt أو pip لإدارة الحزم. وعلى الرغم من بساطتها، فإن هذا النهج غالبًا ما يتجاهل التبعيات على مستوى النظام (مثل مترجمي C أو المكتبات المحددة) والسلوكيات الخاصة بنظام التشغيل. يحل Poetry مشكلة حل التبعيات باستخدام ملف pyproject.toml وملف قفل (poetry.lock)، لكنه لا يزال يعمل على نظام التشغيل المضيف. إذا كان مشغل CI/CD الخاص بك يستخدم Ubuntu 22.04 بينما تقوم بالتطوير على macOS، فقد تؤدي الاختلافات الدقيقة في التبعيات الثنائية أو إصدارات المكتبات إلى حدوث مشكلات.

لعزل البيئات حقًا، نحتاج إلى الحاويات. يوفر Docker طبقة تجريد تغلف نظام التشغيل والمكتبات ورمز التطبيق، مما يضمن الاتساق بغض النظر عن آلة المضيف الأساسية.

هيكل المشروع والتكوين

لنبدأ بإعداد هيكل مشروع بايثون قياسي باستخدام Poetry. أولاً، قم بتهيئة مشروعك:

poetry new my-reproducible-app
cd my-reproducible-app

أضف تبعيات مشروعك. لهذا المثال، لنفترض أننا نحتاج إلى requests و pytest:

poetry add requests
poetry add --group dev pytest

ومما لا يقل أهمية، يقوم Poetry بإنشاء ملف poetry.lock. يقوم هذا الملف بتثبيت كل إصدار محدد لكل تبعية، مما يضمن أن أي شخص يقوم بتنزيل المستودع يحصل على نفس إصدارات الحزم تمامًا.

بناء بيئة Docker

الآن، لنقم بإنشاء Dockerfile يستخدم ملف القفل الذي تم إنشاؤه بواسطة Poetry. المفتاح هنا هو تجنب تثبيت التبعيات في كل عملية بناء. نستخدم عمليات البناء متعددة المراحل أو التخزين المؤقت للطبقات بعناية للحفاظ على سرعة البناء.

إليك Dockerfile محسّن للتطوير:

FROM python:3.11-slim AS base

WORKDIR /app

# Install Poetry inside the container
RUN pip install --no-cache-dir poetry

# Copy only the lockfile first to leverage Docker layer caching
COPY pyproject.toml poetry.lock ./

# Install dependencies into a virtual environment
RUN poetry config virtualenvs.in-project true \
    && poetry install --no-interaction --no-ansi

# Copy the rest of the application code
COPY . .

# Command to run the application or tests
CMD ["poetry", "run", "python", "-m", "my_app"]

لاحظ استخدام poetry install بدون العلم --no-dev. للتطوير المحلي، نريد أن تكون جميع تبعيات التطوير (مثل أدوات التدقيق واختبار التشغيل) متاحة. ومع ذلك، لـ CI/CD، سنعدل ذلك قليلاً.

عزل تبعيات CI/CD

لديها خطوط أنابيب CI/CD متطلبات مختلفة عن التطوير المحلي. عادةً لا تريد مخرجات تفاعلية، وقد لا تحتاج إلى إضافات IDE أو أدوات تدقيق محلية في الحاوية النهائية. يمكننا التعامل مع ذلك عن طريق تمرير حجج البناء أو استخدام خدمات Docker Compose منفصلة.

لمرحلة تشبه الإنتاج في خط أنابيب CI/CD الخاص بك (مثل GitHub Actions أو GitLab CI)، يمكنك استخدام بناء متعدد المراحل لاستبعاد تبعيات التطوير غير الضرورية:

FROM python:3.11-slim AS builder
WORKDIR /app
COPY pyproject.toml poetry.lock ./
RUN pip install --no-cache-dir poetry \
    && poetry config virtualenvs.in-project true \
    && poetry install --no-dev --no-interaction --no-ansi

FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /app/.venv .venv
COPY --from=builder /app /app
ENV PATH="/app/.venv/bin:$PATH"

CMD ["python", "-m", "my_app"]

يضمن هذا النهج أن الصورة النهائية التي تعمل في الإنتاج أو اختبارات التكامل خفيفة وتحتوي فقط على تبعيات وقت التشغيل، مما يقلل من سطح الهجوم وحجم الصورة.

سير العمل العملي للمطورين

لجعل هذا سير العمل سلسًا، قم بتكوين طرفية المحلية الخاصة بك لاستخدام بيئة بايثون الافتراضية لـ Poetry تلقائيًا. عند تشغيل poetry shell، يتم تفعيل البيئة داخل المشروع. بالاقتران مع Docker، يمكنك تشغيل اختباراتك المحلية داخل الحاوية لضمان التطابق:

docker-compose run --rm app poetry run pytest

يقوم هذا الأمر بتشغيل الحاوية المعرفة في إعداد Docker Compose الخاص بك، وتشغيل الاختبارات، ثم التخلص من الحاوية. إنه يضمن أن نتائج اختبارك لا تتأثر بالحزم المثبتة عالميًا على جهازك.

الخاتمة

من خلال دمج Poetry لحل التبعيات الدقيق مع Docker لعزل البيئة، يمكن للمطورين القضاء على الاحتكاك بين بيئات التطوير المحلية وCI/CD. لا يحسن هذا الإعداد من موثوقية خطوط أنابيب CI/CD الخاصة بك فحسب، بل يبسط أيضًا عملية الاندماج للأعضاء الجدد في الفريق. لا مزيد من استكشاف الأخطاء وإصلاحها للبرمجيات الخاصة بالبيئة - فقط تنفيذ نظيف وقابل للتكرار للرمز.

اعتماد هذا النمط هو خطوة كبيرة نحو ممارسات DevOps الناضجة. ابدأ بتغليف بيئة التطوير الخاصة بك في حاويات اليوم، وشاهد ثقة النشر الخاصة بك ترتفع.

Share: