Skip to content

Commit 4002fc1

Browse files
authored
fix(e2e): fix runtime tests for operator deployments and CI reporting (#5027)
* refactor(e2e): move about:blank cleanup from try/finally to test.afterEach Move the WebSocket teardown workaround (page.goto('about:blank')) from per-test try/finally blocks into test.afterEach hooks. This is cleaner: the cleanup is declared once per describe block and applies to all tests that use the page fixture, without wrapping test bodies. Assisted-by: OpenCode * fix(e2e): fix external DB tests for operator deployments For operator deployments, patching POSTGRES_* env vars directly onto the deployment is reverted by operator reconciliation. The external DB tests (Azure DB, RDS) configure postgres-cred secret with connection details, but those values never reached the RHDH container as env vars. Fix: - Add postgres-cred to extraEnvs.secrets in the Backstage CR so the operator injects all its keys as env vars automatically - Skip direct deployment env var patching in prepareForExternalDatabase for operator installs (same pattern as schema-mode setup) Assisted-by: OpenCode * fix(ci): write pessimistic test status before Playwright execution When Prow kills a job (2h timeout) or Playwright hangs, the mark_test_result call at the end of testing::run_tests never executes. This leaves STATUS_TEST_FAILED.txt and STATUS_NUMBER_OF_TEST_FAILED.txt with fewer entries than STATUS_DEPLOYMENT_NAMESPACE.txt, creating misaligned arrays that break downstream reporting (Slack notifications). Fix: write a pessimistic default (failed=true, count=N/A) immediately after registering the test run. The real result overwrites it after Playwright completes. If the job is killed mid-test, the STATUS files still have entries for all registered test runs. To support this, save_status_test_failed and save_status_number_of_test_failed now regenerate the file from the in-memory array instead of appending, making them safe to call multiple times for the same deployment ID. Assisted-by: OpenCode * docs(ci): document same-process requirement for _regenerate_status_file The regenerate-from-array pattern requires all callers to run in the same shell process because bash associative arrays are not inherited by child processes. Add a comment documenting this constraint so it travels with the code. Also note the bash >= 4.3 requirement for local -n (nameref). Assisted-by: OpenCode * refactor(ci): unify unknown failure count sentinel value Replace the two different sentinel strings ('N/A' and 'some') with a single UNKNOWN_FAILURE_COUNT constant defined in test-run-tracker.sh. Both meant 'failed but count unknown' — the downstream Slack consumer now only has to handle one sentinel format. Assisted-by: OpenCode * refactor(e2e): extract BACKSTAGE_CR_EXTRA_ENV_SECRETS constant The secrets list in the Backstage CR merge-patch (postgres-config.ts) was hardcoded separately from generateBackstageCR (runtime-config.ts). If a secret were added to one but not the other, the patch would silently strip it mid-test. Extract the base list into a shared constant so the two stay in sync. Assisted-by: OpenCode * refactor(e2e): add mergePatchCustomObject helper to KubeClient Centralise the JSON merge-patch Content-Type header in a KubeClient method, matching the existing jsonPatchDeployment and updateSecret patterns. Simplifies the call site in addPostgresCredToBackstageCR by removing the trailing positional undefined args. Assisted-by: OpenCode * docs(e2e): note intentional afterEach page fixture overhead The suite-level afterEach requests the page fixture for every test, including non-UI ones. This is an intentional tradeoff — the minor overhead of an extra browser context is acceptable vs per-test conditional logic. Assisted-by: OpenCode * docs(e2e): note local dist path for homepage plugin package The runtime deployment uses a local ./dynamic-plugins/dist/ path for the homepage plugin. Add a comment referencing #4909 so the OCI migration sweep can find this spot. Assisted-by: OpenCode * refactor(e2e): remove redundant try/catch in config-map test The try/catch only logged and rethrew — it existed to pair with the finally block that was removed when about:blank cleanup moved to afterEach. Playwright already reports errors with full stacks, so the wrapper adds no value and costs an indent level. Assisted-by: OpenCode * docs(e2e): explain explicit form in getReleaseName The verbose !== undefined && !== '' check is used instead of || because oxlint's strict-boolean-expressions and prefer-nullish-coalescing rules (pedantic category, set to error) reject || on string operands. Assisted-by: OpenCode
1 parent d8b493f commit 4002fc1

12 files changed

Lines changed: 280 additions & 93 deletions

File tree

.ci/pipelines/lib/test-run-tracker.sh

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ readonly RHDH_TEST_RUN_TRACKER_LIB_SOURCED=1
99
# shellcheck source=.ci/pipelines/reporting.sh
1010
source "$(dirname "${BASH_SOURCE[0]}")/../reporting.sh"
1111

12+
# Sentinel value for STATUS_NUMBER_OF_TEST_FAILED when the real count
13+
# is unknown (deploy failed, Prow timeout, JUnit file missing, or
14+
# Playwright crashed without producing failure counts).
15+
UNKNOWN_FAILURE_COUNT="N/A"
16+
1217
# Internal state
1318
_TEST_RUN_COUNTER=0
1419

@@ -36,7 +41,7 @@ test_run_tracker::mark_deploy_failed() {
3641
test_run_tracker::register "$label"
3742
save_status_failed_to_deploy "${_TEST_RUN_COUNTER}" true
3843
save_status_test_failed "${_TEST_RUN_COUNTER}" true
39-
save_status_number_of_test_failed "${_TEST_RUN_COUNTER}" "N/A"
44+
save_status_number_of_test_failed "${_TEST_RUN_COUNTER}" "${UNKNOWN_FAILURE_COUNT}"
4045
save_overall_result 1
4146
}
4247

.ci/pipelines/lib/testing.sh

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ testing::run_tests() {
5252
test_run_tracker::register "$artifacts_subdir"
5353
test_run_tracker::mark_deploy_success
5454

55+
# Pessimistic default: assume tests failed until Playwright proves otherwise.
56+
# If the job is killed (Prow timeout) or Playwright hangs, the STATUS files
57+
# still have entries for all registered test runs — preventing misaligned
58+
# arrays that break downstream reporting (Slack notifications).
59+
test_run_tracker::mark_test_result "false" "${UNKNOWN_FAILURE_COUNT}"
60+
5561
BASE_URL="${url}"
5662
export BASE_URL
5763
log::info "BASE_URL: ${BASE_URL}"
@@ -183,15 +189,15 @@ testing::run_tests() {
183189
failed_tests=$((_junit_failures + _junit_errors))
184190
if [[ "${failed_tests}" -eq 0 ]]; then
185191
# Playwright exited non-zero but JUnit reports 0 failures and 0 errors —
186-
# the process likely crashed or timed out globally. Report "some" so the
187-
# Slack alert doesn't misleadingly say "0 tests failed".
188-
failed_tests="some"
192+
# the process likely crashed or timed out globally. Use the sentinel so
193+
# the Slack alert doesn't misleadingly say "0 tests failed".
194+
failed_tests="${UNKNOWN_FAILURE_COUNT}"
189195
fi
190196
echo "Number of failed tests: ${failed_tests}"
191197
else
192198
echo "JUnit results file not found: ${e2e_tests_dir}/${JUNIT_RESULTS}"
193-
failed_tests="some"
194-
echo "Number of failed tests unknown, saving as $failed_tests."
199+
failed_tests="${UNKNOWN_FAILURE_COUNT}"
200+
echo "Number of failed tests unknown, saving as ${failed_tests}."
195201
fi
196202
test_run_tracker::mark_test_result "$test_passed" "${failed_tests}"
197203
return "$test_result"

.ci/pipelines/reporting.sh

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ readonly REPORTING_LIB_SOURCED=1
1010
source "$(dirname "${BASH_SOURCE[0]}")"/lib/log.sh
1111

1212
# Variables for reporting
13-
export STATUS_DEPLOYMENT_NAMESPACE # Array that holds the namespaces of deployments.
14-
export STATUS_FAILED_TO_DEPLOY # Array that indicates if deployment failed. false = success, true = failure
15-
export STATUS_TEST_FAILED # Array that indicates if test run failed. false = success, true = failure
16-
export OVERALL_RESULT # Overall result of the test run. 0 = success, 1 = failure
13+
export STATUS_DEPLOYMENT_NAMESPACE # Array that holds the namespaces of deployments.
14+
export STATUS_FAILED_TO_DEPLOY # Array that indicates if deployment failed. false = success, true = failure
15+
export STATUS_TEST_FAILED # Array that indicates if test run failed. false = success, true = failure
16+
export STATUS_NUMBER_OF_TEST_FAILED # Array that holds the number of test failures per deployment.
17+
export OVERALL_RESULT # Overall result of the test run. 0 = success, 1 = failure
1718

1819
mkdir -p "$ARTIFACT_DIR/reporting"
1920

@@ -22,35 +23,54 @@ save_status_deployment_namespace() {
2223
local current_namespace=$2
2324
log::debug "Saving STATUS_DEPLOYMENT_NAMESPACE[\"${current_deployment}\"]=${current_namespace}"
2425
STATUS_DEPLOYMENT_NAMESPACE["${current_deployment}"]="${current_namespace}"
25-
printf "%s\n" "${STATUS_DEPLOYMENT_NAMESPACE["${current_deployment}"]}" >> "$SHARED_DIR/STATUS_DEPLOYMENT_NAMESPACE.txt"
26-
cp "$SHARED_DIR/STATUS_DEPLOYMENT_NAMESPACE.txt" "$ARTIFACT_DIR/reporting/STATUS_DEPLOYMENT_NAMESPACE.txt"
26+
_regenerate_status_file "STATUS_DEPLOYMENT_NAMESPACE"
2727
}
2828

2929
save_status_failed_to_deploy() {
3030
local current_deployment=$1
3131
local status=$2
3232
log::debug "Saving STATUS_FAILED_TO_DEPLOY[\"${current_deployment}\"]=${status}"
3333
STATUS_FAILED_TO_DEPLOY["${current_deployment}"]="${status}"
34-
printf "%s\n" "${STATUS_FAILED_TO_DEPLOY["${current_deployment}"]}" >> "$SHARED_DIR/STATUS_FAILED_TO_DEPLOY.txt"
35-
cp "$SHARED_DIR/STATUS_FAILED_TO_DEPLOY.txt" "$ARTIFACT_DIR/reporting/STATUS_FAILED_TO_DEPLOY.txt"
34+
_regenerate_status_file "STATUS_FAILED_TO_DEPLOY"
3635
}
3736

3837
save_status_test_failed() {
3938
local current_deployment=$1
4039
local status=$2
4140
log::debug "Saving STATUS_TEST_FAILED[\"${current_deployment}\"]=${status}"
4241
STATUS_TEST_FAILED["${current_deployment}"]="${status}"
43-
printf "%s\n" "${STATUS_TEST_FAILED["${current_deployment}"]}" >> "$SHARED_DIR/STATUS_TEST_FAILED.txt"
44-
cp "$SHARED_DIR/STATUS_TEST_FAILED.txt" "$ARTIFACT_DIR/reporting/STATUS_TEST_FAILED.txt"
42+
_regenerate_status_file "STATUS_TEST_FAILED"
4543
}
4644

4745
save_status_number_of_test_failed() {
4846
local current_deployment=$1
4947
local number=$2
5048
log::debug "Saving STATUS_NUMBER_OF_TEST_FAILED[\"${current_deployment}\"]=${number}"
5149
STATUS_NUMBER_OF_TEST_FAILED["${current_deployment}"]="${number}"
52-
printf "%s\n" "${STATUS_NUMBER_OF_TEST_FAILED["${current_deployment}"]}" >> "$SHARED_DIR/STATUS_NUMBER_OF_TEST_FAILED.txt"
53-
cp "$SHARED_DIR/STATUS_NUMBER_OF_TEST_FAILED.txt" "$ARTIFACT_DIR/reporting/STATUS_NUMBER_OF_TEST_FAILED.txt"
50+
_regenerate_status_file "STATUS_NUMBER_OF_TEST_FAILED"
51+
}
52+
53+
# Regenerate a STATUS file from its in-memory associative array.
54+
# Writes the file from scratch each time so that the same deployment ID
55+
# can be safely updated multiple times (e.g. pessimistic default written
56+
# before Playwright runs, then overwritten with the real result).
57+
#
58+
# IMPORTANT: All callers must run in the same shell process.
59+
# Associative arrays are not inherited by child processes (export -f
60+
# only exports function definitions, not array contents). If this
61+
# function runs in a subshell, it will see an empty array and truncate
62+
# the file. This is fine today — all test_run_tracker calls are
63+
# sequential in the main shell.
64+
_regenerate_status_file() {
65+
local var_name=$1
66+
local -n _arr="${var_name}"
67+
local file="$SHARED_DIR/${var_name}.txt"
68+
: > "$file"
69+
local key
70+
for key in $(printf '%s\n' "${!_arr[@]}" | sort -n); do
71+
printf '%s\n' "${_arr[$key]}" >> "$file"
72+
done
73+
cp "$file" "$ARTIFACT_DIR/reporting/${var_name}.txt"
5474
}
5575

5676
save_overall_result() {

e2e-tests/playwright/e2e/configuration-test/config-map.spec.ts

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,15 @@ test.describe("Change app-config at e2e test runtime", () => {
2626
await ensureRuntimeDeployed();
2727
});
2828

29+
// RHDH's frontend opens an SSE (EventSource) connection for live
30+
// updates. With tracing enabled, Playwright's fixture teardown hangs
31+
// waiting for network idle, which never resolves while SSE stays open
32+
// (microsoft/playwright#41513, fixed in v1.62). Navigating away drops
33+
// the connection so teardown completes immediately.
34+
test.afterEach(async ({ page }) => {
35+
await page.goto("about:blank").catch(() => {});
36+
});
37+
2938
test("Verify title change after ConfigMap modification", async ({ page }) => {
3039
test.setTimeout(300000);
3140

@@ -34,38 +43,29 @@ test.describe("Change app-config at e2e test runtime", () => {
3443

3544
const kubeUtils = new KubeClient();
3645
const dynamicTitle = generateDynamicTitle();
37-
try {
38-
console.log("Updating app-config ConfigMap with new title.");
39-
await kubeUtils.patchAppConfig(namespace, (appConfig: Record<string, unknown>) => {
40-
if (!isRecord(appConfig.app)) {
41-
throw new Error("Invalid app-config structure: expected 'app' section not found.");
42-
}
43-
console.log(`Current title: ${String(appConfig.app.title)}`);
44-
appConfig.app.title = dynamicTitle;
45-
console.log(`New title: ${dynamicTitle}`);
46-
});
4746

48-
console.log(`Restarting deployment '${deploymentName}' to apply ConfigMap changes.`);
49-
await kubeUtils.restartDeployment(deploymentName, namespace);
47+
console.log("Updating app-config ConfigMap with new title.");
48+
await kubeUtils.patchAppConfig(namespace, (appConfig: Record<string, unknown>) => {
49+
if (!isRecord(appConfig.app)) {
50+
throw new Error("Invalid app-config structure: expected 'app' section not found.");
51+
}
52+
console.log(`Current title: ${String(appConfig.app.title)}`);
53+
appConfig.app.title = dynamicTitle;
54+
console.log(`New title: ${dynamicTitle}`);
55+
});
56+
57+
console.log(`Restarting deployment '${deploymentName}' to apply ConfigMap changes.`);
58+
await kubeUtils.restartDeployment(deploymentName, namespace);
5059

51-
const common = new Common(page);
52-
await page.context().clearCookies();
53-
await page.context().clearPermissions();
54-
await page.reload({ waitUntil: "domcontentloaded" });
55-
await common.loginAsGuest();
56-
await new UIhelper(page).openSidebar("Home");
57-
console.log("Verifying new title in the UI... ");
58-
expect(await page.title()).toContain(dynamicTitle);
59-
console.log("Title successfully verified in the UI.");
60-
} catch (error) {
61-
console.log(`Test failed during ConfigMap update or deployment restart:`, error);
62-
throw error;
63-
} finally {
64-
// Navigate away from RHDH to close WebSocket connections before
65-
// Playwright tears down the page — prevents a long hang during
66-
// context/trace cleanup.
67-
await page.goto("about:blank").catch(() => {});
68-
}
60+
const common = new Common(page);
61+
await page.context().clearCookies();
62+
await page.context().clearPermissions();
63+
await page.reload({ waitUntil: "domcontentloaded" });
64+
await common.loginAsGuest();
65+
await new UIhelper(page).openSidebar("Home");
66+
console.log("Verifying new title in the UI... ");
67+
expect(await page.title()).toContain(dynamicTitle);
68+
console.log("Title successfully verified in the UI.");
6969
});
7070
});
7171

e2e-tests/playwright/e2e/external-database/verify-tls-config-with-external-azure-db.spec.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,12 @@ test.describe("Verify TLS configuration with Azure Database for PostgreSQL healt
8989
});
9090
});
9191

92+
// Drop RHDH SSE connection so Playwright trace teardown doesn't hang
93+
// (microsoft/playwright#41513, fixed in v1.62).
94+
test.afterEach(async ({ page }) => {
95+
await page.goto("about:blank").catch(() => {});
96+
});
97+
9298
test("Configure and restart deployment", async ({}, testInfo) => {
9399
if (!config.host) {
94100
testInfo.skip(true, `AZURE_DB_*_HOST not set for ${config.name}`);
@@ -105,14 +111,10 @@ test.describe("Verify TLS configuration with Azure Database for PostgreSQL healt
105111
});
106112

107113
test("Verify successful DB connection", async ({ page }) => {
108-
try {
109-
const uiHelper = new UIhelper(page);
110-
const common = new Common(page);
111-
await common.loginAsGuest();
112-
await uiHelper.verifyHeading("Welcome back!");
113-
} finally {
114-
await page.goto("about:blank").catch(() => {});
115-
}
114+
const uiHelper = new UIhelper(page);
115+
const common = new Common(page);
116+
await common.loginAsGuest();
117+
await uiHelper.verifyHeading("Welcome back!");
116118
});
117119
});
118120
}

e2e-tests/playwright/e2e/external-database/verify-tls-config-with-external-rds.spec.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,12 @@ test.describe("Verify TLS configuration with RDS PostgreSQL health check", () =>
8989
});
9090
});
9191

92+
// Drop RHDH SSE connection so Playwright trace teardown doesn't hang
93+
// (microsoft/playwright#41513, fixed in v1.62).
94+
test.afterEach(async ({ page }) => {
95+
await page.goto("about:blank").catch(() => {});
96+
});
97+
9298
test("Configure and restart deployment", async ({}, testInfo) => {
9399
if (!config.host) {
94100
testInfo.skip(true, `RDS_*_HOST not set for ${config.name}`);
@@ -105,14 +111,10 @@ test.describe("Verify TLS configuration with RDS PostgreSQL health check", () =>
105111
});
106112

107113
test("Verify successful DB connection", async ({ page }) => {
108-
try {
109-
const uiHelper = new UIhelper(page);
110-
const common = new Common(page);
111-
await common.loginAsGuest();
112-
await uiHelper.verifyHeading("Welcome back!");
113-
} finally {
114-
await page.goto("about:blank").catch(() => {});
115-
}
114+
const uiHelper = new UIhelper(page);
115+
const common = new Common(page);
116+
await common.loginAsGuest();
117+
await uiHelper.verifyHeading("Welcome back!");
116118
});
117119
});
118120
}

e2e-tests/playwright/e2e/plugin-division-mode-schema/verify-schema-mode.spec.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { ChildProcessWithoutNullStreams, spawn } from "child_process";
1212
import { test, expect } from "@support/coverage/test";
1313

1414
import { Common } from "../../utils/common";
15-
import { resolveInstallMethod } from "../../utils/helper";
15+
import { getReleaseName, resolveInstallMethod } from "../../utils/helper";
1616
import { KubeClient } from "../../utils/kube-client";
1717
import { ensureRuntimeDeployed } from "../../utils/runtime-deploy";
1818
import { setPortForwardRestarter } from "./schema-mode-db";
@@ -80,7 +80,7 @@ function killPortForward(proc: ChildProcessWithoutNullStreams | undefined): Prom
8080

8181
test.describe("Verify pluginDivisionMode: schema", () => {
8282
const namespace = process.env.NAME_SPACE_RUNTIME ?? "showcase-runtime";
83-
const releaseName = process.env.RELEASE_NAME ?? "rhdh";
83+
const releaseName = getReleaseName();
8484
const installMethod = resolveInstallMethod();
8585

8686
let portForwardProcess: ChildProcessWithoutNullStreams | undefined;
@@ -156,6 +156,17 @@ test.describe("Verify pluginDivisionMode: schema", () => {
156156
await killPortForward(portForwardProcess);
157157
});
158158

159+
// RHDH's frontend opens an SSE (EventSource) connection for live
160+
// updates. With tracing enabled, Playwright's fixture teardown hangs
161+
// waiting for network idle, which never resolves while SSE stays open
162+
// (microsoft/playwright#41513, fixed in v1.62). Navigating away drops
163+
// the connection so teardown completes immediately.
164+
// Requesting `page` creates a context for every test, including non-UI
165+
// ones — acceptable overhead vs per-test conditional logic.
166+
test.afterEach(async ({ page }) => {
167+
await page.goto("about:blank").catch(() => {});
168+
});
169+
159170
test("Verify database user has restricted permissions", async () => {
160171
const hasRestrictedPerms = await testSetup.verifyRestrictedDatabasePermissions();
161172
expect(hasRestrictedPerms).toBe(true);
@@ -181,17 +192,10 @@ test.describe("Verify pluginDivisionMode: schema", () => {
181192
}
182193

183194
const common = new Common(page);
184-
try {
185-
await common.loginAsGuest();
195+
await common.loginAsGuest();
186196

187-
await expect(page.getByRole("heading", { level: 1 })).toBeVisible();
197+
await expect(page.getByRole("heading", { level: 1 })).toBeVisible();
188198

189-
console.log("RHDH is accessible - plugins successfully created schemas in schema mode");
190-
} finally {
191-
// Navigate away from RHDH to close WebSocket connections before
192-
// Playwright tears down the page — prevents a long hang during
193-
// context/trace cleanup.
194-
await page.goto("about:blank").catch(() => {});
195-
}
199+
console.log("RHDH is accessible - plugins successfully created schemas in schema mode");
196200
});
197201
});

e2e-tests/playwright/utils/helper.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,20 @@ export function resolveInstallMethod(): "helm" | "operator" {
131131
return job.includes("operator") ? "operator" : "helm";
132132
}
133133

134+
/**
135+
* Canonical release name resolution. Returns the RELEASE_NAME env var if set
136+
* and non-empty, otherwise defaults to "rhdh".
137+
*
138+
* Note: the explicit check is used instead of `||` because oxlint's
139+
* strict-boolean-expressions and prefer-nullish-coalescing rules
140+
* (pedantic category) reject `||` on string operands.
141+
*/
142+
export function getReleaseName(): string {
143+
return process.env.RELEASE_NAME !== undefined && process.env.RELEASE_NAME !== ""
144+
? process.env.RELEASE_NAME
145+
: "rhdh";
146+
}
147+
134148
/** Base64-encode a string. */
135149
export function base64Encode(value: string): string {
136150
return Buffer.from(value).toString("base64");

e2e-tests/playwright/utils/kube-client/helpers.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as k8s from "@kubernetes/client-node";
22

33
import { getErrorMessage, hasErrorResponse, hasStatusCode } from "../errors";
4-
import { resolveInstallMethod } from "../helper";
4+
import { getReleaseName, resolveInstallMethod } from "../helper";
55

66
export function isRecord(value: unknown): value is Record<string, unknown> {
77
return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -135,10 +135,7 @@ export function getKubeApiErrorMessage(error: unknown): string {
135135
* then falls back to JOB_NAME pattern matching.
136136
*/
137137
export function getRhdhDeploymentName(): string {
138-
const releaseName =
139-
process.env.RELEASE_NAME !== undefined && process.env.RELEASE_NAME !== ""
140-
? process.env.RELEASE_NAME
141-
: "rhdh";
138+
const releaseName = getReleaseName();
142139
return resolveInstallMethod() === "operator"
143140
? `backstage-${releaseName}`
144141
: `${releaseName}-developer-hub`;

0 commit comments

Comments
 (0)