TAKANA_X con caída a HAMMER_X (ADR 0016). No es un sed: estas variables son
contrato de usuario —knobs del instalador, el entorno del worker, mirror-env.sh—
y viven en perfiles de shell y units FUERA del repo, así que un renombre duro no
falla ruidosamente: la variable no aparece, se toma el default y el build se
comporta distinto sin que nada lo diga.
Rust: takana_core::env::{var,var_os} toma el nombre canónico y deriva el viejo
cambiando el prefijo — se le pasa TAKANA_* para que un grep del nombre nuevo
encuentre todas las lecturas. 5 tests, con DOS controles negativos: sin ninguna
de las dos no hay valor, y un nombre sin prefijo no inventa una caída.
Migrados los 17 sitios directos y los indirectos que el grep no mostraba
(bases_de_mirror, las constantes de kernel_cmd, ROOT_ENV de qorpa, env_path de
recover). takana-recover lleva la caída inline: es un mini-binario que se copia
a /usr/sbin y no vale arrastrarle una dep entera por dos líneas.
Scripts: 30 lecturas pasan a default, manteniendo el
nombre INTERNO de la variable para no tocar sus 190 usos.
Y donde el script EXPORTA en vez de leer, se ponen LAS DOS (mirror-env.sh y el
fragmento in-VM de bootstrap): ahí el lector puede ser un binario viejo —worker
sin recompilar, el /usr/bin/hammer pinado del baseline— que sólo conoce HAMMER_*.
La caída sirve para lectores nuevos; los viejos necesitan que la vieja siga puesta.
Verificado de punta a punta con el binario, no sólo con unit tests: HAMMER_LAB
sigue surtiendo efecto, TAKANA_LAB hace lo mismo, y con las dos gana TAKANA_LAB.
605 tests en verde y el hash de zlib sigue en b3:dc363f26… , intacto.
Cambio de comportamiento que va aparte y hay que decir: el hostname por defecto
de una instalación nueva pasa de 'hammer' a 'takana' (sólo si no se fija ninguna
de las dos variables).
NO se tocan: las rutas /var/lib/hammer de sistemas instalados, el volid
HAMMER_LIVE del ISO, ni el namespace HARKAQ_*, que es de otro subsistema.
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 `hammer 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"
|