Yeda AI Tips · #137

English

Ordena las etapas de CI de la más barata a la más costosa

Tu CI pierde diez minutos atrapando un typo que el lint podría marcar en treinta segundos. La solución no es una máquina más rápida — es el orden. Ejecuta primero los chequeos más baratos y con más probabilidad de fallar, y un commit malo muere en segundos en vez de después de toda la suite de tests.

Por qué el orden le gana a la potencia

Cuanto más tarde se detecta un defecto, más cuesta arreglarlo. Las cifras del IBM Systems Sciences Institute, muy citadas, ubican un defecto encontrado en diseño en 1x, en implementación ~6.5x, en testing ~15x, y después del release 60–100x. La misma lógica aplica dentro de una sola corrida de CI a escala de minutos: un typo atrapado por el lint te cuesta 30 segundos; ese mismo typo detectado recién cuando el job de tests revienta te cuesta toda la corrida de diez minutos más el cambio de contexto.

Así que el objetivo de un pipeline no es solo "ejecutar cada chequeo". Es exponer el fallo más barato lo antes posible. Cada segundo que un commit condenado pasa en tus etapas lentas es puro desperdicio.

La regla de ordenamiento

Ordena las etapas por dos ejes y ejecútalas en este orden: lo barato y frágil primero, lo costoso y sólido al final.

EtapaTiempo típicoDetectaOrden
Formato + lintsegundosEstilo, typos, imports sin usar, bugs obvios
Type-checksegundos–1 minFirmas incorrectas, mal uso de null, APIs renombradas
Tests unitarios + integraciónminutosLógica, regresiones
Build / empaquetado / deployminutos+Bundling, artefactos, cableado de entorno

Léelo de arriba hacia abajo: el lint falla ante un typo antes de que el type-checker siquiera arranque; el type-checker rechaza una firma mala antes de que corra un solo test; los tests atrapan la lógica antes de que gastes un build. Cada compuerta es más barata y con más chance de dispararse que la de abajo, así que el commit promedio que falla sale temprano.

Haz que CI realmente se detenga temprano

El orden solo rinde si una etapa fallida bloquea la siguiente. En GitHub Actions, encadena jobs con needs para que un job costoso nunca arranque hasta que su predecesor barato esté en verde:

jobs:
  lint:
    runs-on: ubuntu-latest
    steps: [ { uses: actions/checkout@v4 }, { run: make lint } ]
  typecheck:
    needs: lint
    runs-on: ubuntu-latest
    steps: [ { uses: actions/checkout@v4 }, { run: make typecheck } ]
  test:
    needs: typecheck
    runs-on: ubuntu-latest
    steps: [ { uses: actions/checkout@v4 }, { run: make test } ]

Si un job del que depende (needs) un job posterior falla o se omite, GitHub Actions omite el job dependiente por defecto — así que test nunca corre cuando lint está en rojo.

Movimientos avanzados

El beneficio

Ahora un typo falla rápido y fuerte en segundos, no después de una corrida de diez minutos. Tus etapas lentas y costosas solo corren sobre commits que ya pasaron las baratas — así que tus minutos de runner, y tu atención, van a los cambios que de verdad los merecen.

Recursos

¿Envías código asistido por IA a toda velocidad? Yeda AI diseña y audita los pipelines que evitan que la velocidad se convierta en roturas.

Habla con nosotros · Lee el blog