The builder could only create games; nothing noticed when a live template stopped working, and there was no way to tell whether a builder change made it better or worse. - repair -id ID: boots an existing template as nodes run it; if it fails, the same investigation as for a draft runs and the model changes only what the diagnosis says. The worker handles "repair" jobs (gameId from the panel) and opens "fix(games): repair ..." on draft/<id>; a template that boots as it is reports "nothing to repair" and opens no PR. The boot and fix loop is now shared by builds and repairs. - validate.yml runs weekly and boot-tests every game; failed games are sent to the panel (X-GBR-Event: games_boot_failed) to queue repairs. - eval -ids all: builds games that already have a template from scratch, blind, and scores each draft against it (boots, same image and app, ports, ready line, settings found) into eval.md and eval.json. - research skips our own sites, so neither research nor eval reads our templates back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
60 lines
2.2 KiB
Bash
Executable File
60 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Boot-tests the given games with the node-agent's real deploy code, one after another.
|
|
# Each game is deployed on this machine's Docker daemon inside the isolated gbr-boottest network and
|
|
# must reach its readyPattern (or stay up) before its timeout. Games needing a secret CI doesn't
|
|
# have are skipped. Exits non-zero if any game failed.
|
|
# boot-test.sh palworld minecraft-crossplay
|
|
set -uo pipefail
|
|
|
|
AGENT_IMAGE="${AGENT_IMAGE:-www.gitea.gbreed.com/gbreed-public/gbr-node-agent:latest}"
|
|
NETWORK=gbr-boottest
|
|
|
|
if ! docker network inspect "$NETWORK" > /dev/null 2>&1; then
|
|
# Created by the runner setup with LAN access blocked; never fall back to an unisolated network
|
|
echo "::error::Docker network $NETWORK is missing on this runner; see RUNNER.md"
|
|
exit 1
|
|
fi
|
|
docker pull -q "$AGENT_IMAGE" > /dev/null
|
|
|
|
# Built once: "go run" would turn the skip exit code (3) into a plain failure
|
|
gbrgames="${RUNNER_TEMP:-/tmp}/gbrgames"
|
|
go build -o "$gbrgames" ./cmd/gbrgames || exit 1
|
|
|
|
passed=() failed=() skipped=()
|
|
for id in "$@"; do
|
|
echo "::group::boot test: $id"
|
|
# Seconds instead of a full boot: catches templates that can't work with their image (wrong
|
|
# container user, startup command reading a variable under the wrong name)
|
|
if ! "$gbrgames" inspect-image -game "$id"; then
|
|
failed+=("$id")
|
|
echo "::endgroup::"
|
|
continue
|
|
fi
|
|
payload=$("$gbrgames" boottest-payload "$id")
|
|
code=$?
|
|
if [ $code -eq 3 ]; then
|
|
skipped+=("$id")
|
|
echo "::endgroup::"
|
|
continue
|
|
elif [ $code -ne 0 ]; then
|
|
failed+=("$id")
|
|
echo "::endgroup::"
|
|
continue
|
|
fi
|
|
|
|
docker run --rm -i \
|
|
-v /var/run/docker.sock:/var/run/docker.sock \
|
|
--entrypoint java "$AGENT_IMAGE" \
|
|
-Dloader.main=com.gbreed.gbr.nodeagent.BootTest -cp app.jar \
|
|
org.springframework.boot.loader.launch.PropertiesLauncher <<< "$payload"
|
|
if [ $? -eq 0 ]; then passed+=("$id"); else failed+=("$id"); fi
|
|
echo "::endgroup::"
|
|
done
|
|
|
|
echo "passed: ${passed[*]:-none}"
|
|
echo "skipped: ${skipped[*]:-none} (missing secrets)"
|
|
echo "failed: ${failed[*]:-none}"
|
|
# For the workflow: the weekly run queues a repair for each failed game
|
|
[ -n "${GITHUB_OUTPUT:-}" ] && echo "failed=${failed[*]}" >> "$GITHUB_OUTPUT"
|
|
[ ${#failed[@]} -eq 0 ]
|