commit 1ca3afdeaee4674cfb0fe87681a41b873f20372e
parent 72bcacb84c7d742562b2f0532735a5ff438adcac
Author: Francisco Armando Rosmino <franciscorosmino@rosmino.com.ar>
Date: Mon, 5 Oct 2026 13:09:45 -0300
linux-release.sh: imagen docker con SDL3 ya compilado, por defecto en el CT112
La imagen catan-release:ubuntu22.04 (Ubuntu 22.04 + herramientas + SDL3
estatico) se arma una sola vez con la fuente de SDL3; despues cada release
solo compila Catan (segundos en vez de 10 minutos). RELEASE_HOST=ct112-remoto
por defecto (docker sin sudo); RELEASE_HOST=local usa el docker de la X1.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat:
3 files changed, 55 insertions(+), 31 deletions(-)
diff --git a/CLAUDE.md b/CLAUDE.md
@@ -8,7 +8,8 @@ VPS (`git clone https://catan.lu3dhn.xyz/git/juegos.git`). Versiones con tags se
`v1.1` algo nuevo, `v1.0.1` arreglos); el menú de Catan muestra `git describe`
(`catan/linux/version.h`, generado por el Makefile). Publicar Catan: commitear y tagear,
`make -C catan release` (catan.exe + catan-linux compilado en docker ubuntu:22.04 con
-`tools/linux-release.sh`; en la X1 docker va con `sudo -A`/`sudo-askpass`), `make publish`
+`tools/linux-release.sh`: imagen `catan-release:ubuntu22.04` con SDL3 ya compilado, se arma una vez;
+por defecto en el CT112 por ssh, `RELEASE_HOST=local` usa el docker de la X1 con `sudo -A`/`sudo-askpass`), `make publish`
(push a los dos remotos + binarios a `https://catan.lu3dhn.xyz/descargas/`), `make deploy-web`
y el servidor al VPS. Solo una sesión maneja git y producción; las demás no commitean ni tocan
el VPS.
diff --git a/catan/Makefile b/catan/Makefile
@@ -65,10 +65,14 @@ windows: catan.exe
# Lo que se reparte: catan.exe y el catan de Linux (compilado en un Ubuntu 22.04 con docker
# para que corra en distros no tan nuevas), sueltos, en release/. make publish los sube a
# https://catan.lu3dhn.xyz/descargas/ y empuja el codigo al git (CT111 y espejo publico).
+# el de Linux se compila en docker con una imagen que ya tiene SDL3 (ver linux-release.sh);
+# por defecto en el CT112 por ssh (tiene docker y no hace falta sudo); RELEASE_HOST=local
+# usa el docker de esta compu (sudo con popup)
+RELEASE_HOST ?= ct112-remoto
release: catan.exe
mkdir -p release
cp catan.exe release/catan.exe
- tools/linux-release.sh "$(VERSION)" release/catan-linux
+ RELEASE_HOST=$(RELEASE_HOST) tools/linux-release.sh "$(VERSION)" release/catan-linux
publish: release
cd .. && git push origin main --tags && git push publico main --tags
diff --git a/catan/tools/linux-release.sh b/catan/tools/linux-release.sh
@@ -5,9 +5,13 @@
# es muy nueva. SDL3 y ncurses van adentro (estaticos); lo grafico (X11/Wayland, audio) SDL
# lo busca al arrancar en la compu de cada uno.
#
+# La imagen $IMAGE (Ubuntu 22.04 + herramientas + SDL3 estatico en /opt/sdl) se arma una
+# sola vez, con la fuente de SDL3 (tarda ~10 min); despues cada release solo compila Catan
+# (segundos). Para rearmarla (otra SDL3): docker rmi catan-release:ubuntu22.04.
+#
# Docker corre en esta compu (en la X1 pancho no esta en el grupo docker: se usa sudo con el
# popup de sudo-askpass), o en RELEASE_HOST por ssh (ej. RELEASE_HOST=ct112-remoto, que tiene
-# docker y entramos como root).
+# docker y entramos como root; ahi la imagen queda armada en ese host y no hace falta sudo).
# Uso: tools/linux-release.sh <version> <salida> (lo llama make release)
set -e
VERSION=$1; OUT=$2
@@ -16,29 +20,24 @@ if [ -z "$VERSION" ] || [ -z "$OUT" ]; then
exit 1
fi
HOST=${RELEASE_HOST:-local}
-DOCKER=docker
-if [ "$HOST" = local ] && ! docker info >/dev/null 2>&1; then
- export SUDO_ASKPASS=${SUDO_ASKPASS:-$(command -v sudo-askpass || true)}
- if [ -z "$SUDO_ASKPASS" ]; then
- echo "docker necesita sudo y no hay sudo-askpass (o pone SUDO_ASKPASS, o RELEASE_HOST=...)" >&2
- exit 1
- fi
- DOCKER="sudo -A docker"
-fi
+IMAGE=catan-release:ubuntu22.04
SDL_SRC=${WIN_SDL_SRC:-$HOME/.local/opt/src/SDL3-3.4.16}
ROOT=$(cd "$(dirname "$0")/../.." && pwd)
-# lo que corre dentro del contenedor: /src el repo, /sdl la fuente de SDL3, /out la salida
-BUILD='set -e
-export DEBIAN_FRONTEND=noninteractive
-apt-get update -qq >/dev/null
-apt-get install -y -qq build-essential cmake ninja-build pkg-config libncurses-dev \
+# la imagen: Ubuntu 22.04 con lo necesario para compilar y SDL3 estatico instalado
+DOCKERFILE='FROM ubuntu:22.04
+ENV DEBIAN_FRONTEND=noninteractive
+RUN apt-get update -qq && apt-get install -y -qq build-essential cmake ninja-build pkg-config libncurses-dev \
libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxss-dev libxfixes-dev libxtst-dev \
libwayland-dev libxkbcommon-dev wayland-protocols libegl-dev libgl-dev libdecor-0-dev \
- libasound2-dev libpulse-dev libdrm-dev libgbm-dev >/dev/null
-cmake -S /sdl -B /tmp/sdl -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/sdl \
- -DSDL_SHARED=OFF -DSDL_STATIC=ON -DSDL_TESTS=OFF -DSDL_EXAMPLES=OFF >/dev/null
-cmake --build /tmp/sdl >/dev/null && cmake --install /tmp/sdl >/dev/null
+ libasound2-dev libpulse-dev libdrm-dev libgbm-dev >/dev/null && rm -rf /var/lib/apt/lists/*
+COPY . /sdl
+RUN cmake -S /sdl -B /tmp/sdl -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/sdl \
+ -DSDL_SHARED=OFF -DSDL_STATIC=ON -DSDL_TESTS=OFF -DSDL_EXAMPLES=OFF >/dev/null \
+ && cmake --build /tmp/sdl >/dev/null && cmake --install /tmp/sdl >/dev/null && rm -rf /tmp/sdl /sdl'
+
+# lo que corre dentro del contenedor: /src el repo, /out la salida
+BUILD='set -e
cp -r /src /tmp/j && cd /tmp/j/catan && rm -f catan
make catan VERSION="$VERSION" CFLAGS="-O2" \
SDL="$(PKG_CONFIG_PATH=/opt/sdl/lib/pkgconfig pkg-config --cflags --static --libs sdl3)" \
@@ -48,23 +47,43 @@ cp catan /out/catan
ldd /out/catan | sed "s/^/ /"'
if [ "$HOST" = local ]; then
- mkdir -p "$(dirname "$OUT")"
+ DOCKER=docker
+ if ! docker info >/dev/null 2>&1; then
+ export SUDO_ASKPASS=${SUDO_ASKPASS:-$(command -v sudo-askpass || true)}
+ if [ -z "$SUDO_ASKPASS" ]; then
+ echo "docker necesita sudo y no hay sudo-askpass (o pone SUDO_ASKPASS, o RELEASE_HOST=...)" >&2
+ exit 1
+ fi
+ DOCKER="sudo -A docker"
+ fi
T=$(mktemp -d)
trap 'rm -rf "$T"' EXIT
- $DOCKER run --rm -v "$ROOT":/src:ro -v "$SDL_SRC":/sdl:ro -v "$T":/out -e VERSION="$VERSION" \
- ubuntu:22.04 sh -c "$BUILD"
- cp "$T/catan" "$OUT"
+ if ! $DOCKER image inspect $IMAGE >/dev/null 2>&1; then
+ echo "armando la imagen $IMAGE (una sola vez: Ubuntu 22.04 + SDL3 estatico, ~10 min)..." >&2
+ mkdir -p "$T/sdl"
+ tar -C "$SDL_SRC" --exclude='./build*' -c . | tar -x -C "$T/sdl"
+ printf '%s\n' "$DOCKERFILE" > "$T/sdl/Dockerfile"
+ $DOCKER build -q -t $IMAGE "$T/sdl" >/dev/null
+ fi
+ mkdir -p "$(dirname "$OUT")" "$T/out"
+ $DOCKER run --rm -v "$ROOT":/src:ro -v "$T/out":/out -e VERSION="$VERSION" $IMAGE sh -c "$BUILD"
+ cp "$T/out/catan" "$OUT"
exit 0
fi
-# remoto: se manda el codigo (lo que esta en git, tal como esta ahora) y la fuente de SDL3
+# remoto: la imagen vive en ese host (se arma la primera vez, mandando la fuente de SDL3);
+# el codigo que se manda es lo que esta en git, tal como esta ahora
R=/tmp/catan-release
-ssh "$HOST" "rm -rf $R && mkdir -p $R/src $R/sdl $R/out"
+if ! ssh "$HOST" "docker image inspect $IMAGE >/dev/null 2>&1"; then
+ echo "armando la imagen $IMAGE en $HOST (una sola vez, ~10 min)..." >&2
+ ssh "$HOST" "rm -rf $R/sdl && mkdir -p $R/sdl"
+ tar -C "$SDL_SRC" --exclude='./build*' -cz . | ssh "$HOST" "tar -xz -C $R/sdl"
+ printf '%s\n' "$DOCKERFILE" | ssh "$HOST" "cat > $R/sdl/Dockerfile && docker build -q -t $IMAGE $R/sdl >/dev/null && rm -rf $R/sdl"
+fi
+ssh "$HOST" "rm -rf $R/src $R/out && mkdir -p $R/src $R/out"
# (sin pipefail en sh: si tar falla por un archivo versionado borrado, lo acusa el build)
(cd "$ROOT" && git ls-files -z | tar --null -T - -cz) | ssh "$HOST" "tar -xz -C $R/src"
-tar -C "$SDL_SRC" --exclude='build*' -cz . | ssh "$HOST" "tar -xz -C $R/sdl"
-ssh "$HOST" "docker run --rm -v $R/src:/src:ro -v $R/sdl:/sdl:ro -v $R/out:/out -e VERSION='$VERSION' \
- ubuntu:22.04 sh -c '$(printf '%s' "$BUILD" | sed "s/'/'\\\\''/g")'"
+ssh "$HOST" "docker run --rm -v $R/src:/src:ro -v $R/out:/out -e VERSION='$VERSION' $IMAGE sh -c '$(printf '%s' "$BUILD" | sed "s/'/'\\\\''/g")'"
mkdir -p "$(dirname "$OUT")"
scp -q "$HOST:$R/out/catan" "$OUT"
-ssh "$HOST" "rm -rf $R"
+ssh "$HOST" "rm -rf $R/src $R/out"