Atlasingeniería

Incidentes en un servidor propioDeploys que fallan por la mitadTema 4

Verificar local: el CI no es el lugar donde se descubren los errores

Tres pushes seguidos para arreglar un error de tipos que el chequeo local mostraba en quince segundos. Qué conviene correr antes de pushear, y cómo se ordena la verificación cuando el servidor es chico y hay varias cosas corriendo.

El ciclo es reconocible: se pushea, el pipeline falla por un error de tipos, se arregla, se pushea de nuevo, falla por el formato, se arregla, se pushea. Tres corridas de varios minutos cada una para resolver algo que localmente se veía en quince segundos.

No es sólo tiempo perdido: es atención fragmentada, porque entre push y push uno se fue a otra cosa.

Para qué sirve cada cosa

DóndeQué corresponde verificar ahíPor qué
Local, antes de commitearTipos, formato, tests del alcance tocadoEs lo más rápido y lo que más falla
Local, antes de pushearLa suite completa y el buildEs exactamente lo que va a correr el pipeline
El pipelineReproducir en un entorno limpio y publicar el artefactoVerifica que no dependa de la máquina de nadie
El pipeline confirma; no es donde uno se entera.

Esa última fila es su valor real: garantizar que lo que funciona en una máquina funciona en un entorno limpio, con las dependencias declaradas. Usarlo como primer detector de errores desperdicia ese rol y alarga el ciclo.

Un orden que no cuesta nada

De más barato a más caro

  1. Chequeo de tipos. Segundos, y atrapa la mayoría de lo que rompe el pipeline.
  2. Formato y reglas de estilo, que además evitan el ruido en el diff.
  3. Los tests de lo que tocaste. No la suite entera: el archivo o el módulo.
  4. La suite completa y el build, una sola vez, antes de pushear.

El costo que no se ve

Cuando el pipeline corre en un servicio con minutos incluidos, cada push fallido consume una cuota que se agota. En un mes de tres pushes por arreglo, el gasto se multiplica por tres.

Antes de seguir, predecí

Se terminó un bloque de trabajo con cambios en cinco archivos. ¿Qué conviene?

Y hay un efecto sobre el equipo: un pipeline que falla seguido por errores triviales entrena a ignorar el rojo, y el día que falla por algo importante nadie lo mira distinto.

Que no dependa de acordarse

Tres formas, de menos a más

  1. Un solo comando de verificación en el proyecto, que corra todo lo que corre el pipeline. Si hay que recordar cuatro comandos, alguno se olvida.
  2. Un gancho previo al commit para lo barato —tipos y formato— y sólo para eso: si tarda más de unos segundos, la gente lo saltea.
  3. La misma definición en los dos lados. Que el comando local y el paso del pipeline ejecuten exactamente lo mismo, para que no haya sorpresas por diferencias de configuración.
Más a fondo · nivel seniorCuando el pipeline sí tiene que encontrar algo

Hay verificaciones que no conviene correr localmente: matrices de versiones, pruebas contra servicios reales, análisis de dependencias que requieren red, escaneos que tardan. Ésas son el trabajo legítimo del pipeline, y ahí el ciclo largo se justifica. La distinción es entre lo que falla por algo propio —que se ve local en segundos— y lo que sólo se puede comprobar en un entorno que uno no tiene.

Las tres corridas que se podían evitar

Buscá en el log

Tres corridas del pipeline para un cambio de dos archivos. ¿Qué línea muestra el error que se veía localmente en quince segundos?

debug 0info 8warn 0error 412 de 12

Qué corresponde a cada lugar

DóndeQué verificaPor qué ahí
El editortipos y formato mientras se escribeel ciclo más corto posible
Antes del commitformato y linter sobre lo que cambiósegundos, y sólo sobre lo tocado
Antes del pushtipos y tests rápidosquince segundos contra tres minutos de pipeline
El pipelineentorno limpio, matriz de versiones, tests lentos, desplieguelo que la máquina propia no puede
El reparto tiene una regla simple: cada verificación va en el lugar más temprano donde sea confiable. Lo que la máquina propia puede responder no debería costar una corrida del pipeline.

Cierre

Autoevaluación

¿Lo entendiste?

¿Cuál es el rol propio del pipeline?
¿Por qué no conviene correr la verificación completa después de cada archivo en un servidor compartido?