diff --git a/.github/workflows/reusable-ecosystem-ci.yml b/.github/workflows/reusable-ecosystem-ci.yml index ea48334a96..df17337fcd 100644 --- a/.github/workflows/reusable-ecosystem-ci.yml +++ b/.github/workflows/reusable-ecosystem-ci.yml @@ -114,6 +114,10 @@ jobs: # Avoid Windows dynamic port reservations around the default 63315. # https://github.com/vitest-dev/vitest/issues/9035 ECOSYSTEM_VITEST_PORT: '7357' + # Without a project pin, vp runs project commands on the latest LTS. + # `node-version` only selects the bootstrap Node.js for actions/setup-node. + # vp ignores an empty value. + VP_NODE_VERSION: ${{ matrix.project.vp-node-version || '' }} permissions: contents: read packages: read @@ -251,6 +255,8 @@ jobs: vp test - name: vinext node-version: 24 + # better-sqlite3 12.6.2 does not compile against the Node 26 headers. + vp-node-version: 24.22.1 # The full vinext suite (~7000 tests) outgrew a 15-minute budget # on 4-core runners, so run one shard of the unit project here; # the rest of the suite is covered by vinext's own CI. @@ -375,11 +381,15 @@ jobs: vp test run --project browser --browser.name=chrome --api.port="$ECOSYSTEM_VITEST_PORT" - name: sqlocal node-version: 24 + # The WebDriverIO provider cannot connect to Chrome on Node 26 (see #3266). + vp-node-version: 24.22.1 command: | # OPFS setup can exceed the upstream 1-second hook timeout on CI. vp test run --browser.name=chrome --hookTimeout=5000 --api.port="$ECOSYSTEM_VITEST_PORT" - name: brazilian-utils node-version: 24 + # The WebDriverIO provider cannot connect to Chrome on Node 26 (see #3266). + vp-node-version: 24.22.1 command: | vp test run --browser.enabled --browser.name=chrome --browser.headless --api.port="$ECOSYSTEM_VITEST_PORT" - name: solid-vite-plugin diff --git a/.github/workflows/test-standalone-install.yml b/.github/workflows/test-standalone-install.yml index 71b06a7e0f..45b5e32bda 100644 --- a/.github/workflows/test-standalone-install.yml +++ b/.github/workflows/test-standalone-install.yml @@ -781,7 +781,8 @@ jobs: -v "${{ github.workspace }}:/workspace" \ ubuntu:20.04 bash -c " ls -al ~/ - apt-get update && apt-get install -y curl ca-certificates + # The ARM64 Node.js runtime requires libatomic.so.1. + apt-get update && apt-get install -y curl ca-certificates libatomic1 export VP_HOME=\"\$HOME/.vite-plus\" cat /workspace/packages/cli/install.sh | VP_LEGACY_INSTALLER_URL=file:///workspace/packages/cli/install-legacy.sh bash if [ -f ~/.profile ]; then diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_env_list_remote/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_env_list_remote/snapshots.toml index 9277c0d854..6a226fef08 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_env_list_remote/snapshots.toml +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_env_list_remote/snapshots.toml @@ -2,7 +2,7 @@ name = "command_env_list_remote" vp = "global" skip-platforms = ["windows"] -seed-runtime = false +# CI prepares the LTS runtime in the seed, so `vp env install lts` does not download it. steps = [ { argv = ["vp", "env", "default", "node"], comment = "An unconfigured Node.js default explains the effective fallback without claiming it was set in config", continue-on-failure = true }, { argv = ["vp", "env", "install", "lts"], comment = "Install an LTS Node.js version locally", continue-on-failure = true }, diff --git a/ecosystem-ci/webdriverio.ts b/ecosystem-ci/webdriverio.ts index 7dc211b022..41cc0c9cc0 100644 --- a/ecosystem-ci/webdriverio.ts +++ b/ecosystem-ci/webdriverio.ts @@ -45,6 +45,17 @@ export async function prepareWebdriverioProject( '{ timeout: 10000 }', ); + // The memory, local, and session variants all use database.sqlite3 in OPFS. + // deleteDatabaseFile reopens the file, and the test never destroys its clients. + // A client from an earlier variant can still hold the file when a later + // variant removes it, which throws NoModificationAllowedError. + // Remove when upstream destroys these clients. + await replaceOnce( + join(root, 'test', 'get-database-file.test.ts'), + 'await deleteDatabaseFile();', + 'await deleteDatabaseFile(undefined, true);', + ); + // Deleting client3 broadcasts a reconnect to client2 without awaiting it. // Wait for client2 to recreate the OPFS file before checking its handle. // Remove when upstream waits for the other client's asynchronous reconnect.