todos-contra-el-fuego-web/.forgejo/workflows/e2e.yml
vjrj c92f25a9a6
All checks were successful
build-image / test (push) Successful in 2m52s
build-image / build (push) Successful in 12m12s
fix(ci): run playwright from e2e/, npx --prefix does not change the cwd
`npx --prefix e2e playwright test` resolves the binary but keeps the working
directory, so playwright would look for playwright.config.js in the app root,
find none, and run with defaults against no tests. Caught before tonight's first
scheduled run.
2026-08-01 19:07:11 +02:00

129 lines
5.2 KiB
YAML

# Suite de navegador (Playwright) + smoke REST contra un stack EFÍMERO.
#
# POR QUÉ NOCTURNO Y NO EN CADA PUSH: esto construye el bundle de producción
# entero (`meteor build`, lo mismo que hace la imagen) y además baja un Chromium.
# aaron es un host compartido con `capacity: 1`: si esto corriera en cada push,
# la forja se quedaría sin turno. Los tests de servidor (build-image.yml) sí van
# en cada push y son los que bloquean la imagen.
#
# POR QUÉ NO USA docker compose: el runner no tiene socket de Docker (ver la nota
# de build-image.yml) — así que en vez de levantar docker-compose.e2e.yml, este
# job construye el bundle y lo arranca dentro de su propio contenedor, con Mongo
# como service container. El compose sigue siendo la forma de correrlo en local.
#
# ⚠️ Las dos siembras (smoke/seed.js y e2e/seed.js) BORRAN colecciones. Aquí eso
# es seguro porque el Mongo es un service container que muere con el job. Jamás
# apuntes esto a testfuegos.comunes.org.
name: e2e
on:
schedule:
# 04:15 UTC, con el runner libre.
- cron: '15 4 * * *'
workflow_dispatch:
jobs:
e2e:
runs-on: docker
container:
image: node:22-bookworm
# El pico es el `meteor build`, igual que en el job de la imagen.
options: --memory=4g --memory-swap=4g --cpus=3
services:
mongo:
image: mongo:7
# Nodo suelto, sin replica set: los service containers no dejan cambiar
# el comando de arranque. Sin oplog Meteor cae a polling (cada 10s), así
# que los tests que esperan a la unión tardan más — por eso sus timeouts
# son de 60s. En local (docker-compose.e2e.yml) sí hay replica set.
options: >-
--health-cmd "mongosh --quiet --eval 'db.adminCommand({ping:1}).ok'"
--health-interval 5s --health-timeout 5s --health-retries 20
env:
METEOR_ALLOW_SUPERUSER: '1'
NODE_OPTIONS: --dns-result-order=ipv4first --no-network-family-autoselection
METEOR_RELEASE: '3.1'
MONGO_URL: mongodb://mongo:27017/fuegos
ROOT_URL: http://localhost:3000
PORT: '3000'
BASE_URL: http://localhost:3000
E2E_BASE_URL: http://localhost:3000
SETTINGS: settings-ci.json
steps:
- name: Herramientas
run: |
set -e
apt-get update -qq
apt-get install -y --no-install-recommends \
curl ca-certificates git python3 python-is-python3 make g++ >/dev/null
# mongosh por npm: el cliente no viene en node:22 y el service container
# de mongo no es accesible con `docker exec` desde el job.
npm install -g mongosh@2 >/dev/null
- name: Descargar el código
env:
TOKEN: ${{ github.token }}
run: |
set -e
mkdir -p src
wget -q -O src.tar.gz \
"http://x-access-token:${TOKEN}@forgejo:3000/api/v1/repos/${GITHUB_REPOSITORY}/archive/${GITHUB_SHA}.tar.gz"
tar xzf src.tar.gz -C src --strip-components=1
rm -f src.tar.gz
- name: Instalar meteor-tool
run: curl -fsSL "https://install.meteor.com/?release=${METEOR_RELEASE}" | sh
- name: Construir el bundle de producción
run: |
set -e
cd src
meteor npm ci --no-audit --no-fund
meteor build /tmp/build --directory --server-only
cd /tmp/build/bundle/programs/server && npm install --omit=dev --no-audit --no-fund
- name: Arrancar el servidor
run: |
set -e
cd /tmp/build/bundle
METEOR_SETTINGS="$(cat "${GITHUB_WORKSPACE}/src/settings-ci.json")" \
node main.js > /tmp/server.log 2>&1 &
for i in $(seq 1 90); do
wget -qO /dev/null "http://127.0.0.1:3000/" && break
sleep 2
done
wget -qO /dev/null "http://127.0.0.1:3000/" || { echo "El servidor no arrancó:"; tail -50 /tmp/server.log; exit 1; }
# El smoke va primero y con su propia siembra: compara respuestas byte a
# byte contra snapshots, así que cualquier dato que dejen los e2e (una
# suscripción, la unión recalculada) lo haría fallar.
- name: Smoke REST
run: |
set -e
cd src
mongosh --host mongo --quiet fuegos smoke/seed.js
node smoke/run.js
- name: Suite e2e
run: |
set -e
cd src
mongosh --host mongo --quiet fuegos e2e/seed.js
# Dentro de e2e/: playwright busca su playwright.config.js en el
# directorio de trabajo, y `npx --prefix` resuelve el binario pero NO
# cambia el cwd (correría sin config y sin encontrar los tests).
cd e2e
npm ci --no-audit --no-fund
npx playwright install --with-deps chromium
npx playwright test
# Sin `actions/upload-artifact` (action JS, ver fase 9 §3): al menos el log
# del servidor y la lista de trazas quedan en la salida del job.
- name: Diagnóstico en caso de fallo
if: failure()
run: |
echo "===== últimas 200 líneas del servidor ====="
tail -200 /tmp/server.log || true
echo "===== trazas de Playwright ====="
ls -R src/e2e/test-results 2>/dev/null | head -50 || true