Python Programming

Yeniden Üretilebilir Ortamları Ustalıkla Yönetme: Docker ve Poetry ile Yerel Geliştirme ve CI/CD'yi İzole Etme

Modern yazılım mühendisliğinin en kalıcı zorluklarından biri "benim makinemde çalışıyor" sendromudur. Python projeleri karmaşıklık kazandıkça, yerel geliştirme ortamları ile Sürekli Entegrasyon/Sürekli Dağıtım (CI/CD) hatları arasındaki bağımlılıkları yönetmek giderek kritik hale gelir. Tutarlı olmayan ortamlar, hatalı testler, dağıtım hataları ve israf edilen mühendislik saatlerine yol açar.

Bu yazıda, bağımlılık yönetimi için Python Poetry ile ortam izole etme için Docker'ı nasıl birleştireceğimizi keşfedeceğiz. Bu araçları birlikte kullanarak, yerel geliştirme ortamınızın üretim ve CI/CD aşamalarını tam olarak yansıttığını güvence altına alan sağlam bir iş akışı oluşturabiliriz.

Standart Bağımlılık Yönetiminin Sorunları

Geleneksel olarak geliştiriciler paketleri yönetmek için requirements.txt veya pip kullanır. Basit olsa da, bu yaklaşım genellikle sistem düzeyindeki bağımlılıkları (C derleyicileri veya belirli kütüphaneler gibi) ve işletim sistemine özgü davranışları göz ardı eder. Poetry, bir pyproject.toml dosyası ve bir kilit dosyası (poetry.lock) kullanarak bağımlılık çözümleme sorununu çözer, ancak yine de ana işletim sistemi üzerinde çalışır. CI/CD çalıştırıcınız Ubuntu 22.04 kullanırken siz macOS üzerinde geliştirme yapıyorsanız, ikili bağımlılıklardaki veya kütüphane sürümlerindeki ince farklar sorunlara neden olabilir.

Ortamları gerçekten izole etmek için konteynerleştirme gerekir. Docker, altta yatan ana makineden bağımsız olarak tutarlılığı güvence altına alan işletim sistemini, kütüphaneleri ve uygulama kodunu kapsülleyen bir soyutlama katmanı sağlar.

Proje Yapısı ve Yapılandırma

Öncelikle Poetry kullanarak standart bir Python proje yapısı kuralım. İlk olarak, projenizi başlatın:

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

Proje bağımlılıklarınızı ekleyin. Bu örnek için requests ve pytest ihtiyacımız olduğunu varsayalım:

poetry add requests
poetry add --group dev pytest

Kritik olarak, Poetry bir poetry.lock dosyası oluşturur. Bu dosya, her bağımlılığın belirli bir sürümünü sabitler ve depo klonlayan herkesin tam olarak aynı paket sürümlerine sahip olmasını sağlar.

Docker Ortamını Oluşturma

Şimdi, Poetry tarafından oluşturulan kilit dosyasını kullanan bir Dockerfile oluşturalım. Buradaki anahtar nokta, her oluşturmada bağımlılıkları yüklememektir. Oluşturmayı hızlı tutmak için çok aşamalı oluşturmalar veya dikkatli katman önbellek kullanımı kullanırız.

İşte geliştirme için optimize edilmiş bir Dockerfile:

FROM python:3.11-slim AS base

WORKDIR /app

# Konteyner içinde Poetry'yi yükleyin
RUN pip install --no-cache-dir poetry

# Docker katman önbelleklerinden yararlanmak için önce yalnızca kilit dosyasını kopyalayın
COPY pyproject.toml poetry.lock ./

# Bağımlılıkları sanal bir ortama yükleyin
RUN poetry config virtualenvs.in-project true \
    && poetry install --no-interaction --no-ansi

# Uygulama kodunun geri kalanını kopyalayın
COPY . .

# Uygulamayı veya testleri çalıştırmak için komut
CMD ["poetry", "run", "python", "-m", "my_app"]

--no-dev bayrağı olmadan poetry install kullanımına dikkat edin. Yerel geliştirme için, tüm geliştirici bağımlılıklarının (linters ve test çalıştırıcıları gibi) mevcut olmasını isteriz. Ancak, CI/CD için bunu biraz değiştireceğiz.

CI/CD Bağımlılıklarını İzole Etme

CI/CD hatlarının yerel geliştirmeden farklı gereksinimleri vardır. Genellikle etkileşimli istemler istemezsiniz ve son konteynerde IDE eklentilerine veya yerel linting araçlarına ihtiyacınız olmayabilir. Bunu, derleme argümanları geçerek veya ayrı Docker Compose hizmetleri kullanarak halledebiliriz.

CI/CD hattınızda (örneğin GitHub Actions veya GitLab CI) üretim benzeri bir aşama için, gereksiz geliştirici bağımlılıklarını elemek amacıyla çok aşamalı bir oluşturma kullanabilirsiniz:

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"]

Bu yaklaşım, üretimde veya entegrasyon testlerinde çalışan son imajın zarif olduğunu ve yalnızca çalışma zamanı bağımlılıklarını içerdiğini güvence altına alır; bu da saldırı yüzeyini ve imaj boyutunu azaltır.

Geliştiriciler İçin Pratik İş Akışı

Bu iş akışını sorunsuz hale getirmek için yerel terminalinizi Poetry'nin sanal ortamını otomatik olarak kullanacak şekilde yapılandırın. poetry shell çalıştırdığınızda, ortamı proje içinde etkinleştirir. Docker ile birleştirildiğinde, tutarlılığı sağlamak için yerel testlerinizi konteyner içinde çalıştırabilirsiniz:

docker-compose run --rm app poetry run pytest

Bu komut, Docker Compose kurulumunuzda tanımlanan konteyneri başlatır, testleri çalıştırır ve ardından konteyneri siler. Test sonuçlarınızın makinenizde küresel olarak yüklü paketlerden etkilenmediğini garanti eder.

Sonuç

Tam bağımlılık çözümleme için Poetry'yi ortam izole etme için Docker ile entegre ederek geliştiriciler yerel ve CI/CD ortamları arasındaki sürtünmeyi ortadan kaldırabilir. Bu kurulum, CI/CD hatlarınızın güvenilirliğini artırmakla kalmaz, aynı zamanda yeni ekip üyeleri için onboarding sürecini de basitleştirir. Artık ortam özgü hatalarıyla uğraşmaya gerek yok—sadece temiz, yeniden üretilebilir kod yürütme.

Bu deseni benimsemek, olgun DevOps uygulamalarına doğru önemli bir adımdır. Geliştirme ortamınızı bugün konteynerize etmeye başlayın ve dağıtım güveninizin yükseldiğini izleyin.

Share: