Files
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 12:43:05 +08:00

232 lines
6.0 KiB
JavaScript

/** Supports app-core build, packaging, or development orchestration for docker runtime review mjs. */
import { spawn } from "node:child_process";
import fs from "node:fs";
import path from "node:path";
const repoRoot = process.cwd();
const qaRoot = path.join(repoRoot, ".tmp", "qa");
fs.mkdirSync(qaRoot, { recursive: true });
const reportDir = fs.mkdtempSync(path.join(qaRoot, "docker-runtime-review-"));
function findDockerBin() {
const candidates = [
process.env.DOCKER_BIN,
"/usr/local/bin/docker",
"/opt/homebrew/bin/docker",
"/Applications/Docker.app/Contents/Resources/bin/docker",
].filter(Boolean);
for (const candidate of candidates) {
if (candidate && fs.existsSync(candidate)) {
return candidate;
}
}
return null;
}
function runCommand(command, args, options = {}) {
const { cwd = repoRoot, env = process.env, timeoutMs = 20_000 } = options;
return new Promise((resolve) => {
const startedAt = Date.now();
const child = spawn(command, args, {
cwd,
env,
stdio: ["ignore", "pipe", "pipe"],
});
let stdout = "";
let stderr = "";
let timedOut = false;
const timer = setTimeout(() => {
timedOut = true;
child.kill("SIGKILL");
}, timeoutMs);
child.stdout.on("data", (chunk) => {
stdout += chunk.toString();
});
child.stderr.on("data", (chunk) => {
stderr += chunk.toString();
});
child.on("close", (code, signal) => {
clearTimeout(timer);
resolve({
command: [command, ...args].join(" "),
exitCode: code ?? -1,
signal: signal ?? null,
stdout,
stderr,
timedOut,
durationMs: Date.now() - startedAt,
});
});
child.on("error", (error) => {
clearTimeout(timer);
resolve({
command: [command, ...args].join(" "),
exitCode: -1,
signal: null,
stdout,
stderr: `${stderr}${error instanceof Error ? (error.stack ?? error.message) : String(error)}`,
timedOut,
durationMs: Date.now() - startedAt,
});
});
});
}
function writeArtifact(name, content) {
const filePath = path.join(reportDir, name);
fs.writeFileSync(filePath, content, "utf8");
return filePath;
}
function summarize(result) {
const text = `${result.stdout}${result.stderr}`.trim();
return text.length > 4000 ? text.slice(-4000) : text;
}
const dockerBin = findDockerBin();
const report = {
generatedAt: new Date().toISOString(),
platform: process.platform,
reportDir,
dockerBin,
daemonReady: false,
status: "blocked",
commands: {},
};
if (!dockerBin) {
writeArtifact("report.json", `${JSON.stringify(report, null, 2)}\n`);
writeArtifact(
"report.md",
`# Docker Runtime Review\n\nStatus: blocked\n\nNo Docker CLI binary was found.\n`,
);
console.log(
"[docker-runtime-review] REPORT",
JSON.stringify({ reportDir, status: report.status }),
);
process.exit(1);
}
const version = await runCommand(dockerBin, ["version"], { timeoutMs: 30_000 });
const context = await runCommand(dockerBin, ["context", "ls"], {
timeoutMs: 15_000,
});
const desktopStatus = await runCommand(dockerBin, ["desktop", "status"], {
timeoutMs: 15_000,
});
const info = await runCommand(dockerBin, ["info"], { timeoutMs: 20_000 });
const desktopLogs = await runCommand(
dockerBin,
["desktop", "logs", "--priority", "2", "--boot", "0"],
{ timeoutMs: 20_000 },
);
const desktopDiagnose = await runCommand(dockerBin, ["desktop", "diagnose"], {
timeoutMs: 20_000,
});
report.commands = {
version,
context,
desktopStatus,
info,
desktopLogs,
desktopDiagnose,
};
report.daemonReady = info.exitCode === 0;
report.status = report.daemonReady ? "ready" : "blocked";
let smoke = null;
if (report.daemonReady && process.env.ELIZA_DOCKER_REVIEW_RUN_SMOKE === "1") {
smoke = await runCommand(
"bash",
[
"eliza/packages/app-core/scripts/docker-ci-smoke.sh",
...(process.env.ELIZA_DOCKER_REVIEW_FULL_SMOKE === "1"
? []
: ["--skip-smoke"]),
],
{ timeoutMs: 60 * 60_000 },
);
report.commands.smoke = smoke;
if (smoke.exitCode !== 0) {
report.status = "failed";
}
}
writeArtifact("version.log", `${version.stdout}${version.stderr}`);
writeArtifact("context.log", `${context.stdout}${context.stderr}`);
writeArtifact(
"desktop-status.log",
`${desktopStatus.stdout}${desktopStatus.stderr}`,
);
writeArtifact("info.log", `${info.stdout}${info.stderr}`);
writeArtifact("desktop-logs.log", `${desktopLogs.stdout}${desktopLogs.stderr}`);
writeArtifact(
"desktop-diagnose.log",
`${desktopDiagnose.stdout}${desktopDiagnose.stderr}`,
);
if (smoke) {
writeArtifact("smoke.log", `${smoke.stdout}${smoke.stderr}`);
}
const markdown = [
"# Docker Runtime Review",
"",
`Status: ${report.status}`,
`Generated: ${report.generatedAt}`,
`Docker binary: ${dockerBin}`,
"",
"## Summary",
"",
`- docker version: exit ${version.exitCode}`,
`- docker context ls: exit ${context.exitCode}`,
`- docker desktop status: exit ${desktopStatus.exitCode}${desktopStatus.timedOut ? " (timed out)" : ""}`,
`- docker info: exit ${info.exitCode}${info.timedOut ? " (timed out)" : ""}`,
`- docker desktop diagnose: exit ${desktopDiagnose.exitCode}${desktopDiagnose.timedOut ? " (timed out)" : ""}`,
...(smoke
? [
`- docker smoke: exit ${smoke.exitCode}${smoke.timedOut ? " (timed out)" : ""}`,
]
: []),
"",
"## Tail",
"",
"### docker info",
"",
"```text",
summarize(info),
"```",
"",
"### docker desktop status",
"",
"```text",
summarize(desktopStatus),
"```",
"",
"### docker desktop diagnose",
"",
"```text",
summarize(desktopDiagnose),
"```",
].join("\n");
writeArtifact("report.json", `${JSON.stringify(report, null, 2)}\n`);
writeArtifact("report.md", `${markdown}\n`);
console.log(
"[docker-runtime-review] REPORT",
JSON.stringify({
reportDir,
status: report.status,
daemonReady: report.daemonReady,
}),
);
process.exit(
report.status === "blocked" ? 2 : report.status === "failed" ? 1 : 0,
);