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:
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user