250 líneas de comentario en 151 scripts. Control verificado: el diff no toca NI UNA línea que no empiece por #, y la sintaxis de los 151 pasa. El barrido saltea heredocs y cadenas triples, y el guardián DISPARÓ 3 veces: las tres eran el MOTD que el script escribe DENTRO de la imagen construida — texto del producto, no comentario del script. Se cambiaron aparte y a propósito, que es rebranding, no limpieza. Y el hallazgo caro: casaba contra , que es el TARGET de tracing — o sea el module_path!, o sea el nombre del crate. La etapa 4 lo movió a y el script quedó casando NADA. No fallaba: imprimía cero atribuciones, indistinguible de un log sin problemas. Comprobado con el binario (RUST_LOG=info sobre zlib), no deducido. Ahora acepta las dos, y tiene que seguir aceptándolas porque los logs viejos en disco dicen la vieja. Además 14 rutas de módulo en docs, que el barrido anterior no tocó porque no es frontera de palabra.
54 lines
2.4 KiB
Bash
Executable File
54 lines
2.4 KiB
Bash
Executable File
#!/bin/sh
|
|
# tandas.sh — encadena varias campañas de deuda en el worker, en ORDEN y sin solaparse.
|
|
#
|
|
# POR QUÉ EN SERIE Y NO EN PARALELO: dos `takana build` simultáneos sobre el mismo store compiten
|
|
# por el mismo `work/sources` y por el watchdog de disco del worker-loop (que borra árboles que
|
|
# ningún bwrap tiene montado). El paralelismo del worker está DENTRO de cada build (`-j$(nproc)`),
|
|
# no entre builds.
|
|
#
|
|
# POR QUÉ TANDAS Y NO UNA LISTA LARGA: una tanda es una unidad con sentido topológico — la cadena
|
|
# GUI, el stack wayland, los kernels. Si una tanda se cae entera por su raíz (como pango arrastró a
|
|
# 7 recetas el 2026-07-21), se ve de un vistazo en el resumen y se re-lanza sola. Una lista de 40
|
|
# nombres planos no dice nada cuando falla.
|
|
#
|
|
# Espera a que termine cualquier campaña en vuelo antes de arrancar, así se puede encolar mientras
|
|
# otra muele.
|
|
#
|
|
# Uso (en el worker):
|
|
# scripts/farm/tandas.sh "gui:pixman,cairo,pango" "kernels:linux,linux-generic"
|
|
# Desde el hub:
|
|
# ssh root@<ip> 'systemd-run --unit=tandas --working-directory=/opt/hammer \
|
|
# /opt/hammer/scripts/farm/tandas.sh "gui:pixman,cairo" …'
|
|
# ssh root@<ip> 'tail -f /var/log/tandas.log'
|
|
set -u
|
|
HAMMER_DIR="${TAKANA_DIR:-${HAMMER_DIR:-/opt/hammer}}"
|
|
cd "$HAMMER_DIR"
|
|
LOG="${LOG:-/var/log/tandas.log}"
|
|
ESPERA="${ESPERA:-30}"
|
|
|
|
ts() { date -u +%FT%TZ; }
|
|
[ $# -gt 0 ] || { echo "uso: tandas.sh <nombre:receta1,receta2,…> […]" >&2; exit 2; }
|
|
|
|
# No solaparse con una campaña previa (ni con otra corrida de este mismo script).
|
|
while pgrep -f 'campana-deuda\.s[h]' >/dev/null 2>&1; do
|
|
echo "$(ts) esperando a que termine la campaña en vuelo…" | tee -a "$LOG"
|
|
sleep "$ESPERA"
|
|
done
|
|
|
|
echo "$(ts) ═══ tandas arranca: $# tanda(s)" | tee -a "$LOG"
|
|
resumen=""
|
|
for spec in "$@"; do
|
|
nombre="${spec%%:*}"
|
|
lista="$(echo "${spec#*:}" | tr ',' ' ')"
|
|
n=$(echo "$lista" | wc -w)
|
|
echo "$(ts) ── TANDA '$nombre' ($n recetas)" | tee -a "$LOG"
|
|
# campana-deuda.sh ya trae el PATH del go del store, el heartbeat del dead-man y el log por receta.
|
|
LOG="/var/log/tanda-$nombre.log" scripts/farm/campana-deuda.sh $lista 2>&1 | tee -a "$LOG"
|
|
ok=$(grep -c '✓ ' "/var/log/tanda-$nombre.log" 2>/dev/null || echo 0)
|
|
ko=$(grep -c '✗ ' "/var/log/tanda-$nombre.log" 2>/dev/null || echo 0)
|
|
resumen="$resumen\n $nombre: $ok selladas, $ko fallidas (de $n)"
|
|
done
|
|
|
|
echo "$(ts) ═══ tandas fin" | tee -a "$LOG"
|
|
printf "%b\n" "$resumen" | tee -a "$LOG"
|