6 Commits

Author SHA1 Message Date
jpbeldomenico dd7f73453e Merge pull request 'ci: reintentar la revision con IA cuando falla el proveedor' (#3) from fix/ai-review-reintentos into main
Deploy / deploy (push) Successful in 3m22s
2026-08-03 22:50:20 -03:00
jpbeldomenico a312815140 fix(ci): no dar por fallida una revision por el texto de su comentario
Revisión con IA / ai-review (pull_request) Successful in 1m59s
El guard buscaba "Error: " en el log, pero el log tambien trae lo que escribe
el modelo. En inventario#3 la revision salio bien y comento justamente que ese
patron era demasiado amplio: el comentario quedo impreso, matcheo el patron y
el job quedo en rojo. Lo encontro la propia revision con IA.

Ahora se miran las marcas de nivel que imprime la herramienta (| ERROR | y
| CRITICAL |), que el modelo no escribe, y el traceback al principio de linea.
Verificado contra los logs reales guardados: detecta la falla por el 502 de
OpenRouter y deja pasar las tres revisiones que salieron bien.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 21:26:21 -03:00
jpbeldomenico a7bb038b6b fix(ci): reintentar la revision con IA cuando falla el proveedor
Revisión con IA / ai-review (pull_request) Successful in 44s
El 03/08/2026 OpenRouter devolvio 502 con el modelo gratuito y el pull
request se mergeo sin revisar. Ahora revisar() reintenta hasta 3 veces con
espera creciente (30s, 60s), pero solo ante las marcas que deja una falla
al pedirle la respuesta al modelo: un 401 o un modelo que ya no existe
siguen cortando en el primer intento, porque esperar no los arregla.

De paso se saca la tuberia a tee: el codigo de salida que se evaluaba era
el de tee, siempre 0, asi que esa mitad del guard nunca hizo nada.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 21:10:32 -03:00
jpbeldomenico d74c97e532 Merge pull request 'ci: construir antes de bajar el servicio' (#2) from fix/deploy-robusto into main
Deploy / deploy (push) Successful in 4m46s
2026-08-03 20:04:35 -03:00
jpbeldomenico f1ef9da857 fix(ci): construir antes de bajar el servicio
Revisión con IA / ai-review (pull_request) Failing after 24s
El despliegue hacia "docker compose down" y recien despues
"up -d --build". Si la construccion fallaba, el taller quedaba caido hasta
que alguien lo notara: paso el 03/08/2026, cuando npm no pudo bajar las
dependencias y el sitio estuvo abajo sin que ningun paso lo avisara.

Ahora la imagen se construye primero y solo despues se recrean los
contenedores, sin bajar nada de antemano. Si la construccion falla, lo que
estaba corriendo sigue en pie.

Se agrega ademas una verificacion final: si al terminar no hay contenedores
corriendo, el despliegue falla y muestra los registros, en lugar de dar por
bueno un servicio caido.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 19:49:17 -03:00
jpbeldomenico 8d1b5da448 Merge pull request 'ci: revisar los pull requests con IA' (#1) from feat/ai-review into main
Deploy / deploy (push) Failing after 1m31s
2026-08-03 19:27:55 -03:00
2 changed files with 75 additions and 10 deletions
+49 -8
View File
@@ -179,15 +179,56 @@ jobs:
# comentarios: imprime el traceback y saluda con # comentarios: imprime el traceback y saluda con
# "AI review completed successfully!". Sin esto el job quedaria en # "AI review completed successfully!". Sin esto el job quedaria en
# verde sin haber revisado nada, que es peor que fallar. # verde sin haber revisado nada, que es peor que fallar.
#
# Cuidado con QUE se busca: el log tambien trae el texto de los
# comentarios que escribe el modelo, y ese texto puede decir
# cualquier cosa. El patron 'Error: ' que habia antes se disparo con
# el comentario de la propia revision (inventario#3) y marco como
# fallida una revision que habia salido bien. Por eso ahora se miran
# las marcas de nivel que imprime la herramienta, que el modelo no
# escribe, y el traceback al principio de linea.
ERRORES='\| (ERROR|CRITICAL) \||^Traceback \(most recent call last\)'
# El plan gratuito de OpenRouter devuelve 502 cuando los proveedores
# del modelo estan saturados; pasó el 03/08/2026 y el pull request se
# mergeo sin revisar. Eso se reintenta, pero un 401 o un modelo que ya
# no existe no se arreglan esperando: por eso solo reintentamos con
# las marcas que deja una falla al pedirle la respuesta al modelo.
# Todas ocurren antes de publicar nada, asi que el reintento no puede
# dejar comentarios repetidos.
PASAJEROS='OpenRouterChatResponseSchema|LLM returned empty|Upstream|Too Many Requests|timed out'
INTENTOS=3
PRIMERA_ESPERA=30
revisar() { revisar() {
echo "== ai-review $1" modo="$1"
if ! ai-review "$1" 2>&1 | tee "/tmp/ai-review-$1.log"; then registro="/tmp/ai-review-${modo}.log"
return 1 intento=1
fi espera="${PRIMERA_ESPERA}"
if grep -qiE 'Traceback \(most recent call last\)|HTTPClientError|Error: ' "/tmp/ai-review-$1.log"; then
echo "La revisión reportó errores en '$1' pese a terminar sin código de error." >&2 while : ; do
return 1 echo "== ai-review ${modo} (intento ${intento} de ${INTENTOS})"
fi
# Sin tuberia a proposito: con "| tee" el codigo que se evalua es
# el de tee, que siempre da 0, y la falla pasaba desapercibida.
salida=0
ai-review "${modo}" > "${registro}" 2>&1 || salida=$?
cat "${registro}"
if [ "${salida}" -eq 0 ] && ! grep -qE "${ERRORES}" "${registro}"; then
return 0
fi
if [ "${intento}" -ge "${INTENTOS}" ] || ! grep -qE "${PASAJEROS}" "${registro}"; then
echo "La revisión reportó errores en '${modo}' pese a terminar sin código de error." >&2
return 1
fi
echo "Falla pasajera del proveedor; reintento en ${espera}s." >&2
sleep "${espera}"
intento=$((intento + 1))
espera=$((espera * 2))
done
} }
# Para depurar la configuración existe "ai-review show-config", pero # Para depurar la configuración existe "ai-review show-config", pero
+26 -2
View File
@@ -10,9 +10,33 @@ jobs:
steps: steps:
- name: Pull y rebuild - name: Pull y rebuild
run: | run: |
set -eu
git config --global --add safe.directory /home/proyecto/taller_automotriz git config --global --add safe.directory /home/proyecto/taller_automotriz
cd /home/proyecto/taller_automotriz cd /home/proyecto/taller_automotriz
git fetch origin git fetch origin
git reset --hard origin/main git reset --hard origin/main
docker compose down
docker compose up -d --build # Construir ANTES de tocar lo que esta corriendo. Antes este paso
# hacia "docker compose down" y recien despues "up --build": si la
# construccion fallaba (por ejemplo, npm sin poder bajar las
# dependencias), el taller quedaba caido hasta que alguien lo
# notara. Pasó el 03/08/2026.
docker compose build
# Con la imagen nueva ya lista, "up -d" recrea los contenedores que
# cambiaron. No hace falta bajar nada de antemano.
docker compose up -d --no-build --remove-orphans
- name: Verificar que quedo arriba
run: |
set -eu
cd /home/proyecto/taller_automotriz
docker compose ps
# Si el contenedor no esta corriendo, el despliegue fallo aunque los
# comandos anteriores hayan salido bien.
if [ -z "$(docker compose ps --quiet --status running)" ]; then
echo "El despliegue termino sin contenedores corriendo"
docker compose logs --tail 50
exit 1
fi