El §6.50 quinquies dejó la caja trayendo fuentes por SSH porque su git no tenía remote-https. Eso era el síntoma; la causa estaba un paso antes de donde mirábamos —incluida la nota que yo mismo había escrito, que culpaba al Makefile—: el `configure` de git prueba libcurl con AC_CHECK_LIB, que enlaza `conftest.c -lcurl` y nada más, y con libcurl estática faltan sus privadas (-lssl -lcrypto -lz). El test falla, config.mak.autogen se lleva NO_CURL=YesPlease, el Makefile excluye los tres helpers y conserva git-http-backend —esa asimetría en el artefacto era la firma, y estuvo a la vista desde el 14 de septiembre—. El build termina en verde. Medido sobre el artefacto: b3:215742cb… trae git-remote-http, -https, git-http-fetch y los ftp, y CLONA por HTTPS (clone, no ls-remote). En la caja, hidratado y con la reescritura apagada, funcionan tanto `git clone` como `git clone --mirror`, que es el comando exacto del fetch de takana. Y el radio, medido en vez de temido: la nota vieja decía «raíz de perfil.base ⇒ radio grande»; `yupana radio git` dice cero dependientes directos y cero transitivos. El miedo escrito a mano había sobrestimado el costo de arreglarlo, y eso lo mantuvo roto tres días. Las reescrituras url.insteadOf quedan retiradas de la caja; el guion se conserva como salida de emergencia y así lo dice su cabecera. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
83 lines
5.2 KiB
Bash
Executable File
83 lines
5.2 KiB
Bash
Executable File
#!/bin/sh
|
|
# Deja la caja de producción capaz de TRAER FUENTES GIT por SSH.
|
|
#
|
|
# ⚠ DESDE EL 2026-09-17 ESTO ES UNA SALIDA DE EMERGENCIA, NO EL CAMINO NORMAL. El `git` del corpus
|
|
# ya clona por HTTPS (la causa era el test de libcurl del `configure`, ver SDD 28 §6.50 sexies), y en
|
|
# la caja las reescrituras `url.insteadOf` están RETIRADAS. Esto se conserva para el día en que el
|
|
# HTTPS no esté disponible —un git sin libcurl, un cortafuegos que sólo deja pasar el 22— y para
|
|
# dejar escrito lo que costó averiguar.
|
|
#
|
|
# ── POR QUÉ (2026-09-17) ────────────────────────────────────────────────────────────────────────
|
|
# El `git` sellado del corpus no trae `git-remote-http` (falta libcurl): en la caja, cualquier receta
|
|
# que clone muere con
|
|
#
|
|
# git: 'remote-https' is not a git command
|
|
#
|
|
# y eso son 36 recetas de tawasuyu y ~90 de GitHub — o sea, casi todo lo propio. La salida es traer
|
|
# por SSH. **No cuesta ningún hash**: la URL es un LOCALIZADOR y no entra en `hash_inputs`
|
|
# (ADR 0013), así que el mismo commit por otro transporte sella el MISMO artefacto. Por eso esto no
|
|
# toca ninguna receta: el worker sigue clonando por HTTPS, que es lo que él sí puede.
|
|
#
|
|
# Idempotente. Se corre EN LA CAJA, como root.
|
|
set -eu
|
|
|
|
CONF_SSH=/root/.ssh/config
|
|
CONF_GIT=/root/.gitconfig
|
|
CONF_CARGO=/root/.cargo/config.toml
|
|
KH=/root/.ssh/known_hosts
|
|
|
|
# ── 1. reescritura de URLs ───────────────────────────────────────────────────────────────────────
|
|
git config --global url."ssh://gitea@git.gioser.net:2345/".insteadOf "https://git.tawasuyu.net/"
|
|
git config --global url."ssh://git@github.com/".insteadOf "https://github.com/"
|
|
|
|
# ── 2. la clave del host, SIN el puerto ──────────────────────────────────────────────────────────
|
|
# cargo tiene su propio cliente SSH y busca `git.gioser.net` pelado; con la entrada sólo como
|
|
# `[git.gioser.net]:2345` se planta con «This host key was found, but is associated with a different
|
|
# host». Es la MISMA clave, reexpresada — no es aceptar nada nuevo.
|
|
if ! grep -q "^git.gioser.net ssh-" "$KH" 2>/dev/null; then
|
|
grep "^\[git.gioser.net\]:2345 " "$KH" | sed "s|^\[git.gioser.net\]:2345 |git.gioser.net |" >> "$KH"
|
|
fi
|
|
|
|
# ── 3. github.com: la huella se PINEA contra la publicada, no se acepta a ciegas ─────────────────
|
|
GH_FP="SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU"
|
|
if ! grep -q "^github.com ssh-ed25519" "$KH" 2>/dev/null; then
|
|
ssh-keyscan -t ed25519 github.com > /tmp/gh.keys 2>/dev/null
|
|
fp=$(ssh-keygen -lf /tmp/gh.keys | awk '{print $2}')
|
|
[ "$fp" = "$GH_FP" ] || { echo "github.com anuncia $fp y NO la publicada $GH_FP — no la acepto" >&2; exit 1; }
|
|
cat /tmp/gh.keys >> "$KH"; rm -f /tmp/gh.keys
|
|
fi
|
|
|
|
# ── 4. qué clave usa cada host ───────────────────────────────────────────────────────────────────
|
|
grep -q "^Host github.com" "$CONF_SSH" 2>/dev/null || cat >> "$CONF_SSH" <<'SSHEOF'
|
|
|
|
Host github.com
|
|
HostName github.com
|
|
User git
|
|
IdentityFile /root/.ssh/github5
|
|
IdentitiesOnly yes
|
|
SSHEOF
|
|
chmod 600 "$CONF_SSH"
|
|
|
|
# ── 5. cargo delega en el git de verdad ──────────────────────────────────────────────────────────
|
|
# Sin esto, `cargo vendor` usa libgit2 y ni lee `IdentityFile` de ~/.ssh/config:
|
|
# «no authentication methods succeeded». Es fetch, no build: no toca ningún hash.
|
|
mkdir -p "$(dirname "$CONF_CARGO")"
|
|
grep -q "git-fetch-with-cli" "$CONF_CARGO" 2>/dev/null || printf '[net]\ngit-fetch-with-cli = true\n' >> "$CONF_CARGO"
|
|
|
|
# ── 6. CARGO_HOME NO puede vivir en la raíz ──────────────────────────────────────────────────────
|
|
# Son 5,9 G. El vendor del monorepo bajó 2,7 G, la raíz llegó al 100 % y la caja se CAYÓ ENTERA
|
|
# —sin HTTP, sin SSH y sin responder al ping— con Hetzner informando `running` (SDD 28 §6.50 quinquies).
|
|
if [ ! -L /root/.cargo ]; then
|
|
mkdir -p /work/cargo-home
|
|
[ -d /root/.cargo ] && cp -a /root/.cargo/. /work/cargo-home/ && rm -rf /root/.cargo
|
|
ln -s /work/cargo-home /root/.cargo
|
|
fi
|
|
|
|
# ── control: que de verdad LLEGUE, no que el fichero exista ─────────────────────────────────────
|
|
fallos=0
|
|
for u in "https://git.tawasuyu.net/tawasuyu/tawasuyu.git" "https://github.com/uutils/coreutils.git"; do
|
|
if timeout 45 git ls-remote "$u" >/dev/null 2>&1; then echo " ✓ $u"; else echo " ✗ $u"; fallos=$((fallos+1)); fi
|
|
done
|
|
[ "$fallos" -eq 0 ] || { echo "NO llega a $fallos origen(es)" >&2; exit 1; }
|
|
echo "la caja trae fuentes git por SSH"
|