fix: reuse deploy images for G14 auxiliary workloads

This commit is contained in:
Codex
2026-05-26 14:38:55 +08:00
parent 81bb0e49af
commit c2f53cf61f
+62 -10
View File
@@ -234,6 +234,31 @@ function runtimeImageTagForDeployService(deployService, source) {
return deployService?.env?.HWLAB_IMAGE_TAG ?? imageTagFromReference(deployService?.image) ?? source.short;
}
function deployServiceById(deploy, serviceId) {
return (deploy?.services ?? []).find((service) => service?.serviceId === serviceId) ?? null;
}
function runtimeImageForService({ deploy, serviceId, source, registryPrefix, useDeployImages = false }) {
const deployService = deployServiceById(deploy, serviceId);
return useDeployImages && deployService?.image
? deployService.image
: imageFor(registryPrefix, serviceId, source.short);
}
function runtimeCommitForService({ deploy, serviceId, source, useDeployImages = false }) {
const deployService = deployServiceById(deploy, serviceId);
return useDeployImages
? runtimeCommitForDeployService(deployService, source)
: source.full;
}
function runtimeImageTagForService({ deploy, serviceId, source, useDeployImages = false }) {
const deployService = deployServiceById(deploy, serviceId);
return useDeployImages
? runtimeImageTagForDeployService(deployService, source)
: source.short;
}
function namespaceNameForProfile(profile) {
return profile === "prod" ? "hwlab-prod" : "hwlab-dev";
}
@@ -1744,9 +1769,12 @@ remotePort = ${edgeRemotePort}
};
}
function deepSeekProxyManifest({ profile = "dev", source, registryPrefix = defaultRegistryPrefix } = {}) {
function deepSeekProxyManifest({ profile = "dev", source, registryPrefix = defaultRegistryPrefix, deploy = null, useDeployImages = false } = {}) {
const namespace = namespaceNameForProfile(profile);
const bridgeImage = imageFor(registryPrefix, "hwlab-cloud-api", source.short);
const bridgeServiceId = "hwlab-cloud-api";
const bridgeImage = runtimeImageForService({ deploy, serviceId: bridgeServiceId, source, registryPrefix, useDeployImages });
const bridgeCommit = runtimeCommitForService({ deploy, serviceId: bridgeServiceId, source, useDeployImages });
const bridgeImageTag = runtimeImageTagForService({ deploy, serviceId: bridgeServiceId, source, useDeployImages });
const labels = {
"app.kubernetes.io/name": "hwlab-deepseek-proxy",
"app.kubernetes.io/part-of": "hwlab",
@@ -1754,6 +1782,12 @@ function deepSeekProxyManifest({ profile = "dev", source, registryPrefix = defau
"hwlab.pikastech.local/gitops-target": "g14",
"hwlab.pikastech.local/service-id": "hwlab-deepseek-proxy"
};
const templateAnnotations = {
"hwlab.pikastech.local/bridge-service-id": bridgeServiceId,
"hwlab.pikastech.local/bridge-source-commit": bridgeCommit,
"hwlab.pikastech.local/bridge-image-tag": bridgeImageTag,
"hwlab.pikastech.local/bridge-image": bridgeImage
};
return {
apiVersion: "v1",
kind: "List",
@@ -1769,12 +1803,12 @@ function deepSeekProxyManifest({ profile = "dev", source, registryPrefix = defau
{
apiVersion: "apps/v1",
kind: "Deployment",
metadata: { name: "hwlab-deepseek-proxy", namespace, labels, annotations: { "hwlab.pikastech.local/moonbridge-source-ref": moonBridgeSourceRef } },
metadata: { name: "hwlab-deepseek-proxy", namespace, labels, annotations: { "hwlab.pikastech.local/moonbridge-source-ref": moonBridgeSourceRef, ...templateAnnotations } },
spec: {
replicas: 1,
selector: { matchLabels: { "app.kubernetes.io/name": "hwlab-deepseek-proxy" } },
template: {
metadata: { labels },
metadata: { labels, annotations: templateAnnotations },
spec: {
initContainers: [{
name: "moonbridge-config",
@@ -1794,6 +1828,9 @@ function deepSeekProxyManifest({ profile = "dev", source, registryPrefix = defau
command: ["node", "/app/cmd/hwlab-deepseek-responses-bridge/main.mjs"],
env: [
{ name: "PORT", value: "4000" },
{ name: "HWLAB_COMMIT_ID", value: bridgeCommit },
{ name: "HWLAB_IMAGE", value: bridgeImage },
{ name: "HWLAB_IMAGE_TAG", value: bridgeImageTag },
{ name: "HWLAB_DEEPSEEK_BRIDGE_UPSTREAM", value: "http://127.0.0.1:4001" },
{ name: "HWLAB_DEEPSEEK_BRIDGE_MODEL", value: deepSeekProfileModel }
],
@@ -2017,10 +2054,14 @@ function deviceAgent71FreqServerScript() {
].join("\n") + "\n";
}
function deviceAgent71FreqManifest({ profile = "dev", source, registryPrefix }) {
function deviceAgent71FreqManifest({ profile = "dev", source, registryPrefix, deploy = null, useDeployImages = false }) {
assert.equal(profile, "dev", "71-freq device-agent is dev-only");
const namespace = namespaceNameForProfile(profile);
const name = "device-agent-71-freq";
const bridgeServiceId = "hwlab-cloud-api";
const bridgeImage = runtimeImageForService({ deploy, serviceId: bridgeServiceId, source, registryPrefix, useDeployImages });
const bridgeCommit = runtimeCommitForService({ deploy, serviceId: bridgeServiceId, source, useDeployImages });
const bridgeImageTag = runtimeImageTagForService({ deploy, serviceId: bridgeServiceId, source, useDeployImages });
const labels = {
"app.kubernetes.io/name": name,
"app.kubernetes.io/part-of": "hwlab",
@@ -2036,7 +2077,15 @@ function deviceAgent71FreqManifest({ profile = "dev", source, registryPrefix })
const selector = { "app.kubernetes.io/name": name };
const script = deviceAgent71FreqServerScript();
const scriptSha256 = createHash("sha256").update(script).digest("hex");
const templateAnnotations = { ...annotations, "hwlab.pikastech.local/script-sha256": scriptSha256 };
const templateLabels = { ...labels, ...selector, "hwlab.pikastech.local/source-commit": bridgeCommit };
const templateAnnotations = {
...annotations,
"hwlab.pikastech.local/script-sha256": scriptSha256,
"hwlab.pikastech.local/bridge-service-id": bridgeServiceId,
"hwlab.pikastech.local/bridge-source-commit": bridgeCommit,
"hwlab.pikastech.local/bridge-image-tag": bridgeImageTag,
"hwlab.pikastech.local/bridge-image": bridgeImage
};
return {
apiVersion: "v1",
kind: "List",
@@ -2055,15 +2104,18 @@ function deviceAgent71FreqManifest({ profile = "dev", source, registryPrefix })
replicas: 1,
selector: { matchLabels: selector },
template: {
metadata: { labels: { ...labels, ...selector }, annotations: templateAnnotations },
metadata: { labels: templateLabels, annotations: templateAnnotations },
spec: {
containers: [{
name: "device-agent",
image: imageFor(registryPrefix, "hwlab-cloud-api", source.short),
image: bridgeImage,
imagePullPolicy: "IfNotPresent",
command: ["node", "/opt/device-agent/server.mjs"],
env: [
{ name: "PORT", value: "7601" },
{ name: "HWLAB_COMMIT_ID", value: bridgeCommit },
{ name: "HWLAB_IMAGE", value: bridgeImage },
{ name: "HWLAB_IMAGE_TAG", value: bridgeImageTag },
{ name: "DEVICE_ID", value: "71-freq" },
{ name: "DEVICE_WORKSPACE_ROOT", value: "F:\\Work\\ConStart" },
{ name: "HWLAB_CLOUD_API_URL", value: `http://hwlab-cloud-api.${namespace}.svc.cluster.local:6667` },
@@ -2194,8 +2246,8 @@ async function plannedFiles(args) {
putJson(`${runtimePath}/services.yaml`, transformListNamespace(services, namespace, profileLabels, annotations));
putJson(`${runtimePath}/health-contract.yaml`, transformHealthContract(health, namespace, profileLabels, annotations, endpoints.runtimeEndpoint, endpoints.webEndpoint, profile));
putJson(`${runtimePath}/workloads.yaml`, transformWorkloads({ workloads, deploy, source, registryPrefix: args.registryPrefix, runtimeEndpoint: endpoints.runtimeEndpoint, webEndpoint: endpoints.webEndpoint, profile, useDeployImages: args.useDeployImages }));
putJson(`${runtimePath}/deepseek-proxy.yaml`, deepSeekProxyManifest({ profile, source, registryPrefix: args.registryPrefix }));
if (includeDeviceAgent) putJson(`${runtimePath}/device-agent-71-freq.yaml`, deviceAgent71FreqManifest({ profile, source, registryPrefix: args.registryPrefix }));
putJson(`${runtimePath}/deepseek-proxy.yaml`, deepSeekProxyManifest({ profile, source, registryPrefix: args.registryPrefix, deploy, useDeployImages: args.useDeployImages }));
if (includeDeviceAgent) putJson(`${runtimePath}/device-agent-71-freq.yaml`, deviceAgent71FreqManifest({ profile, source, registryPrefix: args.registryPrefix, deploy, useDeployImages: args.useDeployImages }));
putJson(`${runtimePath}/g14-frpc.yaml`, g14FrpcManifest({ profile }));
}
return { files, source };