Configuración de GitHub Actions para CI/CD con Python

Clase 8 de 17Curso de Python Profesional: Arquitectura de Proyectos, Entornos y PyPI

Resumen

Automatiza la calidad de tu código con GitHub Actions: configura Continuous Integration y Continuous Deployment para ejecutar ruff, mypy y pytest en cada push y pull request. Así detectas errores de estilo, tipado y pruebas antes de llegar a producción y evitas diferencias entre entornos.

¿Cómo configurar GitHub Actions para CI/CD en Python con ruff, mypy y pytest?

La integración continua ejecuta pruebas y validaciones automáticamente al integrar cambios con frecuencia. La entrega continua va más allá automatizando el despliegue. Con Actions, puedes crear un workflow que corra en cada push y en cada pull request hacia ramas clave.

  • Problema común: funciona local, falla en otro entorno por configuraciones o dependencias distintas.
  • Solución: automatizar validaciones de estilo con ruff, tipado estático con mypy y pruebas unitarias con pytest.
  • Beneficio: calidad consistente y detección temprana de errores.

¿Qué eventos disparan el workflow y cómo ahorrar minutos?

Define cuándo corre la Action con la llave on. Se recomienda limitar a ramas críticas para optimizar minutos.

  • Ejecutar en push solo en branches main y develop.
  • Ejecutar en pull request únicamente hacia main.
  • Repos públicos: gratis. Repos privados: 2000 minutos gratis; adminístralos y evita validar ramas WIP.

Ejemplo de disparadores y estructura mínima:

ame: Code style

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  python:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      # - name: Instalar UV
      #   run: <comando de instalación de UV>
      - name: ruff check
        run: V run ruff check
      - name: ruff format
        run: V run ruff format
      - name: mypy
        run: V run mypy src
      - name: pytest
        run: V run pytest -n auto

¿Qué pasos y comandos ejecuta el pipeline?

En el job se usa Ubuntu automáticamente. Los pasos típicos incluyen:

  • Checkout del repositorio.
  • Instalar UV para ejecutar comandos de Python.
  • ruff check: valida reglas de estilo y errores como E501 (línea muy larga).
  • ruff format: formatea el código automáticamente.
  • mypy src: analiza tipos solo en la carpeta src.
  • pytest -n auto: ejecuta pruebas aprovechando múltiples núcleos.

¿Cómo corregir fallos de estilo y tipado en la pipeline?

Si falla ruff por E501 (línea muy larga), corrige el archivo y valida con un flujo de git ordenado.

  • git pull para traer cambios recientes.
  • Crear rama: git switch -c fixed-pep8.
  • Editar el archivo, por ejemplo quitando el comentario que rompe PEP8.
  • git add y git commit (pasa validaciones de pre-commit).
  • git push y abrir el pull request.
  • Verifica en la pestaña Actions que los checks corren en el PR.

Cuando ruff y mypy pasen, puede fallar pytest si faltan variables de entorno como un API key. Los tests no deben usar claves reales; solo comprobar que existen.

¿Cómo inyectar variables de entorno seguras en pytest?

Agrega env en el paso de pytest con valores falsos, suficientes para que los tests encuentren las variables.

- name: pytest
  env:
    # define las variables usadas en tu .env con valores NO reales
    API_KEY: "this is not a API key"
    # API_SECRET: "this is not a API key"
    # PROJECT_ID: "dummy"
  run: V run pytest -n auto
  • Haz commit y push de la actualización del workflow.
  • Revisa el PR: ruff, mypy y pytest deben pasar en segundos.

¿Qué buenas prácticas fortalecen tu CI/CD con GitHub Actions?

Adopta hábitos que mantengan tu flujo estable y rápido.

  • Crear el workflow desde la pestaña Actions y partir de ejemplos oficiales de las librerías.
  • Usar actions reusables desde la documentación de cada herramienta para mayor flexibilidad.
  • Considerar la funcionalidad de cache disponible en la action de ruff para mejorar tiempos.
  • Nombrar el workflow (por ejemplo, Code style) para identificar los checks fácilmente.
  • Limitar on a main y develop, y pull requests hacia main, para cuidar minutos.
  • Ejecutar pytest con -n auto para paralelizar pruebas.
  • Mantener variables sensibles fuera del repo; usar valores dummy en env del workflow.

¿Te gustaría que revisemos tu YAML de Actions o que integremos otra herramienta de calidad? Comenta tus dudas y ajustes deseados.