En las dos primeras partes de esta serie, hemos : - Establecido un pipeline CI/CD funcional para una aplicación Python con GitHub Actions y PyPI. - Industrializado este pipeline con pruebas multi-versión, una publicación progresiva a través de Test PyPI, y herramientas de calidad y seguridad.

En esta tercera parte, vamos a irmás allá de la simple publicación en PyPIpara construir una cadena de CI/CD completa, robusta y profesional con: - Poesíapara un empaquetado moderno y una gestión optimizada de las dependencias. - DockerPara crear compilaciones reproducibles y multiplataforma. - Publicación condicionalpara gestionar escenarios como los candidatos de lanzamiento. - Herramientas de automatización(Renovate, Dependabot) para mantener el pipeline actualizado sin esfuerzo.

Integración con Poetry

Poetry reemplaza las antiguas herramientas de empaquetado (setup.py, requirements.txt) al centralizar la gestión de las dependencias y del build en`pyproject.toml`.

Instalación de Poetry

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

Inicialización del proyecto

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

Esto genera un archivo`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"

Adición e instalación de dependencias

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

Publicación con Poetry

Poetry gestiona nativamente la publicación:

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

# Publication sur PyPI
poetry publish --build

Este comando utiliza automáticamente la información presente en`pyproject.toml`.

Builds reproducibles con Docker

Para asegurar ejecuciones idénticas en desarrollo, CI/CD y producción, Docker se integra perfectamente con Poetry.

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

Esto garantiza: - Un entorno Python congelado. - Dependencias bloqueadas via`poetry.lock`. - Una imagen ejecutable en cualquier sistema que admita Docker.

Integración en 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

Publicación condicional

En un pipeline profesional, es necesario poder publicar solo en algunos casos : Candidatos de versión hacia Test PyPI. - Versiones estables a PyPI. - Construcciones de Docker desencadenadas únicamente para`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

Este enfoque evita las publicaciones accidentales.

Automatización de las dependencias con Renovate y Dependabot

Para evitar que sus dependencias se vuelvan obsoletas, incorpore herramientas de actualización automática.

Dependabot

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

Dependabot abre PR cada semana para actualizar las dependencias de Python y GitHub Actions.

Renovar

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

Renovate permite un control más fino: agrupamiento de dependencias, planificación y reglas avanzadas.

Diagramas PlantUML

Caso de Uso – CI/CD avanzado

usecase cicd

Secuencia – Publicación condicional

sequence cicd

Estados – Pipeline CI/CD

states cicd

Despliegue – Arquitectura CI/CD

deployment cicd

Conclusión

En esta tercera parte, hemos visto cómo : - Modernizar el empaquetado de Python con Poetry. - Garantizar compilaciones reproducibles mediante Docker. - Configurar una publicación condicional. - Automatizar la actualización de las dependencias.

Ahora dispone de un pipeline CI/CDcompleto, industrializado y seguro, listo para evolucionar con sus proyectos.

Articles connexes