What a builder boot sees is now what a node does: - First boots (untouched, or -as-deployed with exactly a new server's settings) are deployed by the node-agent's BootTest in keep mode; the builder only watches the console and inspects what's left. The Go copy of the deploy (its own docker run, mounts and startup prefix) is gone. It had drifted: it gave the image's VOLUME folders their own volumes, which nodes don't, so saves there looked safe while every start loses them. - Files written outside /server and /data are counted whatever their type (it only counted config-like extensions, so .sav or .db saves went unseen), including the image's VOLUME folders; logs, pid and lock files and system folders are left out. - Boot tests ask the server to stay up holdSec (60 s, test.yaml can set it) after its ready line and to listen on every published container port (needs the node-agent's matching BootTest). - Steam apps are downloaded once per build into a gbr.cache volume and copied into each boot, so later boots only check the files (STEAM_CACHE=off). - RUNNER.md no longer suggests docker system prune, which deletes the gbr-boottest network when nothing is using it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 lines
1.8 KiB
JSON
44 lines
1.8 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://www.gitea.gbreed.com/gbreed-public/gbr-games/raw/branch/main/schema/test.schema.json",
|
|
"title": "GBR Hosting game boot-test fixture",
|
|
"description": "Values CI uses when boot-testing a template. Never put real credentials here: map them to a Gitea Actions secret under 'secrets'.",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"config": {
|
|
"description": "Config values for the test server, layered on top of defaultConfig (e.g. EULA: true).",
|
|
"type": "object",
|
|
"propertyNames": { "pattern": "^[a-zA-Z0-9_.-]+$" }
|
|
},
|
|
"secrets": {
|
|
"description": "Config key -> name of a Gitea Actions secret. If a secret is missing, the boot test is skipped, not failed.",
|
|
"type": "object",
|
|
"propertyNames": { "pattern": "^[a-zA-Z0-9_.-]+$" },
|
|
"additionalProperties": { "type": "string", "pattern": "^[A-Z][A-Z0-9_]*$" }
|
|
},
|
|
"timeoutSec": {
|
|
"description": "How long to wait for the server to become ready, including install.",
|
|
"type": "integer",
|
|
"minimum": 60,
|
|
"maximum": 7200
|
|
},
|
|
"readyExample": {
|
|
"description": "A real console line from a server that is ready. Validation checks the game's readyPattern matches it, so a broken pattern fails in seconds instead of timing out a boot test.",
|
|
"type": "string"
|
|
},
|
|
"settleSec": {
|
|
"description": "For games without a readyPattern: how long the server must stay up after starting to pass.",
|
|
"type": "integer",
|
|
"minimum": 10,
|
|
"maximum": 3600
|
|
},
|
|
"holdSec": {
|
|
"description": "How long the server must stay up after its ready line to pass (default 60). Its published ports are checked after it.",
|
|
"type": "integer",
|
|
"minimum": 0,
|
|
"maximum": 3600
|
|
}
|
|
}
|
|
}
|