fix: remove npm dependency install from go env images

This commit is contained in:
UniDesk Codex
2026-07-07 00:23:35 +08:00
parent 2738ddf220
commit 56ea5199f3
3 changed files with 117 additions and 11 deletions
@@ -0,0 +1,95 @@
import { spawn, spawnSync } from "node:child_process";
import { existsSync, mkdirSync, rmSync } from "node:fs";
import path from "node:path";
const bootRepo = requiredEnv("HWLAB_BOOT_REPO");
const bootCommit = requiredEnv("HWLAB_BOOT_COMMIT");
const bootSh = requiredEnv("HWLAB_BOOT_SH");
const bootRef = requiredEnv("HWLAB_BOOT_REF");
const checkoutDir = process.env.HWLAB_BOOT_CHECKOUT_DIR || "/workspace/hwlab-boot/repo";
if (!/^[a-f0-9]{40}$/u.test(bootCommit)) fail("HWLAB_BOOT_COMMIT must be a full 40-char SHA");
if (path.isAbsolute(bootSh) || bootSh.split("/").includes("..")) fail("HWLAB_BOOT_SH must be repo-relative");
if (!/^[A-Za-z0-9._/-]+$/u.test(bootRef) || bootRef.startsWith("-") || bootRef.includes("..")) {
fail("HWLAB_BOOT_REF must be a safe branch or ref name");
}
const readUrl = process.env.HWLAB_BOOT_READ_URL || mirrorReadUrl(bootRepo);
mkdirSync(path.dirname(checkoutDir), { recursive: true });
rmSync(checkoutDir, { recursive: true, force: true });
run("git", ["clone", "--no-checkout", "--single-branch", "--branch", bootRef, readUrl, checkoutDir], "/");
run("git", ["checkout", "--detach", bootCommit], checkoutDir);
const scriptPath = path.join(checkoutDir, bootSh);
if (!existsSync(scriptPath)) fail(`boot script not found: ${bootSh}`);
run("sh", [scriptPath], checkoutDir, { replace: true });
function requiredEnv(name) {
const value = process.env[name];
if (!value) fail(`${name} is required`);
return value;
}
function mirrorReadUrl(repo) {
if (/github\.com[:/]pikasTech\/HWLAB(?:\.git)?$/u.test(repo)) {
return "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git";
}
fail("no mirror resolver for HWLAB_BOOT_REPO; refusing direct runtime GitHub fallback");
}
function run(command, args, cwd, options = {}) {
if (options.replace) {
runReplacingProcess(command, args, cwd);
return;
}
const result = spawnSync(command, args, { cwd, env: process.env, stdio: "inherit" });
if (result.error) fail(`${command} failed to start: ${result.error.message}`);
if (result.signal) process.kill(process.pid, result.signal);
const code = result.status ?? 0;
if (code !== 0) process.exit(code);
}
function runReplacingProcess(command, args, cwd) {
const child = spawn(command, args, { cwd, env: process.env, stdio: "inherit", detached: true });
let settled = false;
const signalHandlers = [];
const cleanup = () => {
for (const { signal, handler } of signalHandlers.splice(0)) process.off(signal, handler);
};
const forwardSignal = (signal) => {
if (!child.pid) return;
try {
process.kill(-child.pid, signal);
} catch {
try { child.kill(signal); } catch {}
}
};
for (const signal of ["SIGINT", "SIGTERM"]) {
const handler = () => forwardSignal(signal);
process.on(signal, handler);
signalHandlers.push({ signal, handler });
}
child.on("error", (error) => {
if (settled) return;
settled = true;
cleanup();
fail(`${command} failed to start: ${error.message}`);
});
child.on("exit", (code, signal) => {
if (settled) return;
settled = true;
cleanup();
if (signal) process.exit(signalExitCode(signal));
process.exit(code ?? 0);
});
}
function signalExitCode(signal) {
const signals = { SIGHUP: 1, SIGINT: 2, SIGQUIT: 3, SIGTERM: 15 };
return 128 + (signals[signal] ?? 1);
}
function fail(message) {
process.stderr.write(`${JSON.stringify({ status: "failed", error: "hwlab_go_env_reuse_launcher_failed", message })}\n`);
process.exit(1);
}