CI/CD Python – Bölüm 3: Poetry, Docker ve Gelişmiş Yayınla Daha İleri Gitmek
Yayınlandı: 19 July 2025
Bu serinin ilk iki bölümünde, şunları yaptık : - İşlevsel bir CI/CD pipeline’ı oluşturuldu Python uygulaması için GitHub Actions ve PyPI ile - Bu pipeline’i çoklu-sürüm testleri, Test PyPI üzerinden aşamalı yayınlama ve kalite‑güvenlik araçlarıyla industrielle hâle getirdik.
Bu üçüncü bölümde, gideceğiz.PyPI’de basit bir yayınlamanın ötesindetam, güçlü ve profesyonel bir CI/CD zinciri oluşturmak için - şiirmodern bir paketleme ve optimize edilmiş bağımlılık yönetimi - Dockertekrarlanabilir ve çok platformlu derlemeler oluşturmak için. - Koşullu yayınrelease candidate gibi senaryoları yönetmek için - Otomasyon araçları(Renovate, Dependabot) pipeline’ı çaba sarf etmeden güncel tutmak için.
Intégration avec Poetry
Poetry, eski paketleme araçlarını (setup.py, requirements.txt) yerine kullanarak bağımlılık ve derleme yönetimini merkeziştirir içinde.pyproject.toml.
Poetry kurulumu
# Installer Poetry
curl -sSL https://install.python-poetry.org | python3 -
# Vérifier la version
poetry --version
Proje başlatma
# Initialiser un nouveau projet avec Poetry
poetry init
# Suivre l'assistant pour renseigner : nom, version, description, licence, dépendances.
Bu bir dosya oluşturur.pyproject.toml:
[tool.poetry]
name = "playlist-downloader"
version = "0.1.0"
description = "CLI tool for managing YouTube playlists"
authors = ["Christophe Hérolivier <[email protected]>"]
[tool.poetry.dependencies]
python = ">=3.8"
typer = "^0.9.0"
yt-dlp = "^2023.7.6"
google-api-python-client = "^2.0.0"
google-auth-oauthlib = "^1.0.0"
[tool.poetry.group.dev.dependencies]
pytest = "^7.0"
mypy = "^1.0"
bandit = "^1.7"
safety = "^2.3"
black = "^23.0"
ruff = "^0.1"
Bağımlılıkların eklenmesi ve kurulması
poetry add typer yt-dlp google-api-python-client google-auth-oauthlib
poetry add --group dev pytest mypy black bandit safety ruff
Poetry ile yayın
Poetry yayınlamayı yerleşik olarak yönetir :
# Publication sur Test PyPI
poetry publish --build --repository test-pypi
# Publication sur PyPI
poetry publish --build
Bu komut içinde bulunan bilgileri otomatik olarak kullanır.pyproject.toml.
Docker ile tekrarlanabilir derlemeler
Geliştirme, CI/CD ve üretim ortamlarında aynı yürütümleri sağlamak için Docker, Poetry ile mükemmel şekilde entegre olur.
Dockerfile örneği
FROM python:3.11-slim
WORKDIR /app
COPY pyproject.toml poetry.lock ./
RUN pip install poetry
RUN poetry install --no-root --only main
COPY . .
CMD ["poetry", "run", "python", "cli.py"]
Bu şunu garanti eder: Donmuş bir Python ortamı. - Kilitlenmiş bağımlılıklar aracılığıyla`poetry.lock`. Docker’ı destekleyen her sistemde çalıştırılabilir bir görüntü.
GitHub Actions’te entegrasyon
name: Docker Build
on:
push:
branches: [main]
jobs:
build-docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build Docker image
run: docker build -t ghcr.io/${{ github.repository }}:latest .
- name: Push Docker image
run: docker push ghcr.io/${{ github.repository }}:latest
Koşullu yayın
Bir profesyonel hattada, sadece belirli durumlarda yayın yapabilmek gerektir : - Sürüm adayları Test PyPI’ya. - Stabil sürümler PyPI’ye. Sadece tetiklenen Docker derlemeleri için`main`.
- name: Publish to Test PyPI
if: contains(github.ref, '-rc')
run: poetry publish --build --repository test-pypi
- name: Publish to PyPI
if: startsWith(github.ref, 'refs/tags/v')
run: poetry publish --build
Bu yaklaşım istenmeyen yayınları önler.
Renovate ve Dependabot ile bağımlılık otomasyonu
Bağımlılıklarınızın eski kalmasını önlemek için otomatik güncelleme araçları entegre edin.
Dependabot
version: 2
updates:
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
Dependabot her hafta bir PR açarak Python ve GitHub Actions bağımlılıklarını güncelliyor.
Yenilemek
{
"extends": ["config:base"],
"packageRules": [
{
"matchManagers": ["pip"],
"groupName": "python-dependencies",
"schedule": ["before 6am on monday"]
}
]
}
Renovate, daha hassas bir denetim sağlar: bağımlılık gruplama, planlama ve gelişmiş kurallar.
PlantUML diyagramları
Kullanım Senaryosu – Gelişmiş CI/CD
@startuml actor Developer actor GitHub as "GitHub Eylemler" actor PyPI actor DockerRegistry as "Docker Kayıt" actor Automation as "Yenile/Dependabot" Developer --> (Push code) (CI'yi tetikle) --> GitHub GitHub --> (Run Tests & Lint) GitHub --> (Build Docker Image) GitHub --> DockerRegistry GitHub --> (Publish to Test PyPI) GitHub --> (Promote to PyPI) Automation --> (Update Dependencies) @enduml
Dizi – Koşullu yayın
@startuml !theme vibrant left to right direction Developer -> GitHub: Etiği v1.2.3 gönder-rc GitHub -> CI: Testleri çalıştır CI -> CD: Yayın tipini kontrol et CD -> Test PyPI: RC yayınla Developer -> GitHub: Etiği v1.2.3 gönder GitHub -> CD: PyPI'a yayınla CD -> Docker Registry: Push Docker görüntü @enduml
Ortamlar – CI/CD ardın işlem hattı
@startuml [*] --> Idle Idle --> CI_Running : itmek CI_Running --> CI_Success : testler tamam CI_Running --> CI_Failed : Testler başarısız olur CI_Success --> CD_Running : Etiket algılandı CD_Running --> CD_Success : yayınla tamam CD_Running --> CD_Failed : hata CD_Success --> [*] @enduml
Dağıtım – CI/CD Mimari
@startuml
node "Geliştirici Makinesi" {
component "Git İstemcisi"
}
node "GitHub Eylemler" {
component "CI İş Akışı"
component "CD İş Akışı"
}
node "Paket Depoları" {
artifact "Test PyPI"
artifact "PyPI"
artifact "Docker Kayıt Defteri"
}
"Geliştirici Makinesi" --> "GitHub Eylemler"
"GitHub Eylemler" --> "Test PyPI"
"GitHub Eylemler" --> "PyPI"
"GitHub Eylemler" --> "Docker Kayıt Defteri"
@enduml
Sonuç
Bu üçüncü bölümde şunları öğrendik: Poetry ile Python paketlemeyi modernleştirin. Docker kullanarak tekrarlanabilir derlemeleri sağlayın - Koşullu yayın oluşturun. - Bağımlılıkların güncellemesini otomatikleştirme
Şimdi bir CI/CD pipeline’iniz var.tam, endüstriyel ve güvenli, projelerinizle gelişmeye hazır