From b544ad3d5942c8aa84f57f3e92f8c215bc8a3c3a Mon Sep 17 00:00:00 2001 From: sergio Date: Sat, 27 Jun 2026 06:50:03 -0400 Subject: [PATCH] Etapa G: harvest gate exige binario == nombre esperado (no solo que 'corra') MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- scripts/farm/harvest-go.sh | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/scripts/farm/harvest-go.sh b/scripts/farm/harvest-go.sh index 7b49bbb6..3b41de35 100755 --- a/scripts/farm/harvest-go.sh +++ b/scripts/farm/harvest-go.sh @@ -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 `*-`, 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')