juegos

Juegos de terminal de Pancho: Catan (TUI, GUI, web, servidor, PicoCalc), ajedrez, calculadora y minijuegos
git clone https://git.lu3dhn.xyz/juegos.git
Log | Files | Refs

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:
MCLAUDE.md | 3++-
Mcatan/Makefile | 6+++++-
Mcatan/tools/linux-release.sh | 77++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
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"