5.4 · Despliegue & CI/CD (GitHub Actions, cloud)

Nivel 5 · Nivel pro e industrialización

5.4Despliegue & CI/CD (GitHub Actions, cloud)

Objetivo: Poner en producción una app Python y automatizar tests + despliegue.
Tiempo estimado: 16 min · lectura autónoma · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

Lo esencial en 30 segundos

  • CI guardiana : en cada push, checkout → install → ruff + pytest — el rojo bloquea, el verde autoriza.
  • Entregar versionado : imagen Docker al registro o plataforma conectada al depósito — cada puesta en línea es trazable.
  • Prod sobria : secretos fuera del YAML, logs y /health, rollback probado — desplegar es poder volver.

Mini-caso hilado — Nabil publica en línea en Argel

El análisis contenerizado de Nabil gira bien — pero solo en los puestos del equipo en Argel. Lo pone en línea : depósito Git conectado, workflow GitHub Actions que lanza ruff y pytest en cada push, imagen versionada entregada en una plataforma conectada al depósito, logs y endpoint de salud en su sitio. Último episodio de los casos 5.1-5.3 — Nabil cierra del código pro a la app viva.

Último episodio de los casos 5.1-5.3 — Nabil cierra diseño, async y Docker con la puesta en producción.

1. La CI : probar en cada push

El workflow GitHub Actions es el guardián : checkout → instalar Python → pip install -r requirements → ruff + pytest. Cada push se prueba en minutos : el rojo bloquea la fusión, el verde autoriza. La CI no es una opción que se « pondrá más tarde » — está en su sitio desde el primer test. Nabil provoca voluntariamente un fallo para ver la alerta : el día que falle de verdad, sabrá leer el rojo.

La insignia verde del README prueba la exigencia : estilo + tests en cada cambio, sin intervención humana.

2. Entregar : imagen o plataforma

Dos vías complementarias. La imagen Docker subida al registro (ver 5.3) : trazable, reproducible, desplegada donde se quiera. O la plataforma conectada al depósito (tipo Render, Railway, Fly y equivalentes) : cada push verde actualiza el sitio automáticamente — simple para empezar. Secretos en secrets del depósito, nunca en el YAML : la prod se configura, no se codifica. Nabil compara las ofertas al elegir (las fórmulas evolucionan) y apunta a la vía simple primero, el control después.

En ambos casos, cada entrega está versionada (tags, SHA) : se sabe exactamente qué hay en línea.

3. El mínimo prod : logs, salud, rollback

Desplegar = poder volver. El mínimo : logs estructurados (logging), endpoint /health para la supervisión, versiones para volver atrás. Sin rollback probado, cada puesta en prod es un salto sin paracaídas. Nabil prueba el retorno antes de la gran noche : el día de un incidente, restaura en lugar de improvisar — y hace validar la elección de infraestructura y los accesos por su DSI antes de exponer datos reales.

Sin este trío, no se despliega : se apuesta.

Error frecuente de interpretación: « La CI, la pondremos más tarde — y los secretos pueden quedarse en el YAML, es práctico ». No. Sin CI desde el primer test, las regresiones salen a prod en silencio ; más tarde es nunca. Y un secreto en el YAML versionado queda legible para quien acceda al depósito : secretos en secrets del depósito / variables de entorno, nunca en claro.
Entregar con confianza Probar en CI, entregar versionado, volver si hace falta CI (ruff+pytest) Probaren cada pushEntrega (versionada) Imageno plataformaRollback (probado) Volversi hace falta
Probar en CI, entregar versionado, volver si hace falta
Versión en texto del esquema (SEO / lectores de pantalla / traducción): 1) CI : Nabil sube (push) en Argel, el workflow instala y lanza ruff + pytest — el rojo bloquea. 2) Entrega : si verde, imagen versionada o plataforma conectada pone en línea. 3) Prod : logs, /health y rollback probado ; secretos fuera del YAML. Lección : probar, entregar versionado, poder volver.

🔎 Ejemplo concreto — El workflow de Nabil

Estilo + tests en cada push, insignia verde en prueba.

name: ci
on: [push]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with: {python-version: "3.12"}
      - run: pip install -r requirements.txt
      - run: ruff check . && pytest -q

Lectura : estilo + tests en cada push — el rojo bloquea la fusión.

Lección : la insignia verde del README prueba la exigencia en continuo.

Vocabulario de la sección

Despliegue
Hacer la app accesible en línea, fuera de vuestro puesto.

Ejemplo sencillo: El análisis de Nabil deja localhost por una dirección pública.

Lo que no es: un script que solo gira en su PC.

Reflejo: ¿mi app es alcanzable fuera de mi puesto?

CI
Probar automáticamente cada cambio, desde el primer test.

Ejemplo sencillo: Cada push de Nabil lanza ruff y pytest.

Lo que no es: tests lanzados a mano cuando se piensa.

Reflejo: ¿un push puede pasar sin prueba?

Pipeline
Serie de pasos auto (tests, build, despliegue) activada en cada push.

Ejemplo sencillo: El workflow de Nabil : instalar, controlar, probar.

Lo que no es: una puesta en línea manual a base de copiar-pegar.

Reflejo: ¿mi entrega es reproducible?

GitHub Actions
Pipelines descritos en YAML versionado en .github/workflows.

Ejemplo sencillo: El archivo ci.yml de Nabil, releído como código.

Lo que no es: un servidor misterioso que despliega no se sabe cómo.

Reflejo: ¿mi pipeline está versionado y es releíble?

Rollback
Volver a la versión anterior, probado antes de necesitarlo.

Ejemplo sencillo: Nabil restaura la versión anterior tras un incidente.

Lo que no es: reparar en pánico directamente en prod.

Reflejo: ¿he probado mi vuelta atrás?

En la práctica — Automatizar tests y despliegue

  1. Versionad vuestro proyecto con Git y subidlo a un depósito GitHub (git init, add, commit, push).
  2. Cread un workflow GitHub Actions (.github/workflows/ci.yml) que instale las dependencias y lance pytest en cada push.
  3. Verificad en la pestaña « Actions » que el pipeline se ejecuta y pasa en verde ; provocad un fallo de test para ver la alerta.
  4. Desplegad la aplicación en una plataforma cloud (Render/Railway) conectada al depósito : cada push actualiza el sitio automáticamente.
Tenéis un pipeline CI/CD que prueba y despliega automáticamente en cada modificación : vuestra aplicación está en línea, fiable y mantenida. ¡Recorrido cerrado!

Guion listo para decir — anunciar la puesta en línea

« Nuestro análisis está listo para salir de localhost : pongo la CI desde el primer test — ruff y pytest en cada push, el rojo bloquea. Entrego versionado vía la plataforma conectada al depósito, secretos en secrets del depósito, logs y endpoint de salud en su sitio, rollback probado. Antes de exponer datos reales, hago validar la infraestructura y los accesos por la DSI. »

Para decir al responsable para validar la puesta en línea y el circuito DSI sobre los datos sensibles.

Modelo copiar-pegar — workflow CI Python genérico

name: ci
on: [push]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with: {python-version: "3.12"}
      - run: pip install -r requirements.txt
      - run: ruff check . && pytest -q

Solo / presupuesto pequeño

Nabil solo : el workflow mínimo (ruff + pytest) basta — la CI gratuita del depósito guarda la prod.

PYME / equipo reducido

Insignia verde + rojo que bloquea la fusión : nadie entrega sin prueba, ni con prisa.

PYME en Argel

Nabil hace validar alojador, accesos y copias por la DSI en Argel antes de exponer datos reales.

Equipo que empieza

Pareja : uno escribe el workflow, el otro verifica secretos, /health y rollback ; revisión antes de la primera prod.

Prudencia: Secretos : no pongáis nunca identificadores, claves ni tokens en claro en el YAML, el código o el depósito — usad los secrets del depósito y las variables de entorno. Costes cloud : las fórmulas y tramos evolucionan a menudo, comparad las ofertas y vigilad el consumo al elegir, sin comprometeros a ciegas. Datos sensibles : haced validar la elección de infraestructura y los accesos por la DSI (y un jurista si hace falta) antes de exponer datos reales.

✓ Buenas prácticas

  • CI desde el primer test : el verde autoriza, el rojo bloquea.
  • Secretos en secrets del depósito, nunca en claro en el YAML.
  • Rollback probado antes de la prod : desplegar es poder volver.

✗ Errores frecuentes

  • « Pondremos la CI más tarde » (las regresiones salen en silencio).
  • Secretos en claro en el YAML versionado.
  • Desplegar sin vuelta posible ni supervisión (/health, logs).

Puntos clave

  • El despliegue hace la aplicación accesible en línea (cloud/PaaS).
  • La CI/CD automatiza tests y puesta en línea en cada cambio del código.
  • GitHub Actions describe los pipelines en un archivo YAML versionado.
  • Git/GitHub es la base : versionado, colaboración y disparador de los pipelines.

Reto 48h — aplica mañana

Añadid el workflow anterior a 1 depósito : ¿sube en verde — y el rojo bloquea tras un fallo provocado?

Lista de salida de la sección
  • Puedo explicar CI vs CD en una frase.
  • Mi workflow prueba en cada push (verde probado).
  • Sé dónde van los secretos (fuera del YAML).
Autoevaluación 1-5 : ¿mi entrega está probada y es trazable?¿ningún secreto ronda por mi depósito?

Preguntas frecuentes

¿Qué aporta la CI/CD frente a un despliegue manual?

Elimina los errores humanos y el tiempo perdido : en cada modificación, los tests se ejecutan automáticamente y, si pasan, la aplicación se pone en línea sin intervención. Se entrega más a menudo, más rápido y más seguro — un estándar de los equipos modernos. Y el rojo que bloquea la fusión vale todas las llamadas al orden.

¿Dónde alojar una aplicación Python a menor coste?

Plataformas conectadas al depósito (tipo Render, Railway, Fly y equivalentes) proponen tramos de entrada y un despliegue automático desde GitHub : ideal para empezar. Para más control, las grandes clouds son más potentes pero más complejas — por reservar a las necesidades que lo justifiquen. Comparad las ofertas al elegir (evolucionan) y haced validar por la DSI antes de exponer datos sensibles.

Comprueba tu comprensión

¿Qué hace un pipeline CI/CD (p. ej. GitHub Actions)?

Recursos adicionales (opcional, para ir más allá)

Examen del nivel 5Preguntas inéditas y más difíciles para validar tus conocimientos