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

usecase cicd

Sequenz – Bedingte Veröffentlichung

sequence cicd

Zustände – CI/CD-Pipeline

states cicd

Bereitstellung – CI/CD-Architektur

deployment cicd

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

Verwandte Artikel