fix(ci): preserve required QuickStack build arguments
Nuvisphere/Platform-CI: Immutable QuickStack OCI deployment / Build once and deploy exact digest (push) Successful in 6s
Platform CI tests / QuickStack deploy action tests (pull_request) Successful in 4s
Nuvisphere/Platform-CI: Immutable QuickStack OCI deployment / Build once and deploy exact digest (pull_request) Successful in 5s

This commit is contained in:
2026-10-21 11:57:46 +02:00
parent ac0ecb4181
commit c2d7cf2c87
2 changed files with 5 additions and 2 deletions
+1 -1
View File
@@ -22,7 +22,7 @@ const APP_FIELDS = [
"containerCommand", "containerArgs", "securityContextRunAsUser", "containerCommand", "containerArgs", "securityContextRunAsUser",
"securityContextRunAsGroup", "securityContextFsGroup", "securityContextPrivileged", "securityContextRunAsGroup", "securityContextFsGroup", "securityContextPrivileged",
"gitUrl", "gitBranch", "gitUsername", "gitToken", "dockerfilePath", "replicas", "gitUrl", "gitBranch", "gitUsername", "gitToken", "dockerfilePath", "replicas",
"envVars", "memoryReservation", "memoryLimit", "cpuReservation", "cpuLimit", "envVars", "buildArgs", "memoryReservation", "memoryLimit", "cpuReservation", "cpuLimit",
"webhookId", "useNetworkPolicy", "webhookId", "useNetworkPolicy",
"healthChechHttpGetPath", "healthCheckHttpScheme", "healthCheckHttpHeadersJson", "healthChechHttpGetPath", "healthCheckHttpScheme", "healthCheckHttpHeadersJson",
"healthCheckHttpPort", "healthCheckPeriodSeconds", "healthCheckTimeoutSeconds", "healthCheckHttpPort", "healthCheckPeriodSeconds", "healthCheckTimeoutSeconds",
@@ -42,7 +42,7 @@ function app(overrides = {}) {
id: "app-one", name: "One", appType: "APP", projectId: "project-one", id: "app-one", name: "One", appType: "APP", projectId: "project-one",
sourceType: "GIT", buildMethod: "DOCKERFILE", containerImageSource: null, sourceType: "GIT", buildMethod: "DOCKERFILE", containerImageSource: null,
containerRegistryUsername: null, containerRegistryPassword: null, dockerfilePath: "./Dockerfile", containerRegistryUsername: null, containerRegistryPassword: null, dockerfilePath: "./Dockerfile",
replicas: 1, envVars: "SECRET=preserved\nENVIRONMENT=old", ingressNetworkPolicy: "[]", replicas: 1, buildArgs: "EXISTING_BUILD_ARG=preserved", envVars: "SECRET=preserved\nENVIRONMENT=old", ingressNetworkPolicy: "[]",
egressNetworkPolicy: "[]", useNetworkPolicy: false, healthCheckPeriodSeconds: 10, egressNetworkPolicy: "[]", useNetworkPolicy: false, healthCheckPeriodSeconds: 10,
healthCheckTimeoutSeconds: 2, healthCheckFailureThreshold: 3, appDomains: [], appPorts: [], healthCheckTimeoutSeconds: 2, healthCheckFailureThreshold: 3, appDomains: [], appPorts: [],
appNodePorts: [], appFileMounts: [], appVolumes: [], appBasicAuths: [], project: {}, appNodePorts: [], appFileMounts: [], appVolumes: [], appBasicAuths: [], project: {},
@@ -290,6 +290,8 @@ test("application dependencies reject missing nodes and cycles", () => {
test("preserves response-only fields and existing environment secrets safely", () => { test("preserves response-only fields and existing environment secrets safely", () => {
const payload = toSavePayload(app()); const payload = toSavePayload(app());
assert.equal(payload.createdAt, undefined); assert.equal(payload.createdAt, undefined);
assert.equal(payload.buildArgs, app().buildArgs);
assert.equal(toSavePayload(app({ buildArgs: "" })).buildArgs, "");
assert.equal(mergeEnvironment(app().envVars, { ENVIRONMENT: "new" }), "SECRET=preserved\nENVIRONMENT=new"); assert.equal(mergeEnvironment(app().envVars, { ENVIRONMENT: "new" }), "SECRET=preserved\nENVIRONMENT=new");
assert.deepEqual(parseEnvironment("SECRET=preserved\nAPP_DEPLOYMENT_ID=source\nENVIRONMENT=new\ninvalid line"), { assert.deepEqual(parseEnvironment("SECRET=preserved\nAPP_DEPLOYMENT_ID=source\nENVIRONMENT=new\ninvalid line"), {
SECRET: "preserved", SECRET: "preserved",
@@ -384,6 +386,7 @@ test("failed public verification restores and redeploys the previous source", as
getApp: async () => current, getApp: async () => current,
saveApp: async (payload) => { saveApp: async (payload) => {
assert.deepEqual(payload.appNetworkPolicy, original.appNetworkPolicy); assert.deepEqual(payload.appNetworkPolicy, original.appNetworkPolicy);
assert.equal(payload.buildArgs, original.buildArgs);
assert.equal(Object.hasOwn(payload, "appPorts"), false); assert.equal(Object.hasOwn(payload, "appPorts"), false);
current = { ...current, ...payload }; current = { ...current, ...payload };
}, },