#!/usr/bin/env bash # Compila o Breakout 71 (roguelite de quebra-tijolos de Renan LE CARO, AGPL-3.0; TypeScript + Parcel 2, resultado: um unico # index.html) a partir do commit f16a404 de gitlab.com/lecarore/breakout71, com o Node 24.21.0 de artifacts/tools e o # package-lock.json do autor ("npm ci"). # # Mudancas no jogo (breakout-71/breakout-71-fredygames.patch): sem os links do menu (doacao, Discord, lojas, repositorio, # traducao, arquivo) nem o lembrete de doacao nem a entrada do editor de fases, sem service worker/manifest de PWA e uma CSP que bloqueia qualquer conexao # fora da propria pagina. O editor de fases (editor.html) nao e publicado. breakout-71/filter-levels.py tira de levels.json as # fases de pixel art da comunidade que reproduzem personagens, logotipos e capas de terceiros (744 -> 504 fases). # # src/FredGames.Bundler/Builds/build-breakout-71.sh # # Saida: artifacts/build/breakout-71-f16a404/breakout-71-f16a404-dist.tar.gz (dist/index.html); o tar.gz tem que sair igual # em dois builds. set -euo pipefail COMMIT=f16a40470dd66d1ef77ea123be9f6b08d5b22c5b SHA256=63be784690d683c8bb7669960fc3c37ba942a2d98fa2c9911b812030a4fc81fa NODE=24.21.0 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/breakout-71-${COMMIT:0:7}" cache="$root/artifacts/build/cache" tgz="$cache/breakout-71-${COMMIT:0:7}.tar.gz" nodebin="$root/artifacts/tools/node-v$NODE/bin" [ -x "$nodebin/node" ] && [ "$("$nodebin/node" -v)" = "v$NODE" ] || { echo "Precisa do Node $NODE em $nodebin." >&2; exit 1; } export PATH="$nodebin:$PATH" mkdir -p "$cache" if [ ! -f "$tgz" ]; then curl -fsSL --retry 4 "https://gitlab.com/api/v4/projects/lecarore%2Fbreakout71/repository/archive.tar.gz?sha=$COMMIT" -o "$tgz.partial" && mv "$tgz.partial" "$tgz" fi echo "$SHA256 $tgz" | shasum -a 256 -c - rm -rf "$out" mkdir -p "$out/tree" "$out/dist" tar -xzf "$tgz" -C "$out/tree" --strip-components 1 cd "$out/tree" patch -s -p1 < "$here/breakout-71/breakout-71-fredygames.patch" python3 -I "$here/breakout-71/filter-levels.py" src/data/levels.json export npm_config_cache="$cache/npm-breakout-71" npm ci --ignore-scripts --no-audit --no-fund > "$out/install.log" 2>&1 || { tail -20 "$out/install.log"; exit 1; } rm -rf build .parcel-cache NO_COLOR=1 npx parcel build src/index.html --dist-dir build --no-cache --no-source-maps > "$out/parcel.log" 2>&1 || { tail -30 "$out/parcel.log"; exit 1; } ls build > "$out/build-files.txt" [ -s build/index.html ] cp build/index.html "$out/dist/index.html" # nada de endereco externo, service worker ou manifest no que e servido if grep -qE 'serviceWorker|stripe\.com|discord\.gg|play\.google\.com|f-droid\.org|itch\.io|weblate' "$out/dist/index.html"; then echo "Sobrou referencia externa no index.html:" >&2 grep -oE 'serviceWorker|stripe\.com|discord\.gg|play\.google\.com|f-droid\.org|itch\.io|weblate' "$out/dist/index.html" | sort | uniq -c >&2 exit 1 fi # dist/ vira um tar.gz deterministico (datas fixas, ordem fixa, sem dono). find "$out/dist" -exec touch -t 202604090000 {} + ( cd "$out" && find dist -type f | LC_ALL=C sort > files.txt \ && COPYFILE_DISABLE=1 tar --format=ustar --uid 0 --gid 0 --uname root --gname root -n -cf - -T files.txt \ | gzip -n -9 > "breakout-71-${COMMIT:0:7}-dist.tar.gz" && rm files.txt ) ls -l "$out/breakout-71-${COMMIT:0:7}-dist.tar.gz" "$out/dist/index.html" rm -rf "$out/tree" shasum -a 256 "$out/breakout-71-${COMMIT:0:7}-dist.tar.gz"