diff --git a/scripts/artifact-publish.mjs b/scripts/artifact-publish.mjs index badcb70d..7ed4a323 100644 --- a/scripts/artifact-publish.mjs +++ b/scripts/artifact-publish.mjs @@ -909,6 +909,7 @@ function normalizeEnvReuseRecipe(recipe) { } function normalizeDownloadStack(value) { + value = effectiveDownloadStackConfig(value, process.env); assert.ok(value && typeof value === "object", "envRecipe.downloadStack must be configured in deploy/deploy.yaml"); const normalized = { httpProxy: normalizeOptionalHttpUrl(value.httpProxy), @@ -927,6 +928,34 @@ function normalizeDownloadStack(value) { return normalized; } +function effectiveDownloadStackConfig(value, env = process.env) { + if (!value || typeof value !== "object" || !usesK8sNativeDownloadProxy(env)) return value; + const httpProxy = textEnv(env.HTTP_PROXY) || textEnv(env.http_proxy) || value.httpProxy; + const httpsProxy = textEnv(env.HTTPS_PROXY) || textEnv(env.https_proxy) || httpProxy || value.httpsProxy; + const noProxy = noProxyFromEnv(env) || value.noProxy; + return { + ...value, + httpProxy, + httpsProxy, + noProxy + }; +} + +function usesK8sNativeDownloadProxy(env = process.env) { + return env.HWLAB_DEV_REGISTRY_K8S_NATIVE === "1" || Boolean(textEnv(env.HWLAB_TEKTON_PIPELINERUN)); +} + +function noProxyFromEnv(env = process.env) { + const text = textEnv(env.NO_PROXY) || textEnv(env.no_proxy); + if (!text) return null; + return text.split(",").map((item) => item.trim()).filter(Boolean); +} + +function textEnv(value) { + const text = String(value ?? "").trim(); + return text || null; +} + function normalizeOptionalHttpUrl(value) { const text = String(value ?? "").trim(); if (!text) return null; diff --git a/scripts/gitops-render.mjs b/scripts/gitops-render.mjs index 2a05ce6b..9f8486ce 100644 --- a/scripts/gitops-render.mjs +++ b/scripts/gitops-render.mjs @@ -2678,7 +2678,12 @@ function planArtifactsTask({ serviceIds = defaultServiceIds } = {}) { steps: [{ name: "plan", image: ciToolsRunnerImage, - env: [{ name: "HWLAB_SELECTED_SERVICES", value: "$(params.services)" }, ...proxyEnv()], + env: [ + { name: "HWLAB_SELECTED_SERVICES", value: "$(params.services)" }, + { name: "HWLAB_DEV_REGISTRY_K8S_NATIVE", value: "1" }, + { name: "HWLAB_TEKTON_PIPELINERUN", value: "$(context.pipelineRun.name)" }, + ...proxyEnv() + ], script: planArtifactsScript() }] }, diff --git a/scripts/src/ci-plan-lib.mjs b/scripts/src/ci-plan-lib.mjs index c42f7f8e..3bee4509 100644 --- a/scripts/src/ci-plan-lib.mjs +++ b/scripts/src/ci-plan-lib.mjs @@ -365,7 +365,7 @@ function envReuseRecipeForLaneConfig(laneConfig, lane = "v02") { } function normalizeDownloadStack(value, lane) { - const configured = value && typeof value === "object" ? value : null; + const configured = effectiveDownloadStackConfig(value, process.env); if (!configured) throw new Error(`deploy.lanes.${lane}.envRecipe.downloadStack is required`); const httpProxy = normalizeOptionalHttpUrl(configured.httpProxy, `deploy.lanes.${lane}.envRecipe.downloadStack.httpProxy`); const httpsProxy = normalizeOptionalHttpUrl(configured.httpsProxy, `deploy.lanes.${lane}.envRecipe.downloadStack.httpsProxy`); @@ -389,6 +389,30 @@ function normalizeDownloadStack(value, lane) { }; } +function effectiveDownloadStackConfig(value, env = process.env) { + const configured = value && typeof value === "object" ? value : null; + if (!configured || !usesK8sNativeDownloadProxy(env)) return configured; + const httpProxy = normalizeDeclarationString(env.HTTP_PROXY) || normalizeDeclarationString(env.http_proxy) || configured.httpProxy; + const httpsProxy = normalizeDeclarationString(env.HTTPS_PROXY) || normalizeDeclarationString(env.https_proxy) || httpProxy || configured.httpsProxy; + const noProxy = noProxyFromEnv(env) || configured.noProxy; + return { + ...configured, + httpProxy, + httpsProxy, + noProxy + }; +} + +function usesK8sNativeDownloadProxy(env = process.env) { + return env.HWLAB_DEV_REGISTRY_K8S_NATIVE === "1" || Boolean(normalizeDeclarationString(env.HWLAB_TEKTON_PIPELINERUN)); +} + +function noProxyFromEnv(env = process.env) { + const text = normalizeDeclarationString(env.NO_PROXY) || normalizeDeclarationString(env.no_proxy); + if (!text) return null; + return text.split(",").map((item) => item.trim()).filter(Boolean); +} + function normalizeOptionalHttpUrl(value, label) { const text = normalizeDeclarationString(value); if (!text) return null;