426e9eeabd
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
ci / test (push) Has been cancelled
ci / lint-and-format (push) Has been cancelled
ci / build (push) Has been cancelled
ci / dev-startup (push) Has been cancelled
gitleaks / gitleaks (push) Has been cancelled
Markdown Links / Relative Markdown Links (push) Has been cancelled
Quality (Extended) / Homepage Build (PR smoke) (push) Has been cancelled
Quality (Extended) / Comment-only diff guard (push) Has been cancelled
Quality (Extended) / Format + Type Safety Ratchet (push) Has been cancelled
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Has been cancelled
Quality (Extended) / Develop Gate (lint) (push) Has been cancelled
Chat shell gestures / Chat shell gesture + parity e2e (push) Has been cancelled
Cloud Gateway Discord / Test (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Has been cancelled
Build Agent Image / build-and-push (push) Has been cancelled
Dev Smoke / bun run dev onboarding chat (push) Has been cancelled
Dev Smoke / Vite HMR dependency-level smoke (push) Has been cancelled
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Has been cancelled
Publish @elizaos/example-code / check_npm (push) Has been cancelled
Publish @elizaos/example-code / publish_npm (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / verify_version (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / publish_npm (push) Has been cancelled
Sandbox Live Smoke / Sandbox live smoke (push) Has been cancelled
Snap Build & Test / Build Snap (amd64) (push) Has been cancelled
Snap Build & Test / Build Snap (arm64) (push) Has been cancelled
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Has been cancelled
Cloud Gateway Webhook / Test (push) Has been cancelled
Cloud Tests / lint-and-types (push) Has been cancelled
Cloud Tests / unit-tests (push) Has been cancelled
Cloud Tests / integration-tests (push) Has been cancelled
Cloud Tests / e2e-tests (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Apps Worker (Product 2) / Determine environment (push) Has been cancelled
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Has been cancelled
Deploy Eliza Provisioning Worker / Determine environment (push) Has been cancelled
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Has been cancelled
Dev Smoke / Classify changed paths (push) Has been cancelled
supply-chain / sbom (push) Has been cancelled
supply-chain / vulnerability-scan (push) Has been cancelled
Build, Push & Deploy to Phala Cloud / build-and-push (push) Has been cancelled
Test Packaging / Validate Packaging Configs (push) Has been cancelled
Test Packaging / Build & Test PyPI Package (push) Has been cancelled
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Has been cancelled
Test Packaging / Pack & Test JS Tarballs (push) Has been cancelled
UI Fixture E2E / ui-fixture-e2e (push) Has been cancelled
UI Fixture E2E / fixture-e2e (push) Has been cancelled
UI Story Gate / story-gate (push) Has been cancelled
vault-ci / test (macos-latest) (push) Has been cancelled
vault-ci / test (ubuntu-latest) (push) Has been cancelled
vault-ci / test (windows-latest) (push) Has been cancelled
vault-ci / app-core wiring tests (push) Has been cancelled
verify-patches / verify patches/CHECKSUMS.sha256 (push) Has been cancelled
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Has been cancelled
Voice Benchmark Smoke / voice bench smoke summary (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Has been cancelled
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Has been cancelled
121 lines
3.3 KiB
TypeScript
121 lines
3.3 KiB
TypeScript
/**
|
|
* Exercises safe self-hosted runner workspace cleanup planning without touching
|
|
* real runner paths.
|
|
*/
|
|
|
|
import { afterEach, describe, expect, it } from "bun:test";
|
|
import {
|
|
mkdirSync,
|
|
mkdtempSync,
|
|
rmSync,
|
|
utimesSync,
|
|
writeFileSync,
|
|
} from "node:fs";
|
|
import { tmpdir } from "node:os";
|
|
import { join } from "node:path";
|
|
import {
|
|
buildRunnerWorkspacePrunePlan,
|
|
findRunnerWorkDirs,
|
|
parseRunnerWorkspacePruneArgs,
|
|
} from "./prune-runner-workspaces";
|
|
|
|
const roots: string[] = [];
|
|
|
|
function tempRoot(): string {
|
|
const root = mkdtempSync(join(tmpdir(), "runner-workspaces-test-"));
|
|
roots.push(root);
|
|
return root;
|
|
}
|
|
|
|
afterEach(() => {
|
|
for (const root of roots.splice(0))
|
|
rmSync(root, { recursive: true, force: true });
|
|
});
|
|
|
|
describe("parseRunnerWorkspacePruneArgs", () => {
|
|
it("defaults to the prod runner root and dry-run off", () => {
|
|
expect(parseRunnerWorkspacePruneArgs([], {})).toEqual({
|
|
root: "/opt/actions-runners",
|
|
minAgeHours: 6,
|
|
dryRun: false,
|
|
allowActive: false,
|
|
});
|
|
});
|
|
|
|
it("accepts explicit root, age floor, dry-run, and active override", () => {
|
|
expect(
|
|
parseRunnerWorkspacePruneArgs(
|
|
[
|
|
"--root",
|
|
"/tmp/runners",
|
|
"--min-age-hours",
|
|
"12",
|
|
"--dry-run",
|
|
"--allow-active",
|
|
],
|
|
{},
|
|
),
|
|
).toEqual({
|
|
root: "/tmp/runners",
|
|
minAgeHours: 12,
|
|
dryRun: true,
|
|
allowActive: true,
|
|
});
|
|
});
|
|
|
|
it("uses env fallback and rejects unsafe age values", () => {
|
|
expect(
|
|
parseRunnerWorkspacePruneArgs([], {
|
|
RUNNER_WORKSPACE_ROOT: "/var/runners",
|
|
RUNNER_WORKSPACE_MIN_AGE_HOURS: "24",
|
|
}),
|
|
).toMatchObject({ root: "/var/runners", minAgeHours: 24 });
|
|
|
|
expect(() =>
|
|
parseRunnerWorkspacePruneArgs(["--min-age-hours", "0"], {}),
|
|
).toThrow("Invalid min-age-hours");
|
|
});
|
|
});
|
|
|
|
describe("findRunnerWorkDirs", () => {
|
|
it("discovers runner _work dirs under a runner root", () => {
|
|
const root = tempRoot();
|
|
const runnerWork = join(root, "runner-1", "_work");
|
|
const nestedWork = join(root, "group", "_work");
|
|
mkdirSync(runnerWork, { recursive: true });
|
|
mkdirSync(nestedWork, { recursive: true });
|
|
|
|
expect(findRunnerWorkDirs(root)).toEqual([runnerWork, nestedWork].sort());
|
|
});
|
|
});
|
|
|
|
describe("buildRunnerWorkspacePrunePlan", () => {
|
|
it("selects only stale children of _work directories", () => {
|
|
const root = tempRoot();
|
|
const work = join(root, "runner-1", "_work");
|
|
const stale = join(work, "repo-old");
|
|
const fresh = join(work, "repo-new");
|
|
mkdirSync(stale, { recursive: true });
|
|
mkdirSync(fresh, { recursive: true });
|
|
writeFileSync(join(stale, "file.txt"), "old");
|
|
writeFileSync(join(fresh, "file.txt"), "new");
|
|
|
|
const now = Date.now();
|
|
const oldDate = new Date(now - 8 * 60 * 60_000);
|
|
const freshDate = new Date(now - 30 * 60_000);
|
|
utimesSync(stale, oldDate, oldDate);
|
|
utimesSync(fresh, freshDate, freshDate);
|
|
|
|
const plan = buildRunnerWorkspacePrunePlan({
|
|
root,
|
|
now,
|
|
minAgeHours: 6,
|
|
});
|
|
|
|
expect(plan.workDirs).toEqual([work]);
|
|
expect(plan.entries.map((entry) => entry.path)).toEqual([stale]);
|
|
expect(plan.skippedFresh).toBe(1);
|
|
expect(plan.totalBytes).toBeGreaterThan(0);
|
|
});
|
|
});
|