From 117f8e6dee8ddca2f32b5a74e958c3e59e0488e6 Mon Sep 17 00:00:00 2001 From: sergio Date: Fri, 17 Jul 2026 09:39:49 -0400 Subject: [PATCH] =?UTF-8?q?granja:=20el=20smoke-test=20del=20cron=20escrib?= =?UTF-8?q?=C3=ADa=20en=20el=20repo=20(gocron=20sembr=C3=B3=20config/)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El smoke de harvest-go.sh ejecutaba cada binario cosechado con el cwd en la RAÍZ DEL REPO, así que un binario que escribe estado al arrancar dejaba basura entre las fuentes. Pasó: `gocron version` —y `version` es justo el PRIMER flag que prueba el smoke, así que se disparaba siempre— sembró config/{config.yaml,db.sqlite} (5 jobs de ejemplo + una sqlite) el 2026-07-04, y quedó sin trackear hasta hoy. Medido, un flag a la vez, en cwd limpios: [version] DEJO: ./config ./config/db.sqlite ./config/config.yaml [--version] limpio [-v] limpio [--help] limpio [-h] limpio Un `--help` no debería poder tocar el repo. El smoke ahora corre en un mktemp -d que se borra. Vale para cualquier herramienta futura, no sólo gocron. Sin regresión en el veredicto: en tmpdir `gocron version` panica (le falta web/index.html), el smoke ya trata el panic (continue) y pasa a --version, que funciona ⇒ gocron sigue aprobando. config/ borrado (no trackeado, sin una sola referencia en scripts/recetas/código). Co-Authored-By: Claude Opus 4.8 --- scripts/farm/harvest-go.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/scripts/farm/harvest-go.sh b/scripts/farm/harvest-go.sh index 132d2d5e..aec44f5c 100755 --- a/scripts/farm/harvest-go.sh +++ b/scripts/farm/harvest-go.sh @@ -123,14 +123,22 @@ for f in "$QUEUE"/*.toml; do # ELF estático (los del lab son musl estáticos; uno dinámico es sospechoso pero no lo rechazo solo por eso). isstatic=$(file "$bin" 2>/dev/null | grep -c 'statically linked') # corre sin panic/segfault: probamos varios flags benignos bajo timeout. + # + # CWD DESECHABLE: el smoke corría con el cwd en la RAÍZ DEL REPO, así que cualquier binario que + # escriba estado al arrancar lo dejaba commiteable entre las fuentes. Pasó de verdad: `gocron` + # sembró un `config/{config.yaml,db.sqlite}` (5 jobs de ejemplo + una sqlite) el 2026-07-04, que + # quedó de basura sin trackear hasta hoy. Un `--help` no debería poder tocar el repo: lo corremos + # en un tmpdir que se borra. Vale para cualquier herramienta futura, no sólo gocron. + smokedir=$(mktemp -d) || smokedir=/tmp ran_ok=0; out="" for sub in version --version -v --help -h; do - out=$(timeout 10 "$bin" $sub 2>&1); rc=$? + out=$(cd "$smokedir" && timeout 10 "$bin" $sub 2>&1); rc=$? # panic de Go / segfault ⇒ malo; rc 124 = timeout (se colgó, p.ej. abrió server) ⇒ probamos otro flag. case "$out" in *panic:*|*"runtime error"*|*SIGSEGV*|*"signal SIGABRT"*) continue ;; esac [ "$rc" = 124 ] && continue ran_ok=1; break done + [ "$smokedir" = /tmp ] || rm -rf "$smokedir" if [ "$ran_ok" = 1 ]; then bn=$(basename "$bin") echo "$(STAMP) ✓ smoke $n (bin=$bn static=$isstatic): ${out%%