Etapa G: harvest gate exige binario == nombre esperado (no solo que 'corra')

La 1ª corrida promovió+FIRMÓ binarios equivocados que pasaban el smoke por solo 'correr':
katana/naabu→functional-test, gosec→gosecutil, buf→protoc-gen-buf-lint (detect_go_main eligió un
main helper). El gate ahora localiza el binario cuyo nombre == receta (o alias conocido tofu/mc/
nats/dlv/flux/ct/kubeseal/node_exporter/...); si instaló otro → a needs-review-weekend con el motivo,
NO se firma. Lección eksctl aplicada al gate.
This commit is contained in:
2026-06-27 06:50:03 -04:00
parent 63f088da46
commit b544ad3d59
+24 -5
View File
@@ -62,19 +62,38 @@ for f in "$QUEUE"/*.toml; do
[ -e "$f" ] || { echo "$(STAMP) cola vacía"; break; }
n=$(basename "$f" .toml)
# ¿sellada? cache-hit instantáneo imprime el hash; un build real se pasa del timeout ⇒ skip.
# Pre-check BARATO: ¿el worker selló algo para este nombre? (tras el rsync el store local lo tiene).
# Sin esto, `hammer build` de una receta NO sellada ARRANCARÍA un build local (vendor+compile) y lo
# mataría el timeout ⇒ CPU del hub desperdiciada cada cosecha. Si no hay seal `*-<n>`, salto ya.
ls "$STORE"/*-"$n" >/dev/null 2>&1 || { skipped="$skipped $n"; continue; }
# ¿sellada con el hash ACTUAL? cache-hit instantáneo imprime el hash; un build real (hash distinto,
# raro) se pasa del timeout ⇒ skip (no compilamos en el hub).
H=$(timeout "$SEAL_TIMEOUT" "$HAMMER" --store "$STORE" build "$f" 2>/dev/null | tail -1)
case "$H" in
b3:*) : ;;
*) skipped="$skipped $n"; continue ;; # no sellada aún (o tardaría en compilar) ⇒ el worker sigue
esac
# SMOKE-TEST: localizar el binario instalado en el seal.
# NOMBRE ESPERADO del binario: el de la receta, o un alias conocido (pname nixpkgs ≠ binario).
case "$n" in
opentofu) want=tofu ;; minio-client) want=mc ;; natscli) want=nats ;; delve) want=dlv ;;
fluxcd) want=flux ;; chart-testing) want=ct ;; sealed-secrets|kubeseal) want=kubeseal ;;
prometheus-node-exporter|node_exporter) want=node_exporter ;;
prometheus-blackbox-exporter|blackbox_exporter) want=blackbox_exporter ;;
*) want="$n" ;;
esac
# SMOKE-TEST: el seal debe instalar un binario cuyo nombre == $want. Si instaló otro (un helper:
# functional-test, protoc-gen-buf-lint, gosecutil…), detect_go_main eligió mal el main ⇒ NO es la
# herramienta correcta aunque "corra" → a REVIEW (no firmamos un binario equivocado). Lección eksctl.
d="$STORE/${H#b3:}-$n"
bin=$(find "$d" -type f -path '*/bin/*' -perm -100 2>/dev/null | head -1)
allbins=$(find "$d" -type f -path '*/bin/*' -perm -100 2>/dev/null)
bin=$(printf '%s\n' "$allbins" | while read -r b; do [ "$(basename "$b")" = "$want" ] && { echo "$b"; break; }; done)
if [ -z "$bin" ]; then
{ echo "# REVIEW $(STAMP): el seal no tiene binario en */bin/ (¿install raro?)"; cat "$f"; } > "$REVIEW/$n.toml"
rm -f "$f"; rejected="$rejected $n(sin-bin)"; continue
got=$(printf '%s\n' "$allbins" | sed 's#.*/##' | tr '\n' ',' | sed 's/,$//')
{ echo "# REVIEW $(STAMP): binario instalado='$got' ≠ esperado='$want' (detect_go_main eligió otro main); fijar flags=[\"./cmd/$want\"]"; cat "$f"; } > "$REVIEW/$n.toml"
rm -f "$f"; rejected="$rejected $n(bin=$got)"; continue
fi
# 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')