CI/CD Python – Partie 3 : Aller plus loin avec Poetry, Docker et la publication avancée

19 July 2025

Dans les deux premières parties de cette série, nous avons : - Établi un pipeline CI/CD fonctionnel pour une application Python avec GitHub Actions et PyPI. - Industrialisé ce pipeline avec des tests multi-versions, une publication progressive via Test PyPI, et des outils de qualité et de sécurité.

Dans cette troisième partie, nous allons aller au-delà de la simple publication sur PyPI pour construire une chaîne de CI/CD complète, robuste et professionnelle avec : - Poetry pour un packaging moderne et une gestion optimisée des dépendances. - Docker pour créer des builds reproductibles et multi-plateformes. - Publication conditionnelle pour gérer des scénarios comme les release candidates. - Outils d’automatisation (Renovate, Dependabot) pour maintenir le pipeline à jour sans effort.

Intégration avec Poetry

Poetry remplace les anciens outils de packaging (setup.py, requirements.txt) en centralisant la gestion des dépendances et du build dans pyproject.toml.

Installation de Poetry

# Installer Poetry
curl -sSL https://install.python-poetry.org | python3 -
# Vérifier la version
poetry --version

Initialisation du projet

# Initialiser un nouveau projet avec Poetry
poetry init
# Suivre l'assistant pour renseigner : nom, version, description, licence, dépendances.

Cela génère un fichier pyproject.toml :

[tool.poetry]
name = "playlist-downloader"
version = "0.1.0"
description = "CLI tool for managing YouTube playlists"
authors = ["Christophe Hérolivier <cheroliv@example.com>"]

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

Ajout et installation de dépendances

poetry add typer yt-dlp google-api-python-client google-auth-oauthlib
poetry add --group dev pytest mypy black bandit safety ruff

Publication avec Poetry

Poetry gère nativement la publication :

# Publication sur Test PyPI
poetry publish --build --repository test-pypi

# Publication sur PyPI
poetry publish --build

Cette commande utilise automatiquement les informations présentes dans pyproject.toml.

Builds reproductibles avec Docker

Pour assurer des exécutions identiques en développement, CI/CD et production, Docker s’intègre parfaitement avec Poetry.

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

Cela garantit : - Un environnement Python figé. - Des dépendances verrouillées via poetry.lock. - Une image exécutable sur tout système supportant Docker.

Intégration dans 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

Publication conditionnelle

Dans un pipeline professionnel, il faut pouvoir publier uniquement dans certains cas : - Release candidates vers Test PyPI. - Versions stables vers PyPI. - Builds Docker déclenchés uniquement pour 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

Cette approche évite les publications accidentelles.

Automatisation des dépendances avec Renovate et Dependabot

Pour éviter que vos dépendances deviennent obsolètes, intégrez des outils de mise à jour automatique.

Dependabot

version: 2
updates:
  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "weekly"
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"

Dependabot ouvre des PR chaque semaine pour mettre à jour les dépendances Python et GitHub Actions.

Renovate

{
  "extends": ["config:base"],
  "packageRules": [
    {
      "matchManagers": ["pip"],
      "groupName": "python-dependencies",
      "schedule": ["before 6am on monday"]
    }
  ]
}

Renovate permet un contrôle plus fin : regroupement de dépendances, planification, et règles avancées.

Diagrammes PlantUML

Cas d’Usage – CI/CD avancé

usecase cicd

Séquence – Publication conditionnelle

sequence cicd

États – Pipeline CI/CD

states cicd

Déploiement – Architecture CI/CD

deployment cicd

Conclusion

Dans cette troisième partie, nous avons vu comment : - Moderniser le packaging Python avec Poetry. - Garantir des builds reproductibles via Docker. - Mettre en place une publication conditionnelle. - Automatiser la mise à jour des dépendances.

Vous disposez désormais d’un pipeline CI/CD complet, industrialisé et sécurisé, prêt à évoluer avec vos projets.