Merge fix/vili-runner-build: daemon tests run their stub Blender from the checkout, not noexec /tmp (Soul s4)

Idunn's node-build runner mounts /tmp noexec, so test-daemon failed 20 of 137 and
the 2026-10-25 deploy failed in Sealing. The stub now lives under the gitignored
.vili/test-scratch. The whole recipe passes by hand in the runner's shape.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-10-25 02:49:11 +01:00
commit 51eb113d57

View file

@ -19,6 +19,9 @@ const stubBlenderPath = path.join(here, "fixtures", "stub-blender.mjs");
const exportScriptPath = path.join(here, "bvh-to-fbx.py");
const fakeIdunnEntry = path.join(here, "fixtures", "fake-idunn-entry.mjs");
const THREADS = 5;
// The stub Blender is executed, and the recipe's runner mounts /tmp noexec (and the root read-only), so it cannot live
// there. It lives under the checkout's gitignored .vili, which the runner's workspace leaves writable.
const execScratch = path.join(here, "..", ".vili", "test-scratch");
async function until(condition, what, seconds = 15) {
const deadline = Date.now() + seconds * 1000;
@ -65,7 +68,8 @@ async function startDaemon({
if (threads !== null) settings.threads = threads;
// Blender is a copy of the stub in a directory of its own (the stub logs its starts beside itself): "stub" is
// ready, "broken" fails its version probe, "missing" is a path with nothing there, null is unconfigured.
const blenderDir = mkdtempSync(path.join(os.tmpdir(), "vili-blender-"));
mkdirSync(execScratch, { recursive: true });
const blenderDir = mkdtempSync(path.join(execScratch, "blender-"));
const blenderPath = blender === null ? null : path.join(blenderDir, { stub: "blender", broken: "blender-broken", missing: "absent" }[blender]);
if (blender === "stub" || blender === "broken") {
copyFileSync(stubBlenderPath, blenderPath);