CI/CD Python – Teil 3: Weiter gehen mit Poetry, Docker und der erweiterten Veröffentlichung
Publié le 19 July 2025
In den ersten beiden Teilen dieser Serie haben wir: - Ein funktionsfähiges CI/CD-Pipeline für eine Python-Anwendung mit GitHub Actions und PyPI eingerichtet. - Industrialisiere diese Pipeline mit Multi-Version-Tests, einer schrittweisen Veröffentlichung über Test PyPI und Qualitäts- und Sicherheitswerkzeugen.
In diesem dritten Teil werden wir gehen.über die bloße Veröffentlichung auf PyPI hinausum eine vollständige, robuste und professionelle CI/CD-Pipeline mit: - Poesiefür ein modernes Packaging und ein optimiertes Abhängigkeitsmanagement. - Dockerum reproduzierbare und plattformübergreifende Builds zu erstellen. - bedingte Veröffentlichungum Szenarien wie release candidates zu verwalten. - Automatisierungstools(Renovate, Dependabot) um die Pipeline auf dem neuesten Stand zu halten, ohne Aufwand.
Integration mit Poetry
Poetry ersetzt die alten Verpackungstools (setup.py, requirements.txt), indem es die Verwaltung der Abhängigkeiten und des Builds zentralisiert in`pyproject.toml`.
Installation von Poetry
# Installer Poetry
curl -sSL https://install.python-poetry.org | python3 -
# Vérifier la version
poetry --version
Initialisierung des Projekts
# Initialiser un nouveau projet avec Poetry
poetry init
# Suivre l'assistant pour renseigner : nom, version, description, licence, dépendances.
Dies erzeugt eine Datei`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"
Hinzufügen und Installieren von Abhängigkeiten
poetry add typer yt-dlp google-api-python-client google-auth-oauthlib
poetry add --group dev pytest mypy black bandit safety ruff
Veröffentlichung mit Poetry
Poetry unterstützt die Veröffentlichung nativ:
# Publication sur Test PyPI
poetry publish --build --repository test-pypi
# Publication sur PyPI
poetry publish --build
Dieser Befehl verwendet automatisch die darin vorhandenen Informationen`pyproject.toml`.
Reproduzierbare Builds mit Docker
Um konsistente Ausführungen in Entwicklung, CI/CD und Produktion sicherzustellen, integriert sich Docker nahtlos mit Poetry.
Beispiel Dockerfile
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"]
Das garantiert : Eine eingefrorene Python-Umgebung. - Abhängigkeiten, die via verriegelt sind`poetry.lock`. - Ein auf jedem System mit Docker-Unterstützung ausführbares Image.
Integration in GitHub Actions
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
Bedingte Veröffentlichung
In einem professionellen Pipeline muss es möglich sein, nur in bestimmten Fällen zu veröffentlichen: - Release candidates zu Test PyPI. - Stabile Versionen zu PyPI. - Docker-Builds, die nur für`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
Dieser Ansatz verhindert versehentliche Veröffentlichungen.
Automatisierung der Abhängigkeiten mit Renovate und Dependabot
Um zu verhindern, dass Ihre Abhängigkeiten veraltet werden, integrieren Sie Tools für automatische Updates.
Dependabot
version: 2
updates:
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
Dependabot öffnet jede Woche PRs, um die Python- und GitHub-Actions-Abhängigkeiten zu aktualisieren.
renovieren
{
"extends": ["config:base"],
"packageRules": [
{
"matchManagers": ["pip"],
"groupName": "python-dependencies",
"schedule": ["before 6am on monday"]
}
]
}
Renovate ermöglicht eine feinere Kontrolle: Abhängigkeitsgruppierung, Zeitplanung und erweiterte Regeln.
PlantUML-Diagramme
Anwendungsfall – erweiterter CI/CD
Sequenz – Bedingte Veröffentlichung
Zustände – CI/CD-Pipeline
Bereitstellung – CI/CD-Architektur
Fazit
In diesem dritten Teil haben wir gesehen, wie: Modernisiere das Python-Packaging mit Poetry. - Sicherstellen von reproduzierbaren Builds via Docker. - Eine bedingte Veröffentlichung einrichten. - Automatisiere die Aktualisierung der Abhängigkeiten.
Sie verfügen nun über eine CI/CD-Pipelinevollständig, industrialisiert und gesichert, bereit, sich mit Ihren Projekten weiterzuentwickeln