Skip to content

chore(e2e-tests): Use tarball symlinks for E2E tests instead of verdaccio#20386

Draft
mydea wants to merge 4 commits intodevelopfrom
fn/e2e-test-linked
Draft

chore(e2e-tests): Use tarball symlinks for E2E tests instead of verdaccio#20386
mydea wants to merge 4 commits intodevelopfrom
fn/e2e-test-linked

Conversation

@mydea
Copy link
Copy Markdown
Member

@mydea mydea commented Apr 17, 2026

This PR completely removes verdaccio in favor of referencing the built tarballs directly.
We rely on pnpm overrides which we inject into the test app to ensure that also transitive dependencies are correct.

This is basically instant and reduces about 20s of verdaccio/registry preparation time we used to have before each e2e test app.

How it works

  • We use a reference to a tarball for internal dependencies in our e2e tests. these are virtual files in /packed directory, e.g. "@sentry/browser": "file:../../packed/sentry-browser-packed.tgz",
  • yarn test:prepare will create/update those packed files with symlinks to the current tarballs (which have the version in their filename so we cannot just link to them directly consistently)
  • Additionally, we adjust the created test apps in the tmp dir by adding a pnpm.overrides section for all our apps pointing them to the packed folder, to ensure we get these as transitive dependencies as well

Locally, you can continue to use yarn test:run test-app-name and it will do all of that under the hood, nothing else needed (except to generate the tarballs, as before). On CI I adjusted the places to run the necessary pieces in addition to ensure everything works as expected.

Example generated test app

It effectively creates a package.json for the test app that looks like this:

{
  "name": "node-hapi",
  "version": "1.0.0",
  "private": true,
  "scripts": {
    "build": "tsc",
    "start": "node src/app.js",
    "test": "playwright test",
    "clean": "npx rimraf node_modules pnpm-lock.yaml",
    "test:build": "pnpm install",
    "test:assert": "pnpm test"
  },
  "dependencies": {
    "@hapi/boom": "10.0.1",
    "@hapi/hapi": "21.3.10",
    "@sentry/node": "file:../../packed/sentry-node-packed.tgz"
  },
  "devDependencies": {
    "@playwright/test": "~1.56.0",
    "@sentry-internal/test-utils": "link:~/my-app/dev-packages/test-utils"
  },
  "volta": {
    "extends": "~/my-app/dev-packages/e2e-tests/package.json"
  },
  "pnpm": {
    "overrides": {
      "@sentry-internal/browser-utils": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-internal-browser-utils-packed.tgz",
      "@sentry-internal/eslint-config-sdk": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-internal-eslint-config-sdk-packed.tgz",
      "@sentry-internal/eslint-plugin-sdk": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-internal-eslint-plugin-sdk-packed.tgz",
      "@sentry-internal/feedback": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-internal-feedback-packed.tgz",
      "@sentry-internal/replay": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-internal-replay-packed.tgz",
      "@sentry-internal/replay-canvas": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-internal-replay-canvas-packed.tgz",
      "@sentry-internal/typescript": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-internal-typescript-packed.tgz",
      "@sentry/angular": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-angular-packed.tgz",
      "@sentry/astro": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-astro-packed.tgz",
      "@sentry/aws-serverless": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-aws-serverless-packed.tgz",
      "@sentry/browser": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-browser-packed.tgz",
      "@sentry/bun": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-bun-packed.tgz",
      "@sentry/cloudflare": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-cloudflare-packed.tgz",
      "@sentry/core": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-core-packed.tgz",
      "@sentry/deno": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-deno-packed.tgz",
      "@sentry/effect": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-effect-packed.tgz",
      "@sentry/elysia": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-elysia-packed.tgz",
      "@sentry/ember": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-ember-packed.tgz",
      "@sentry/gatsby": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-gatsby-packed.tgz",
      "@sentry/google-cloud-serverless": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-google-cloud-serverless-packed.tgz",
      "@sentry/hono": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-hono-packed.tgz",
      "@sentry/nestjs": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-nestjs-packed.tgz",
      "@sentry/nextjs": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-nextjs-packed.tgz",
      "@sentry/node": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-node-packed.tgz",
      "@sentry/node-core": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-node-core-packed.tgz",
      "@sentry/node-native": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-node-native-packed.tgz",
      "@sentry/nuxt": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-nuxt-packed.tgz",
      "@sentry/opentelemetry": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-opentelemetry-packed.tgz",
      "@sentry/profiling-node": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-profiling-node-packed.tgz",
      "@sentry/react": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-react-packed.tgz",
      "@sentry/react-router": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-react-router-packed.tgz",
      "@sentry/remix": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-remix-packed.tgz",
      "@sentry/solid": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-solid-packed.tgz",
      "@sentry/solidstart": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-solidstart-packed.tgz",
      "@sentry/svelte": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-svelte-packed.tgz",
      "@sentry/sveltekit": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-sveltekit-packed.tgz",
      "@sentry/tanstackstart": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-tanstackstart-packed.tgz",
      "@sentry/tanstackstart-react": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-tanstackstart-react-packed.tgz",
      "@sentry/types": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-types-packed.tgz",
      "@sentry/vercel-edge": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-vercel-edge-packed.tgz",
      "@sentry/vue": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-vue-packed.tgz",
      "@sentry/wasm": "file:~/my-app/dev-packages/e2e-tests/packed/sentry-wasm-packed.tgz"
    }
  }
}

then installs this normally with the regular registry.

@mydea mydea self-assigned this Apr 17, 2026
@github-actions
Copy link
Copy Markdown
Contributor

size-limit report 📦

Path Size % Change Change
@sentry/browser 25.78 kB - -
@sentry/browser - with treeshaking flags 24.27 kB - -
@sentry/browser (incl. Tracing) 43.65 kB - -
@sentry/browser (incl. Tracing + Span Streaming) 45.36 kB - -
@sentry/browser (incl. Tracing, Profiling) 48.58 kB - -
@sentry/browser (incl. Tracing, Replay) 82.79 kB - -
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags 72.29 kB - -
@sentry/browser (incl. Tracing, Replay with Canvas) 87.49 kB - -
@sentry/browser (incl. Tracing, Replay, Feedback) 99.74 kB - -
@sentry/browser (incl. Feedback) 42.59 kB - -
@sentry/browser (incl. sendFeedback) 30.45 kB - -
@sentry/browser (incl. FeedbackAsync) 35.45 kB - -
@sentry/browser (incl. Metrics) 27.07 kB - -
@sentry/browser (incl. Logs) 27.2 kB - -
@sentry/browser (incl. Metrics & Logs) 27.89 kB - -
@sentry/react 27.53 kB - -
@sentry/react (incl. Tracing) 45.92 kB - -
@sentry/vue 30.61 kB - -
@sentry/vue (incl. Tracing) 45.49 kB - -
@sentry/svelte 25.8 kB - -
CDN Bundle 28.46 kB - -
CDN Bundle (incl. Tracing) 44.73 kB - -
CDN Bundle (incl. Logs, Metrics) 29.83 kB - -
CDN Bundle (incl. Tracing, Logs, Metrics) 45.81 kB - -
CDN Bundle (incl. Replay, Logs, Metrics) 68.73 kB - -
CDN Bundle (incl. Tracing, Replay) 81.68 kB - -
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) 82.77 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback) 87.2 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) 88.27 kB - -
CDN Bundle - uncompressed 83.12 kB - -
CDN Bundle (incl. Tracing) - uncompressed 133.75 kB - -
CDN Bundle (incl. Logs, Metrics) - uncompressed 87.27 kB - -
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed 137.17 kB - -
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed 210.63 kB - -
CDN Bundle (incl. Tracing, Replay) - uncompressed 250.99 kB - -
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed 254.38 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed 263.9 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed 267.29 kB - -
@sentry/nextjs (client) 48.44 kB - -
@sentry/sveltekit (client) 44.09 kB - -
@sentry/node-core 57.94 kB +0.02% +6 B 🔺
@sentry/node 174.77 kB +0.01% +8 B 🔺
@sentry/node - without tracing 97.89 kB +0.03% +20 B 🔺
@sentry/aws-serverless 115.12 kB +0.01% +8 B 🔺

View base workflow run

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant