🔧 Arreglé los deploys automáticos (OpenHarness)

Bugs que hacían fallar los deploys de casi todos los proyectos. Contexto + explicación simple.

Contexto

¿Qué es esto y por qué importa?

OpenHarness es nuestra herramienta de CI/CD: cuando alguien hace git push, ella construye la app y la deploya sola a Railway (staging o producción). Cada proyecto tiene un "pipeline" = una cadena de pasos: buildear la imagen → deployar.

El problema: esos pipelines venían fallando. Los deploys no llegaban a producción/QA, o quedaban en rojo al azar. Encontré 3 causas de raíz — ninguna era del código de las apps, todas eran de configuración del pipeline.

TL;DR (si te preguntan en 10 segundos)
  • Los deploys automáticos fallaban por 3 bugs de configuración en los pipelines.
  • Los arreglé en todos los proyectos (WIG, Blue Butterfly, Civis, Mira, Match-Party, Trail, Loving-Ark…).
  • Ahora los deploys por push funcionan y son estables. Nada de esto tocó el código de las apps.
1

Nombre de imagen inválido Bug C

Qué pasaba
El paso de "buildear la imagen" moría al instante y el deploy nunca corría.
Por qué
Al nombrar la imagen se usaba {{shortSha}} (doble llave, estilo GitHub Actions), pero OpenHarness usa llave simple {shortSha}. El nombre quedaba literal con las llaves y Docker lo rechazaba.
📦 Es como mandar un paquete y escribir la dirección con corchetes: [calle del cliente] en vez de la calle real. El correo lo rechaza.
El fix
- imagen: …/wig-frontend:{{shortSha}} → quedaba :{cd5ca8ce} ❌
+ imagen: …/wig-frontend:{shortSha} → queda :cd5ca8ce ✅
→ El build vuelve a pasar y el deploy corre.
2

Credencial de deploy vacía Bug Token

Qué pasaba
Aunque el build pasara, al deployar fallaba con Invalid RAILWAY_TOKEN.
Por qué
El comando seteaba la credencial en vacío: RAILWAY_TOKEN="", en vez de usar el token real (que ya estaba como secreto). Sin credencial, Railway rechazaba el deploy.
🔑 Es como llegar a la puerta con la tarjeta correcta en el bolsillo… pero pasar una tarjeta en blanco por el lector. No abre, aunque la buena la tenías ahí.
El fix
- export RAILWAY_TOKEN=""
+ export RAILWAY_TOKEN="$RAILWAY_TOKEN_FWG_PROD" (apunta al secreto que ya existía)
→ El deploy autentica y sube a Railway.
3

Descarga inestable de la herramienta Bug A

Qué pasaba
Deploys que se caían al azar, sin razón aparente (socket hang up).
Por qué
En cada deploy, el pipeline descargaba la CLI de Railway desde internet (GitHub). Esa descarga a veces fallaba por un hipo de red → el deploy entero se caía.
🛠️ Es como ir a arreglar algo y, cada vez, pasar primero por la ferretería a comprar la misma llave inglesa. Si un día está cerrada, no podés trabajar — aunque el arreglo no tenga nada que ver.
El fix
- imagen base: node:22 → baja la CLI de GitHub en cada run (inestable)
+ imagen base: openharness-railway:v1 → ya trae la CLI adentro (cero descarga)
→ Sin descarga = sin fallas al azar. Deploys estables.
Resultado

Aplicado en todos los proyectos ✅

Verifiqué con un scan que ningún pipeline queda con estos bugs:

WIG frontendBlue ButterflyCivis MiraMatch-PartyTrail-Analytics Loving-ArkSonarClaw

Todo se hizo solo en la config de los pipelines (vía la API de OpenHarness) — sin tocar el código de ninguna app, sin riesgo de regresión. Los 3 son "falla-segura": si algo salía mal, el pipeline fallaba, nunca deployaba algo roto.

Contexto

¿Por qué un PR de código además de los fixes de config?

Los fixes de la otra pestaña arreglan la configuración de cada pipeline (uno por uno). Pero encontré 3 debilidades en el motor de OpenHarness (su código) que causaban o agravaban esas fallas. Arreglarlas hace que estos problemas no puedan volver en ningún proyecto — es la red de seguridad de fondo.

👉 PR: adavance-it/openharness #1

1

Contenedor con el nombre ocupado Código

Qué pasaba
Un deploy fallaba de entrada con The container name is already in use.
Por qué
Cuando un paso se pasa de tiempo, el motor mata el contenedor "en segundo plano" sin esperar a que termine. Si esa limpieza no completa, el contenedor queda colgado con su nombre ocupado. El siguiente run intenta crear otro con el mismo nombre → choca.
🚪 Es como reservar una sala con tu nombre, pero la reserva anterior nunca se canceló. Llegás y "esa sala ya está ocupada" — aunque no haya nadie adentro.
El fix
+ antes de arrancar: borrar cualquier contenedor viejo con ese nombre (docker rm -f)
+ (y al timeout: rm -f en vez de solo kill, para liberar el nombre sí o sí)
→ El nombre siempre queda libre. No más "name already in use".
2

Un hipo de red mata el build entero Código

Qué pasaba
Builds que se caían al azar bajando algo de internet (ej. Failed to fetch Figtree from Google Fonts).
Por qué
El paso de build corría docker build una sola vez, sin reintento. Si justo había un hipo de red al bajar la imagen base, paquetes de npm, o las fuentes que Next descarga en el build, el build entero se caía — aunque un simple reintento habría andado.
📡 Es como que se te corte internet 1 segundo justo mientras bajás un archivo, y en vez de reintentar, se cancele toda la instalación.
El fix
+ reintentar el build hasta 3 veces, SOLO ante errores de red transitorios
- (errores "de verdad" — falta un archivo, error de compilación — fallan al toque, sin reintentar)
→ Los hipos de red ya no rompen el deploy. Cubre a todos los proyectos de una.
3

Endurecer el reemplazo del nombre de imagen Código

Qué pasaba
Es la causa de fondo del Bug C (pestaña anterior): el motor no toleraba las llaves dobles.
Por qué
El motor solo entendía llaves simples {shortSha}. Si alguien escribía llaves dobles {{shortSha}} (costumbre de GitHub Actions), quedaba literal y rompía el build en silencio.
🔤 Es como un formulario que solo acepta la fecha con barras (13/08) y si la escribís con guiones (13-08) explota sin avisar. Mejor que la acepte de las dos formas.
El fix
+ el motor ahora acepta llaves dobles y las convierte a simples antes de resolver
→ El Bug C no puede volver a pasar en silencio en ningún proyecto.
Estado del PR

Listo para revisar ✅

Los 3 cambios son conservadores y acotados: el reintento solo aplica a errores de red; la pre-limpieza es idempotente; la tolerancia de llaves solo toca variables conocidas. Type-check limpio.

👉 Ver el PR