diff --git a/infra/build-server/workers/install.sh b/infra/build-server/workers/install.sh index 6842091e3..91bce76d4 100755 --- a/infra/build-server/workers/install.sh +++ b/infra/build-server/workers/install.sh @@ -1,11 +1,18 @@ #!/usr/bin/env bash # Install or refresh the worker dashboard collector on igneum-build-1 from this Mac. -# infra/build-server/workers/install.sh copies tools/workers/{lib,collect}.mjs and the two units, enables the timer -# Needs root over ssh (root@ with ~/.ssh/igneum_ed25519); the host ip comes from ~/.config/igneum/build-server (build@). +# infra/build-server/workers/install.sh build-1: copies tools/workers/{lib,collect}.mjs and the two units, enables the timer +# infra/build-server/workers/install.sh 2 igneum-build-2 (host line in ~/.config/igneum/build-server-2), 3 for build-3 +# infra/build-server/workers/install.sh build@ any box by its host line +# Needs root over ssh (root@ with ~/.ssh/igneum_ed25519); the host ip comes from ~/.config/igneum/build-server[-N] (build@). set -euo pipefail HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"; ROOT="$(cd "$HERE/../../.." && pwd)" KEY="${IGNEUM_BUILD_KEY:-$HOME/.ssh/igneum_ed25519}" -HOST_LINE="$(head -1 "${IGNEUM_BUILD_HOST_FILE:-$HOME/.config/igneum/build-server}" | tr -d '[:space:]')" +case "${1:-}" in + "") HOST_LINE="$(head -1 "${IGNEUM_BUILD_HOST_FILE:-$HOME/.config/igneum/build-server}" | tr -d '[:space:]')" ;; + [2-9]) HOST_LINE="$(head -1 "$HOME/.config/igneum/build-server-$1" | tr -d '[:space:]')" ;; + *@*) HOST_LINE="$1" ;; + *) echo "usage: install.sh [N | build@]" >&2; exit 2 ;; +esac IP="${HOST_LINE#*@}"; [ -n "$IP" ] || { echo "no build server in ~/.config/igneum/build-server" >&2; exit 1; } SSH=(ssh -i "$KEY" -o BatchMode=yes -o StrictHostKeyChecking=accept-new -o ConnectTimeout=10) "${SSH[@]}" "root@$IP" 'install -d -o build -g build /srv/workers /srv/workers/bin /srv/workers/sources /srv/builds/_log; chown build:build /srv/builds/_log' diff --git a/tools/workers/lib.mjs b/tools/workers/lib.mjs index 6933e9148..52063e9fd 100644 --- a/tools/workers/lib.mjs +++ b/tools/workers/lib.mjs @@ -130,6 +130,7 @@ export function parseLockDir(files, { day, now, aliveFn } = {}) { const alive = line && aliveFn ? aliveFn(line.pid) : null; const isHeld = f.held ?? (line ? alive !== false : false); if (line && isHeld) held.push({ slot: f.name, ...line, kind: deriveKind(line) }); + else if (f.held === true) held.push({ slot: f.name, pid: null, since: null, waited_s: null, label: null, agent: null, worktree: null, crate: null, command: null, target: null, kind: null, nice: null, cores: null, no_line: true }); // the flock is taken but the holder wrote no line (7 Oct 2026: the scheduling-class path on build-1) else free.push(f.name); } held.sort((a, b) => a.slot.localeCompare(b.slot)); diff --git a/tools/workers/page/workers.html b/tools/workers/page/workers.html index c83c9f0a7..4d1037948 100644 --- a/tools/workers/page/workers.html +++ b/tools/workers/page/workers.html @@ -40,6 +40,7 @@ time[title] { cursor: help; border-bottom: 1px dotted var(--line); } /* the server */ + .server + .server { margin-top: 12px; } .server { margin-top: 18px; background: var(--panel); border: 1px solid var(--line); position: relative; overflow: hidden; } .server.hot::after { content: ""; position: absolute; inset: auto -30% -70% -30%; height: 90%; background: radial-gradient(ellipse at center, rgba(242,84,27,.18), transparent 60%); pointer-events: none; animation: breathe 3.2s ease-in-out infinite; } @keyframes breathe { 0%, 100% { opacity: .5; } 50% { opacity: 1; } } @@ -149,15 +150,7 @@
waiting for the first write
-
-
-
igneum-build-1build server
-
-
-
-
cores
-
-
+

Workers every machine that builds, tests or measures

@@ -183,7 +176,7 @@