lab: el rootfs se ANCLA en una imagen pineada — deja de resolverse con apk
Al entrar el toolchain en hash_inputs (58d3161) se abrio un agujero
operativo: los repos del rootfs apuntan a Alpine edge, que es RODANTE, asi
que dos maquinas que corran bootstrap-devfs.sh en fechas distintas resuelven
toolchains distintos y NO COMPARTEN NI UN ARTEFACTO. Ni cosecha de granja, ni
mirror pull, ni un cache-hit. Cada worker efimero nacia con un lab propio.
`apk add` contra edge es irrepetible por diseno (edge sirve solo la ultima
version). La salida no es repetir la resolucion, es no repetirla: el rootfs
se construye UNA vez y se TRAE pineado por sha256 — el mismo trato que ya
reciben alpine-minirootfs y zig en este script.
imagen: 294 M comprimida (1,1 G extraida)
sha256: db8a32526ad41fbcc76223842dbb4eb65c8ed576570b82152dc7c5691fc2a349
EL TAR ES DETERMINISTA A PROPOSITO (--sort=name --mtime=@1 --owner=0
--numeric-owner): sin eso el sha depende del orden del directorio y del uid
de quien empaqueta, dos empaquetados del MISMO rootfs darian imagenes
distintas y no habria forma de verificar que una imagen es la que dice ser.
Comprobado: dos pasadas, mismo sha.
EL REEMPLAZO ES POR ROTACION, no extrayendo encima: a medias quedaria una
MEZCLA de dos rootfs, que es justo lo que esto existe para evitar.
VERIFICADO de punta a punta: bajada del box, sha intacto tras el viaje,
extraida, y la huella de lab que produce es IDENTICA a la del rootfs vivo
(zlib -> b3:c7a7338f... en las dos). O sea que una maquina que arranque de
esta imagen comparte store.
--from-scratch conserva el camino viejo: es como se FABRICA una imagen nueva.
Reconstruir el corpus es el precio de ese cambio, y ahora es explicito.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -21,6 +21,7 @@
|
||||
# ./scripts/bootstrap-devfs.sh --skip-apk # sólo rootfs + zig
|
||||
# ./scripts/bootstrap-devfs.sh --force-zig # re-descarga zig
|
||||
# ./scripts/bootstrap-devfs.sh --relock # acepta el toolchain actual como lock
|
||||
# ./scripts/bootstrap-devfs.sh --from-scratch # resuelve el rootfs con apk en vez de traer la imagen
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
@@ -34,6 +35,7 @@ GO_VER="${GO_VER:-1.26.4}"
|
||||
GO_SHA256="${GO_SHA256:-1153d3d50e0ac764b447adfe05c2bcf08e889d42a02e0fe0259bd47f6733ad7f}"
|
||||
|
||||
SKIP_APK=0
|
||||
FROM_SCRATCH=0
|
||||
FORCE_ZIG=0
|
||||
FORCE_ROOTFS=0
|
||||
RELOCK=0
|
||||
@@ -43,6 +45,7 @@ for arg in "$@"; do
|
||||
--force-zig) FORCE_ZIG=1 ;;
|
||||
--force-rootfs) FORCE_ROOTFS=1 ;;
|
||||
--relock) RELOCK=1 ;;
|
||||
--from-scratch) FROM_SCRATCH=1 ;;
|
||||
-h|--help)
|
||||
sed -n '2,/^$/p' "$0" | sed 's/^# \?//'
|
||||
exit 0 ;;
|
||||
@@ -66,6 +69,24 @@ ok() { printf '\033[1;32m✓\033[0m %s\n' "$*"; }
|
||||
|
||||
mkdir -p "$DEVFS" "$TOOLS" "$CACHE" "$WORK"
|
||||
|
||||
# --- 0. Imagen pineada del lab (el camino por defecto) ------------------------
|
||||
# Desde que el toolchain entra en `hash_inputs`, el rootfs NO se resuelve: se TRAE. `apk add` contra
|
||||
# Alpine edge es irrepetible por diseño (edge sólo sirve la última versión), así que dos máquinas
|
||||
# que lo resuelvan en fechas distintas obtienen toolchains distintos y **no comparten ni un
|
||||
# artefacto**: ni cosecha de granja, ni `mirror pull`, ni un cache-hit. Con la imagen pineada por
|
||||
# sha256 todas las máquinas tienen el MISMO lab y vuelven a compartir store.
|
||||
#
|
||||
# `--from-scratch` recupera el camino viejo (minirootfs + apk). Es como se FABRICA una imagen nueva:
|
||||
# ./scripts/bootstrap-devfs.sh --from-scratch && ./scripts/lab-image.sh --crear
|
||||
# y después se pinea el sha nuevo acá abajo. Reconstruir el corpus es el precio de ese cambio.
|
||||
LAB_IMAGE_SHA256="${LAB_IMAGE_SHA256:-db8a32526ad41fbcc76223842dbb4eb65c8ed576570b82152dc7c5691fc2a349}"
|
||||
|
||||
if [[ $FROM_SCRATCH -eq 0 ]] && [[ ! -f "$ROOTFS/bin/busybox" ]]; then
|
||||
log "rootfs: trayendo la imagen pineada del lab"
|
||||
LAB_IMAGE_SHA256="$LAB_IMAGE_SHA256" "$REPO_ROOT/scripts/lab-image.sh" --traer
|
||||
SKIP_APK=1 # la imagen ya trae el toolchain resuelto; volver a correr apk lo movería
|
||||
fi
|
||||
|
||||
# --- 1. Rootfs Alpine ---------------------------------------------------------
|
||||
if [[ $FORCE_ROOTFS -eq 1 ]] && [[ -d "$ROOTFS" ]]; then
|
||||
log "rootfs: --force-rootfs ⇒ borro $ROOTFS"
|
||||
|
||||
Reference in New Issue
Block a user