Skip to content

chore(e2e): run bulk-import tests with NFS - #3318

Merged
gustavolira merged 6 commits into
mainfrom
nfs-bulk-import
Aug 19, 2026
Merged

chore(e2e): run bulk-import tests with NFS#3318
gustavolira merged 6 commits into
mainfrom
nfs-bulk-import

Conversation

@gustavolira

@gustavolira gustavolira commented Aug 18, 2026

Copy link
Copy Markdown
Member

Closes RHIDP-16293.

Adds a bulk-import-app-next project. The -app-next namespace suffix is what makes e2e-test-utils merge the NFS secrets and the default app-auth / app-integrations layers.

Correction to an earlier revision of this description: it said the project entry was the whole change, as it was for analytics (#2900) and acr (#2889). Not here — running the spec in a second project exposed a test.runOnce key collision that would have stopped the new lane from deploying at all. See below.

Why no locator branching was needed

Worth recording, because the two most recent migrations both needed it. acr had to branch "Image Registry""ACR IMAGES" and tekton "CI""Tekton", because under NFS the suite's Scalprum config is inert and the title comes from the plugin's own blueprint instead.

Here the two shells agree. From rhdh-plugins/workspaces/bulk-import/plugins/bulk-import/src/index.tsx:

const bulkImportPage = PageBlueprint.make({
  params: { title: 'Bulk import', path: '/bulk-import', routeRef: rootRouteRef },
});

and the legacy lane's Scalprum config sets dynamicRoutes.path: /bulk-import with menuItem.text: Bulk import. So the suite's BULK_IMPORT_ROUTE (/bulk-import) and BULK_IMPORT_HEADING (Bulk import) hold for both lanes unchanged.

The three Scalprum sections this workspace configures — translationResources, appIcons, dynamicRoutes, all pinned module: Legacy — are simply not read under NFS. They stay for the legacy lane.

The one real change beyond the config entry

test.runOnce keys its flag file by the string alone, in a directory shared by every project in the run:

const flagDir = path.join(os.tmpdir(), `playwright-once-${process.ppid}`);
const flagFile = path.join(flagDir, `${key}.done`);

This spec guarded its setup with a literal key, so once the bulk-import project had run it, bulk-import-app-next found the flag and skipped configure() + deploy() entirely. The new lane would never have deployed RHDH into its own namespace, and the first assertion would have failed on a missing heading with nothing pointing at the cause.

The key is now scoped by namespace — which is what deploy() already does internally (deploy-${namespace}). The outer literal key was preventing that correct inner guard from ever being reached for the second project.

Proven against the real runOnce implementation rather than by inspection: with the literal key, one of the two projects runs its setup; with the scoped key, both do.

Worth noting for the remaining migrations: none of the five already-migrated workspaces use runOnce, which is why no earlier NFS migration surfaced this. Any workspace that does — and runs one spec in both shells — has the same trap.

Verified locally

  • ./run-e2e.sh -w bulk-import --list discovers bulk-import-app-next with the same 9 tests as the legacy lane (22 total across 3 projects).
  • tsc --noEmit, eslint and prettier --check clean on the changed file.

Needs a cluster run

/test e2e-ocp-helm — the lane itself cannot be verified locally. Two things I would watch in that run:

  1. Whether the plugin loads at all under app-next. The suite installs from a local dist path (./dynamic-plugins/dist/red-hat-developer-hub-backstage-plugin-bulk-import), i.e. the copy baked into the RHDH image rather than this repo's OCI artifact. packages/app-next ships only catalog, scaffolder, search and user-settings plus the dynamic loader, so bulk-import has to arrive through the loader. If it does not, the failure mode is a clean boot with an empty page — no error, exit 0 — so the first failing assertion will be the heading, not anything diagnostic.
  2. Interaction with fix(#3303): disable chart default bulk-import plugin to preserve module: Legacy #3306. That PR is in flight for the same workspace and is about exactly this mechanism: the chart's dynamic-plugins.default.yaml pre-configures bulk-import with module: Alpha for translationResources and no module elsewhere, and the deep merge strips module: Legacy, breaking scalprum's resolution of BulkImportPage. It adds disablePlugins to work around that on the legacy lane. Under app-next none of those module names are read, so the two changes should be independent — but they touch the same workspace and fix(#3303): disable chart default bulk-import plugin to preserve module: Legacy #3306 should probably land first to avoid a confusing merge.

Not done here

The plugin's NFS extension has no test anywherebulkImportPage is built with PageBlueprint.make and nothing asserts that it attaches or what it declares. That belongs upstream in rhdh-plugins, not in this PR, and is tracked in the analysis on the ticket. It is also what would turn the failure mode in point 1 above from "the heading is missing" into "this blueprint did not attach".

🤖 Generated with Claude Code

Adds a bulk-import-app-next project. The namespace suffix is what makes
e2e-test-utils merge the NFS (app-next) secrets and the default app-auth /
app-integrations layers, so the project entry is the whole trigger.

No locator branching was needed, which is worth recording because acr and
tekton both required it. Their tab titles changed between the two shells
("Image Registry" to "ACR IMAGES", "CI" to "Tekton") because under NFS the
suite's Scalprum config is inert and the title comes from the plugin's own
blueprint. Here the two agree: the plugin's PageBlueprint declares
path: '/bulk-import' and title: 'Bulk import', which are exactly the values
the legacy lane gets from the Scalprum dynamicRoutes path and menuItem text.
So BULK_IMPORT_ROUTE and BULK_IMPORT_HEADING hold unchanged for both lanes.

The three Scalprum sections this workspace configures (translationResources,
appIcons, dynamicRoutes, all pinned module: Legacy) are simply not read under
NFS. They stay for the legacy lane.

Verified locally: run-e2e.sh --list discovers the project with the same 9
tests as the legacy lane, and tsc, eslint and prettier are clean. The lane
itself needs a cluster run.

Part of RHIDP-16293.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 18, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 6:22 PM UTC · Completed 6:29 PM UTC

Commit: edae03f · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 18, 2026

Copy link
Copy Markdown

Review — chore(e2e): run bulk-import tests with NFS

Verdict: approve · 5 files changed · E2E test infrastructure only

Summary

This PR adds a bulk-import-app-next Playwright project to run the bulk-import E2E suite under the New Frontend System (NFS), following the established migration pattern used by acr, analytics, topology, tekton, tech-radar, and app-defaults.

The substantive change beyond the project entry is the test.runOnce key collision fix — a genuine bug that would have silently prevented the NFS lane from deploying RHDH into its own namespace.

What was reviewed

1. runOnce key scoping (correctness — verified)

The old literal key "bulk-import-rhdh-setup" keys a flag file in a directory shared by all projects in the Playwright run. When both bulk-import and bulk-import-app-next run the same spec (bulk-import.spec.ts), whichever project executes first writes the flag, and the second project skips configure() + deploy() entirely — never deploying RHDH into its own namespace. The first assertion would then fail on a missing heading with no diagnostic pointing to the cause.

The fix — bulk-import-rhdh-setup-${rhdh.deploymentConfig.namespace} — mirrors what deploy() already does internally (deploy-${namespace}). This is the correct pattern. Confirmed that no other workspace with an -app-next lane uses runOnce (the five already-migrated workspaces don't use it), so this is the first workspace to surface the trap.

2. process.pid in repo names (correctness — verified)

Appending process.pid to catalogRepoName and newRepoName prevents GitHub repo name collisions when two Playwright workers (one per project) evaluate Date.now() at nearly the same time. Each worker has its own PID, so the names are unique. The afterAll cleanup is unaffected — each worker cleans up its own repos since variables are evaluated per-worker.

3. page.goto(CATALOG_IMPORT_ROUTE) replacing UI navigation (correctness — verified)

The old path — clickButton("Self-service")clickButton("Import an existing Git repository") — relies on the global header, which doesn't exist under NFS. The new page.goto("/catalog-import") works for both shells since the route is the same. The test's subject is what happens after the import, not how the page was reached. The constant is well-documented with a JSDoc explaining the cross-lane rationale.

4. NFS guardrail assertion (correctness — verified)

if (isAppNext) {
  expect(rhdh.deploymentConfig.useNewFrontendSystem).toBe(true);
}

Only asserts the forward direction (app-next → NFS enabled), not the reverse, which is correct since USE_NEW_FRONTEND_SYSTEM=true may legally be set on all lanes. This catches silent misconfiguration that would otherwise produce a false pass.

5. Documentation counts (verified)

  • 46 → 47 projects: +1 ✓ (confirmed via grep -h 'name: "' on main: 46)
  • 6 → 7 app-next lanes: +1 ✓ (confirmed: 6 on main)
  • 40 → 39 legacy-only: -1 ✓
  • svc class 9 → 10: +1 ✓ (bulk-import is classified svc)
  • 29 → 30 non-OpenShift: +1 ✓

6. Interaction with #3306

The PR body flags that #3306 (same workspace, disablePlugins for legacy lane module resolution) should probably land first. The two changes touch different aspects — this PR adds a project entry and fixes test infrastructure, while #3306 addresses Scalprum module configuration — so they're mechanically independent. Under NFS, the Scalprum sections are not read, confirming the independence claim.

No findings above threshold

No correctness, security, or convention issues found. The change is well-scoped, follows established patterns, and the runOnce fix addresses a real bug that would have blocked the new lane.

Previous run

Review — approve

Scope: E2E test infrastructure — adds NFS (app-next) lane for the bulk-import workspace, fixes a test.runOnce key collision, prevents cross-worker GitHub repo name collisions, and updates triage documentation.

What this PR does

  1. Adds a bulk-import-app-next Playwright project — the -app-next namespace suffix is all that's needed for e2e-test-utils to merge NFS secrets and default layers. The project reuses the same spec file (bulk-import.spec.ts) as the legacy lane, with no locator branching required because the plugin's PageBlueprint title and the Scalprum menuItem.text both resolve to "Bulk import".

  2. Fixes the test.runOnce key collision — the original literal key "bulk-import-rhdh-setup" caused the second project to skip configure() + deploy() entirely, since runOnce keys its flag file by the string alone in a shared /tmp/ directory. The key is now scoped by namespace (bulk-import-rhdh-setup-${namespace}), matching the pattern deploy() itself uses internally (deploy-${namespace}).

  3. Adds process.pid to generated repo names — both projects evaluate Date.now() when their workers start, and since workers start concurrently, identical millisecond-resolution names are possible. Since both lanes create and delete real GitHub repos, a collision would have one lane deleting repos the other is still using.

  4. Adds NFS mode assertionexpect(rhdh.deploymentConfig.useNewFrontendSystem).toBe(true) in the app-next lane prevents a silent false pass where NFS failed to activate and the lane just re-ran the legacy suite.

  5. Updates docs/nfs-e2e-triage.md — project counts (46→47), app-next lanes (6→7), legacy-only (40→39), svc class (9→10), and the §6 reproduction comment.

Correctness

  • The runOnce key scoping correctly mirrors deploy()'s own internal pattern. Verified by examining the runOnce implementation's flag-file mechanism.
  • The process.pid suffix is appropriate — the project name was considered but rejected because catalogRepoName is also used as metadata.name (63-char K8s limit), and the app-next variant would be 62 chars.
  • The NFS assertion correctly guards only the forward direction — USE_NEW_FRONTEND_SYSTEM=true can legally enable NFS for all lanes, so the legacy lane is not constrained.
  • The nightly skip was added and then deliberately reverted (commits 3 and 5), with sound reasoning: bulk-import is in default.packages.yaml like topology, so nightly resolves to the productized plugin — a more useful NFS signal, not a weaker one. The two workspaces that skip nightly (app-defaults, tech-radar) have unrelated causes.
  • Documentation count changes are arithmetically correct and reproducible with the §6 commands.

Existing workspace pattern

The orchestrator spec (bulk-import-orchestrator.spec.ts) retains literal runOnce keys, which is correct since it has only one project (bulk-import-orchestrator) running it — no collision risk. The config comment now explicitly records that the orchestrator lane has no app-next counterpart because it requires the orchestrator operator.

No concerns

  • Security: No sensitive data exposed; test infrastructure only.
  • Cross-repo contracts: No published APIs or schemas affected.
  • Style: Code follows existing conventions; comments explain the "why" clearly.
  • Documentation: In sync with code changes.

The change is well-scoped, well-documented, and consistent with the five prior NFS migrations. The runOnce key fix is a genuine correctness issue that would have caused a silent deploy failure — good catch.


🤖 Reviewed with Claude Code

Previous run (2)

Review

Verdict: approve

Clean, well-scoped PR that adds the NFS (app-next) test lane for the bulk-import workspace and fixes a real test.runOnce key collision bug that the new lane exposed.

What was reviewed

Dimension Result
Correctness ✅ The runOnce key scoping fix is correct. The literal key "bulk-import-rhdh-setup" would be shared between the bulk-import and bulk-import-app-next projects (both match bulk-import.spec.ts), causing the second project to skip its entire setup. Scoping by rhdh.deploymentConfig.namespace mirrors what deploy() does internally (deploy-${namespace}) and ensures each project runs its own full deployment.
Security ✅ No security-relevant changes. E2E test infrastructure only.
Intent & coherence ✅ Traces to RHIDP-16293. Follows the established -app-next migration pattern (analytics #2900, acr #2889, tech-radar, topology, tekton). The runOnce fix is not scope creep — it was exposed by and is necessary for the new lane.
Style & conventions ✅ Project entry structure matches existing entries. Comment block documents all three projects clearly.
Docs currency ⚠ One low finding — see below.
Cross-repo contracts ✅ No public APIs or schemas changed.

Findings

Low: Stale counts in docs/nfs-e2e-triage.md

The NFS triage sheet has several counts that become stale after this PR adds bulk-import-app-next:

  • Bulk-import row (line 135): should show 3 projects with NFS ✅
  • Total Playwright projects (line 34): 46 → 47
  • -app-next lanes (line 35): 6 → 7
  • svc class tally (line 159): 9 → 10
  • Prose references to "46 projects" (lines 163, 243): → 47

The document carries its own "Verified against main" datestamp and provides reproduction commands in §6, so it can be updated independently.

Notes for the reviewer

Previous run (3)

Review of PR #3318 — chore(e2e): run bulk-import tests with NFS

Summary

This PR adds a bulk-import-app-next project to the Playwright config so the bulk-import E2E suite runs under the New Frontend System (NFS/app-next). The config entry follows the established pattern from other workspaces (acr, analytics, tekton) and the JSDoc comment is well-written. However, the existing spec file's use of test.runOnce with a fixed key prevents the new project from deploying RHDH.

Findings

🔴 test.runOnce key collision prevents RHDH deployment for the NFS project

File: workspaces/bulk-import/e2e-tests/tests/specs/bulk-import.spec.ts (line 56)

The new bulk-import-app-next project runs the same bulk-import.spec.ts as the existing bulk-import project. That spec wraps all RHDH setup inside test.runOnce("bulk-import-rhdh-setup", ...). Since runOnce uses process-scoped file-based flags in /tmp/, whichever project runs second will skip the entire setup callback — meaning no RBAC ConfigMap, no rhdh.configure(), and no rhdh.deploy() for that project's namespace.

This is confirmed by how other multi-project workspaces handle the same scenario:

  • Workspaces without runOnce (acr, analytics, tekton): Their specs call rhdh.configure() + rhdh.deploy() directly in beforeAll — no key collision, each project deploys independently. ✅
  • Workspaces with project-scoped keys (orchestrator): Explicitly includes testInfo.project.name in the key — e.g., `orchestrator-setup-${testInfo.project.name}` — so each project gets its own flag. ✅
  • This workspace (bulk-import): Uses a hardcoded key "bulk-import-rhdh-setup" shared across projects. ❌

Impact: All 9 tests in the bulk-import-app-next project will fail because RHDH is never deployed in its namespace.

Remediation (two options):

  1. Scope the key by project — update bulk-import.spec.ts line 56 to include the project name:

    test.beforeAll(async ({ rhdh }, testInfo) => {
      await test.runOnce(`bulk-import-rhdh-setup-${testInfo.project.name}`, async () => {
        await setupBulkImportRhdh(rhdh, { ... });
      });

    This matches the orchestrator workspace's pattern and preserves worker-restart protection.

  2. Remove runOnce — since all operations inside are idempotent (kubectl apply) or internally protected (rhdh.deploy()), the wrapper could be dropped. On worker restart, the redundant kubectl apply and rhdh.configure() re-run harmlessly, and rhdh.deploy() skips via its own internal guard.

Option 1 is the safer approach and consistent with project conventions.

What looks good

  • The -app-next naming convention is correct and consistent with prior art (acr chore(e2e): enable nfs for acr e2e #2889, analytics chore(e2e): run analytics e2e tests with nfs #2900).
  • The JSDoc comment documenting all three projects and explaining why no locator branching is needed is thorough and helpful.
  • The timeout matches the existing projects.
  • The PR body's analysis of Scalprum vs NFS behavior is accurate — the plugin's PageBlueprint declares the same route and title as the legacy config.

Verdict

Request changes — the config entry is correct, but the spec file needs a one-line fix to the runOnce key before the NFS lane can actually deploy and run.


Labels: PR modifies E2E test configuration for an existing workspace

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review fullsend-ai-review Bot added the workspace-update PR modifies files in an existing workspace label Aug 18, 2026
Adding the app-next project made this spec run in two projects, and its
setup was guarded by test.runOnce with a literal key. runOnce keys its flag
file by the string alone, in a directory shared by every project in the run:

    const flagDir = path.join(os.tmpdir(), `playwright-once-${process.ppid}`);
    const flagFile = path.join(flagDir, `${key}.done`);

So the first project's setup satisfied the second, and bulk-import-app-next
would have skipped configure() + deploy() entirely -- never deploying RHDH
into its own namespace, then failing on the first assertion with a missing
heading and nothing pointing at the cause.

The key is now scoped by namespace, which is what deploy() already does
internally (`deploy-${namespace}`); the outer literal key was preventing that
correct inner guard from ever being reached for the second project.

Verified against the real runOnce implementation: with the literal key only
one of the two projects runs its setup, with the scoped key both do.

None of the five already-migrated workspaces use runOnce, which is why no
earlier NFS migration surfaced this.

Part of RHIDP-16293.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 18, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 6:33 PM UTC · Completed 6:45 PM UTC

Commit: 6a35373 · View workflow run →

@fullsend-ai-review
fullsend-ai-review Bot dismissed their stale review August 18, 2026 18:44

Superseded by updated review

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review fullsend-ai-review Bot added the ready-for-merge All reviewers approved — ready to merge label Aug 18, 2026
Four findings from the review passes, each verified before applying.

Skip the lane in nightly. Both bulk-import packages are in
default.packages.yaml, so e2e-test-utils' DPDY resolution rewrites them to
oci://<registry>/...:{{inherit}} in nightly mode and the lane would load
whatever build ships in the RHDH image rather than the artifact this repo
pins -- which is not known to expose the NFS entry point. app-defaults
already skips nightly for exactly this mechanism (RHIDP-15482) and
tech-radar scopes its skip to the app-next project the same way.

Assert the lane really is running NFS. Without it, a lane that silently
failed to enable the new frontend system would just re-run the legacy suite
and stay green -- a false pass on the only thing this lane adds. Only the
forward direction is asserted: useNewFrontendSystem is
`namespace.endsWith("-app-next") || USE_NEW_FRONTEND_SYSTEM === "true"`, so
a global flag may legally turn NFS on everywhere and the legacy lane must
not be constrained. A two-way assertion was proposed and rejected for that
reason; both guards were mutation-checked against the real config builder.

Add process.pid to the two generated repository names. Playwright cannot
share a worker between projects -- the project id is part of the worker
hash -- so the two lanes evaluate the module separately, but Date.now() is
millisecond resolution and the workers start together, so an identical name
is possible. Both lanes create real repositories in janus-qe and delete
them in afterAll, so a collision would have one lane deleting the repo the
other is still using. process.pid is distinct across concurrently-alive
workers; the project name is not usable here because catalogRepoName is
also the Backstage metadata.name, capped at 63 chars, and the app-next
variant is 62.

Correct the JSDoc attribution. The claim that no locator branching is
needed holds, but the H1 does not come from the blueprint title: the
blueprint sets noHeader: true, so the shell header is suppressed and the
heading comes from the plugin's own <Header title={t('page.title')}>. The
blueprint title drives the nav item. Rationale moved next to
BULK_IMPORT_HEADING, where a reader looking at the locator will find it,
and the config comment now records why the orchestrator lane deliberately
has no app-next counterpart.

Also refreshes the triage sheet's counts, which this PR's new project makes
stale: 46 projects -> 47, 6 app-next lanes -> 7, 40 legacy-only -> 39.

Part of RHIDP-16293.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gustavolira
gustavolira requested review from a team, gashcrumb and kadel as code owners August 18, 2026 18:45
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 18, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 6:46 PM UTC · Ended 6:58 PM UTC

Commit: 47eb141 · View workflow run →

t and others added 2 commits August 18, 2026 15:57
My earlier commit updated four numbers and missed three the reviewer
caught: the svc class tally (9 -> 10, the new lane is svc like the legacy
one it mirrors), the "29 of the 46 projects do not need OpenShift" prose
(30 of 47), and the count in the §6 reproduce command's own comment.

That last one mattered most: §6 exists so a reader can re-derive the
numbers, so a stale comment there undercuts the whole section. Both figures
now reproduce -- 47 projects, 7 app-next lanes.

Part of RHIDP-16293.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
I added that skip on a premise I never verified -- that the build nightly
resolves via {{inherit}} would not expose the NFS entry point. Checking the
repo's actual convention shows the skip is wrong, and topology settles it:
its frontend package is in default.packages.yaml exactly like this one, it
has an app-next lane, and it does not skip nightly.

The two workspaces that do skip have unrelated, verified causes.
app-defaults' packages are not in default.packages.yaml and not in the RHDH
image (RHIDP-15482). tech-radar is shadowed by a baked-in wrapper. Neither
condition holds for bulk-import, which ships in the image and resolves to a
real build.

What nightly actually does here is resolve to
oci://registry.access.redhat.com/rhdh/...:{{inherit}}, i.e. test the
productized plugin rather than the ghcr artifact this repo pins. For an NFS
lane that is the more useful signal, not a weaker one -- "does the plugin
customers get mount under the new frontend system" is the question the epic
is asking. Skipping it starved the nightly triage pipeline of exactly that
answer.

The comment now records why the skip should not come back, since the
{{inherit}} rewrite looks alarming until you know topology already runs
with it.

The NFS assertion added alongside the skip stays, and matters more now: it
is what stops a lane that failed to enable the new frontend system from
quietly re-running the legacy suite and passing.

Part of RHIDP-16293.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gustavolira

Copy link
Copy Markdown
Member Author

/publish

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 18, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 7:35 PM UTC · Completed 7:40 PM UTC

Commit: a803a24 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review fullsend-ai-review Bot added ready-for-merge All reviewers approved — ready to merge and removed ready-for-merge All reviewers approved — ready to merge labels Aug 18, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Publish workflow has completed with success.

Publishing process

✅ Finished successfully.

✅ Published container images:

  • ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-bulk-import:pr_3318__8.0.0
  • ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-bulk-import-backend:pr_3318__8.0.0

Backstage Compatibility Check

✅ All workspaces are compatible with the target Backstage version (1.52.0).

No action required.

Metadata Validation

✅ All metadata files validated successfully.

Running e2e tests
/test e2e-ocp-helm

@github-actions

Copy link
Copy Markdown
Contributor

Smoke tests workflow passed. All plugins loaded successfully.

@rhdh-test-bot

Copy link
Copy Markdown

❌ Failed E2E Tests - bulk-import

Platform: ocp 4.20 | RHDH Version: 1.11 | Duration: 14m 23s
Passed: 13 | Failed: 2 | Flaky: 0 | Skipped: 7
Playwright Report | Build Log | Logs | Artifacts

The app-next lane failed one test on `clickButton("Self-service")`. That
button lives in RHDH's global header, and packages/app-next ships no global
header, so the path does not exist in that shell.

Replaced the two shell-chrome clicks with a direct navigation to
/catalog-import -- the same page those clicks land on. The test's subject is
that a catalog-imported repo shows up in the Catalog and not in Bulk import;
how the import page was reached is incidental, and CatalogImportPO only
needs to be on the page (it fills input[name="url"] and clicks Analyze).
This removes a dependency on chrome that differs between the two shells
rather than branching on the lane, so it is one path for both.

What the run established, beyond this one failure:

The lane deployed and 6 of its 7 runnable tests passed, so the runOnce key
fix worked -- without it the lane would have had no deployment at all. The
NFS assertion passed, so the new frontend system really was active. The
"Bulk import" nav item and the /bulk-import route both resolved under NFS,
which is what the config comment claimed. And the failure screenshot shows
the generated repo name ending in the worker pid, so that fix is live too.

It also settles the nightly question the earlier revert was about: the
plugin does mount under NFS, so skipping the lane in nightly would have
suppressed a working signal.

The other failure in that run is not this PR's: bulk-import-orchestrator
never became ready because the orchestrator backend plugin crashes at
startup with "TypeError: Cannot read properties of undefined (reading
'id')". That is tracked in #3083 with PR #3086 open for it, and this diff
touches no orchestrator file.

Part of RHIDP-16293.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 18, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 8:07 PM UTC · Completed 8:12 PM UTC

Commit: cc7d37b · View workflow run →

@fullsend-ai-review fullsend-ai-review Bot added ready-for-merge All reviewers approved — ready to merge and removed ready-for-merge All reviewers approved — ready to merge labels Aug 18, 2026
@github-actions github-actions Bot added the mandatory-workspace PR affects a workspace with required plugins for releases label Aug 18, 2026
@gashcrumb

Copy link
Copy Markdown
Member

/test e2e-ocp-helm

@rhdh-test-bot

Copy link
Copy Markdown

❌ Failed E2E Tests - bulk-import

Platform: ocp 4.20 | RHDH Version: 1.11 | Duration: 14m 28s
Passed: 13 | Failed: 2 | Flaky: 0 | Skipped: 7
Playwright Report | Build Log | Logs | Artifacts

@gustavolira

Copy link
Copy Markdown
Member Author

/publish

@github-actions

Copy link
Copy Markdown
Contributor

Publish workflow has completed with success.

Publishing process

✅ Finished successfully.

✅ Published container images:

  • ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-bulk-import:pr_3318__8.0.0
  • ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-bulk-import-backend:pr_3318__8.0.0

Backstage Compatibility Check

✅ All workspaces are compatible with the target Backstage version (1.52.0).

No action required.

Metadata Validation

✅ All metadata files validated successfully.

Running e2e tests
/test e2e-ocp-helm

@github-actions

Copy link
Copy Markdown
Contributor

Smoke tests workflow passed. All plugins loaded successfully.

@rhdh-test-bot

Copy link
Copy Markdown

❌ Failed E2E Tests - bulk-import

Platform: ocp 4.20 | RHDH Version: 1.11 | Duration: 9m 45s
Passed: 13 | Failed: 2 | Flaky: 0 | Skipped: 7
Playwright Report | Build Log | Logs | Artifacts

@openshift-ci

openshift-ci Bot commented Aug 19, 2026

Copy link
Copy Markdown

@gustavolira: The following test failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/prow/e2e-ocp-helm cc7d37b link false /test e2e-ocp-helm

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

@gustavolira
gustavolira merged commit 57861ff into main Aug 19, 2026
35 of 36 checks passed
@gustavolira
gustavolira deleted the nfs-bulk-import branch August 19, 2026 22:08
@fullsend-ai-retro

fullsend-ai-retro Bot commented Aug 19, 2026

Copy link
Copy Markdown

🤖 Finished Retro · ✅ Success · Started 10:09 PM UTC · Completed 10:24 PM UTC

Commit: cc7d37b · View workflow run →

@fullsend-ai-retro

Copy link
Copy Markdown

Retro: PR #3318chore(e2e): run bulk-import tests with NFS

What happened

Human-authored PR by @gustavolira adding an NFS (New Frontend System) bulk-import-app-next Playwright project to the bulk-import workspace. The PR went through 5 review agent runs (4 executed, 1 cancelled) over ~28 hours before merge.

Review quality: excellent

The review agent caught a genuine, non-obvious correctness bug on its very first pass: the new bulk-import-app-next project shares a spec file with the existing bulk-import project, and both used a hardcoded test.runOnce("bulk-import-rhdh-setup", ...) key. Because runOnce uses process-scoped file flags keyed by string alone, whichever project ran second would silently skip deployment — causing all 9 NFS tests to fail on a misleading "missing heading" error with nothing pointing to the real cause.

The agent's finding was well-evidenced (compared three patterns across other workspaces), offered two concrete remediations, and the author fixed it within 3 minutes. The human reviewer (@gashcrumb) approved the next day without additional findings. This is a strong positive signal for review autonomy on E2E infrastructure changes.

E2E test failures (2 of 22, consistent across 3 runs)

  1. [bulk-import-app-next] sidebar click interceptionuiHelper.openSidebar("Catalog") blocked by the NFS global header's logo element intercepting pointer events. The PR author fixed one navigation path (catalog-import) by switching to page.goto() but the catalog sidebar click remains. This is an NFS layout issue, not a regression from this PR.
  2. [bulk-import-orchestrator] pre-existing failure — orchestrator backend crash, tracked in [fullsend] E2E: bulk-import-orchestrator — orchestrator plugin crashes during backend init #3083 (fix_category: product_bug).

Both failures were understood and accepted by reviewers before merge.

Existing issues that cover related findings

Proposals filed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lgtm mandatory-workspace PR affects a workspace with required plugins for releases ready-for-merge All reviewers approved — ready to merge workspace-update PR modifies files in an existing workspace

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants