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
232 lines
6.0 KiB
JavaScript
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,
|
|
);
|