Etapa F dogfood: scripts/build-repo.sh — poblar el corpus como repo de release firmado
Convierte la maquinaria de paquetería en la cadena de suministro real: cada receta del corpus se vuelve un .swm, el repo es el catálogo firmado, install lo reproduce localmente. - scripts/build-repo.sh: packea recipes/*.toml al repo, anclando expected_hash con `pack --build` (cache-hit si el artefacto ya está sellado; fallback a pack sin ancla por timeout/fallo), y firma el release (clave efímera o KEY=). Env: REPO/STORE/KEY/DISTRO/BUILD_TIMEOUT. - /dist/ gitignoreado (el repo es artefacto reproducible desde el script). - Validado: poblado de 34 paquetes (31 con expected_hash anclado), release firmado. install ripgrep desde el repo FIRMADO en modo --require-signed → release trusted → reproduce b3:9e6079fd (casa el ancla del catálogo) → hidrata → rg 14.1.1 corre. Cadena completa. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -9,6 +9,7 @@ Cargo.lock.orig
|
||||
/var/
|
||||
/.dev-fs/
|
||||
/work/
|
||||
/dist/
|
||||
*.swm.local
|
||||
|
||||
# editor / OS
|
||||
|
||||
Executable
+58
@@ -0,0 +1,58 @@
|
||||
#!/bin/sh
|
||||
# build-repo.sh — Etapa F (dogfood): puebla un REPO DE PAQUETES hammer desde el corpus
|
||||
# `recipes/*.toml` y firma el release. Convierte la maquinaria de paquetería en la cadena de
|
||||
# suministro real de la distro: cada receta se vuelve un `.swm` (mutación sobre fuente), el repo
|
||||
# es el catálogo firmado, y `hammer install <nombre> --repo <dir|url>` lo reproduce localmente.
|
||||
#
|
||||
# Para cada receta intenta ANCLAR el `expected_hash` con `pack --build` (instantáneo si el
|
||||
# artefacto ya está sellado en el store — cache-hit; ver hammer-build::build). Si construir desde
|
||||
# cero excede el timeout (o falla), cae a `pack` sin ancla: la entrada del catálogo igual existe y
|
||||
# el `source_patch` sigue siendo reproducible, sólo sin hash del autor contra el que comparar.
|
||||
#
|
||||
# Env:
|
||||
# REPO=<dir> destino del repo (default ./dist/repo)
|
||||
# STORE=<dir> store con artefactos cacheados (default ./store)
|
||||
# KEY=<file> clave privada ed25519 para firmar el release (default: genera una efímera)
|
||||
# DISTRO=<ver> distro_version de la base de los paquetes (default dev)
|
||||
# BUILD_TIMEOUT segundos máx por `pack --build` antes de caer a pack sin ancla (default 90)
|
||||
set -eu
|
||||
|
||||
REPO="${REPO:-$(pwd)/dist/repo}"
|
||||
STORE="${STORE:-./store}"
|
||||
DISTRO="${DISTRO:-dev}"
|
||||
BUILD_TIMEOUT="${BUILD_TIMEOUT:-90}"
|
||||
HAMMER="cargo run -q -p hammer-cli --"
|
||||
|
||||
rm -rf "$REPO"
|
||||
mkdir -p "$REPO"
|
||||
|
||||
# Clave de firma del release: la pasada por KEY, o una efímera en el dir del repo.
|
||||
KEYDIR="$(dirname "$REPO")/keys"
|
||||
if [ -z "${KEY:-}" ]; then
|
||||
mkdir -p "$KEYDIR"
|
||||
if [ ! -f "$KEYDIR/release.ed25519" ]; then
|
||||
$HAMMER keygen release --out "$KEYDIR" >/dev/null
|
||||
fi
|
||||
KEY="$KEYDIR/release.ed25519"
|
||||
echo "firmando el release con clave efímera $KEY"
|
||||
fi
|
||||
|
||||
anchored=0; plain=0; failed=""
|
||||
for r in recipes/*.toml; do
|
||||
name=$(basename "$r" .toml)
|
||||
if timeout "$BUILD_TIMEOUT" $HAMMER --store "$STORE" pack "$r" \
|
||||
--repo "$REPO" --distro-version "$DISTRO" --build >/dev/null 2>&1; then
|
||||
anchored=$((anchored + 1))
|
||||
elif $HAMMER pack "$r" --repo "$REPO" --distro-version "$DISTRO" >/dev/null 2>&1; then
|
||||
plain=$((plain + 1))
|
||||
else
|
||||
failed="$failed $name"
|
||||
fi
|
||||
done
|
||||
|
||||
$HAMMER repo sign --repo "$REPO" --key "$KEY"
|
||||
echo
|
||||
$HAMMER repo list --repo "$REPO"
|
||||
echo
|
||||
echo "poblado: $anchored con expected_hash anclado, $plain sin ancla.${failed:+ FALLARON:$failed}"
|
||||
echo "repo en $REPO (firmado). probá: hammer install <nombre> --repo $REPO --trust $KEYDIR --require-signed"
|
||||
Reference in New Issue
Block a user