granja: el smoke-test del cron escribía en el repo (gocron sembró config/)
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 <noreply@anthropic.com>
This commit is contained in:
@@ -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).
|
# 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')
|
isstatic=$(file "$bin" 2>/dev/null | grep -c 'statically linked')
|
||||||
# corre sin panic/segfault: probamos varios flags benignos bajo timeout.
|
# 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=""
|
ran_ok=0; out=""
|
||||||
for sub in version --version -v --help -h; do
|
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.
|
# 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
|
case "$out" in *panic:*|*"runtime error"*|*SIGSEGV*|*"signal SIGABRT"*) continue ;; esac
|
||||||
[ "$rc" = 124 ] && continue
|
[ "$rc" = 124 ] && continue
|
||||||
ran_ok=1; break
|
ran_ok=1; break
|
||||||
done
|
done
|
||||||
|
[ "$smokedir" = /tmp ] || rm -rf "$smokedir"
|
||||||
if [ "$ran_ok" = 1 ]; then
|
if [ "$ran_ok" = 1 ]; then
|
||||||
bn=$(basename "$bin")
|
bn=$(basename "$bin")
|
||||||
echo "$(STAMP) ✓ smoke $n (bin=$bn static=$isstatic): ${out%%
|
echo "$(STAMP) ✓ smoke $n (bin=$bn static=$isstatic): ${out%%
|
||||||
|
|||||||
Reference in New Issue
Block a user