From 9e07d7ea73d15774027bc446199362cf546bd1f0 Mon Sep 17 00:00:00 2001 From: Martin Sonnberger Date: Thu, 14 Aug 2025 17:03:41 +0200 Subject: [PATCH 1/4] test(aws): Run E2E tests in all supported Node versions --- .github/workflows/build.yml | 4 +- .../aws-serverless/package.json | 14 ++++++ .../aws-serverless/pull-sam-image.sh | 15 ++++++ .../aws-serverless/src/stack.ts | 7 +-- .../aws-serverless/tests/lambda-fixtures.ts | 46 ++++++++++--------- 5 files changed, 58 insertions(+), 28 deletions(-) create mode 100755 dev-packages/e2e-tests/test-applications/aws-serverless/pull-sam-image.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 44057f39da11..8a769f6aac02 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -965,7 +965,7 @@ jobs: - name: Run E2E test working-directory: ${{ runner.temp }}/test-application timeout-minutes: 10 - run: pnpm test:assert + run: ${{ matrix.assert-command || 'pnpm test:assert' }} - name: Upload Playwright Traces uses: actions/upload-artifact@v4 @@ -1086,7 +1086,7 @@ jobs: - name: Run E2E test working-directory: ${{ runner.temp }}/test-application timeout-minutes: 10 - run: pnpm ${{ matrix.assert-command || 'test:assert' }} + run: ${{ matrix.assert-command || 'pnpm test:assert' }} - name: Pre-process E2E Test Dumps if: failure() diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless/package.json b/dev-packages/e2e-tests/test-applications/aws-serverless/package.json index 83437b2f9fbf..bf8085c4e892 100644 --- a/dev-packages/e2e-tests/test-applications/aws-serverless/package.json +++ b/dev-packages/e2e-tests/test-applications/aws-serverless/package.json @@ -23,5 +23,19 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "variants": [ + { + "build-command": "NODE_VERSION=20 ./pull-sam-image.sh && pnpm test:build", + "assert-command": "NODE_VERSION=20 pnpm test:assert", + "label": "aws-serverless (Node 20)" + }, + { + "build-command": "NODE_VERSION=18 ./pull-sam-image.sh && pnpm test:build", + "assert-command": "NODE_VERSION=18 pnpm test:assert", + "label": "aws-serverless (Node 18)" + } + ] } } diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless/pull-sam-image.sh b/dev-packages/e2e-tests/test-applications/aws-serverless/pull-sam-image.sh new file mode 100755 index 000000000000..f9ce20556f74 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless/pull-sam-image.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# Script to pull the correct SAM docker image based on the NODE_VERSION environment variable. + +set -e + +if [[ -z "$NODE_VERSION" ]]; then + echo "Error: NODE_VERSION not set" + exit 1 +fi + +echo "Pulling SAM Node $NODE_VERSION docker image..." +docker pull --platform linux/amd64 "public.ecr.aws/sam/build-nodejs${NODE_VERSION}.x:latest" + +echo "Successfully pulled SAM Node $NODE_VERSION docker image" diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless/src/stack.ts b/dev-packages/e2e-tests/test-applications/aws-serverless/src/stack.ts index 825c9648ee66..193a2c248741 100644 --- a/dev-packages/e2e-tests/test-applications/aws-serverless/src/stack.ts +++ b/dev-packages/e2e-tests/test-applications/aws-serverless/src/stack.ts @@ -13,7 +13,6 @@ const LAMBDA_FUNCTIONS_WITH_NPM_DIR = './src/lambda-functions-npm'; const LAMBDA_FUNCTION_TIMEOUT = 10; const LAYER_DIR = './node_modules/@sentry/aws-serverless/'; export const SAM_PORT = 3001; -const NODE_RUNTIME = `nodejs${process.version.split('.').at(0)?.replace('v', '')}.x`; export class LocalLambdaStack extends Stack { sentryLayer: CfnResource; @@ -73,14 +72,12 @@ export class LocalLambdaStack extends Stack { execFileSync('npm', ['install', '--prefix', path.join(functionsDir, lambdaDir)], { stdio: 'inherit' }); } - const isEsm = fs.existsSync(path.join(functionsDir, lambdaDir, 'index.mjs')); - new CfnResource(this, functionName, { type: 'AWS::Serverless::Function', properties: { CodeUri: path.join(functionsDir, lambdaDir), Handler: 'index.handler', - Runtime: NODE_RUNTIME, + Runtime: `nodejs${process.env.NODE_VERSION ?? '22'}.x`, Timeout: LAMBDA_FUNCTION_TIMEOUT, Layers: addLayer ? [{ Ref: this.sentryLayer.logicalId }] : undefined, Environment: { @@ -88,7 +85,7 @@ export class LocalLambdaStack extends Stack { SENTRY_DSN: dsn, SENTRY_TRACES_SAMPLE_RATE: 1.0, SENTRY_DEBUG: true, - NODE_OPTIONS: `--${isEsm ? 'import' : 'require'}=@sentry/aws-serverless/awslambda-auto`, + NODE_OPTIONS: `--import=@sentry/aws-serverless/awslambda-auto`, }, }, }, diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless/tests/lambda-fixtures.ts b/dev-packages/e2e-tests/test-applications/aws-serverless/tests/lambda-fixtures.ts index 707f808218fb..561086fcdb9d 100644 --- a/dev-packages/e2e-tests/test-applications/aws-serverless/tests/lambda-fixtures.ts +++ b/dev-packages/e2e-tests/test-applications/aws-serverless/tests/lambda-fixtures.ts @@ -29,23 +29,27 @@ export const test = base.extend<{ testEnvironment: LocalLambdaStack; lambdaClien const debugLog = tmp.fileSync({ prefix: 'sentry_aws_lambda_tests_sam_debug', postfix: '.log' }); console.log(`[test_environment fixture] Writing SAM debug log to: ${debugLog.name}`); - const process = spawn( - 'sam', - [ - 'local', - 'start-lambda', - '--debug', - '--template', - SAM_TEMPLATE_FILE, - '--warm-containers', - 'EAGER', - '--docker-network', - DOCKER_NETWORK_NAME, - ], - { - stdio: ['ignore', debugLog.fd, debugLog.fd], - }, - ); + const args = [ + 'local', + 'start-lambda', + '--debug', + '--template', + SAM_TEMPLATE_FILE, + '--warm-containers', + 'EAGER', + '--docker-network', + DOCKER_NETWORK_NAME, + ]; + + if (process.env.NODE_VERSION) { + args.push('--invoke-image', `public.ecr.aws/sam/build-nodejs${process.env.NODE_VERSION}.x:latest`); + } + + console.log(`[testEnvironment fixture] Running SAM with args: ${args.join(' ')}`); + + const samProcess = spawn('sam', args, { + stdio: ['ignore', debugLog.fd, debugLog.fd], + }); try { await LocalLambdaStack.waitForStack(); @@ -54,12 +58,12 @@ export const test = base.extend<{ testEnvironment: LocalLambdaStack; lambdaClien } finally { console.log('[testEnvironment fixture] Tearing down AWS Lambda test infrastructure'); - process.kill('SIGTERM'); + samProcess.kill('SIGTERM'); await new Promise(resolve => { - process.once('exit', resolve); + samProcess.once('exit', resolve); setTimeout(() => { - if (!process.killed) { - process.kill('SIGKILL'); + if (!samProcess.killed) { + samProcess.kill('SIGKILL'); } resolve(void 0); }, 5000); From b47b95204027fd169526570814e905722c6394a7 Mon Sep 17 00:00:00 2001 From: Martin Sonnberger Date: Tue, 26 Aug 2025 10:30:34 +0200 Subject: [PATCH 2/4] include pnpm in build-command --- .github/workflows/build.yml | 4 ++-- .../test-applications/create-next-app/package.json | 2 +- .../test-applications/create-react-app/package.json | 2 +- .../e2e-tests/test-applications/nextjs-13/package.json | 4 ++-- .../e2e-tests/test-applications/nextjs-14/package.json | 4 ++-- .../e2e-tests/test-applications/nextjs-15/package.json | 6 +++--- .../e2e-tests/test-applications/nextjs-app-dir/package.json | 6 +++--- .../test-applications/nextjs-pages-dir/package.json | 6 +++--- .../e2e-tests/test-applications/nextjs-turbo/package.json | 4 ++-- .../e2e-tests/test-applications/nuxt-3/package.json | 2 +- .../e2e-tests/test-applications/nuxt-4/package.json | 2 +- .../e2e-tests/test-applications/react-router-6/package.json | 2 +- .../test-applications/react-router-7-spa/package.json | 2 +- 13 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8a769f6aac02..41e4e5c2a3b3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -954,7 +954,7 @@ jobs: - name: Build E2E app working-directory: ${{ runner.temp }}/test-application timeout-minutes: 7 - run: pnpm ${{ matrix.build-command || 'test:build' }} + run: ${{ matrix.build-command || 'pnpm test:build' }} - name: Install Playwright uses: ./.github/actions/install-playwright @@ -1075,7 +1075,7 @@ jobs: - name: Build E2E app working-directory: ${{ runner.temp }}/test-application timeout-minutes: 7 - run: pnpm ${{ matrix.build-command || 'test:build' }} + run: ${{ matrix.build-command || 'pnpm test:build' }} - name: Install Playwright uses: ./.github/actions/install-playwright diff --git a/dev-packages/e2e-tests/test-applications/create-next-app/package.json b/dev-packages/e2e-tests/test-applications/create-next-app/package.json index 5eeac69d422e..d87aed0de03e 100644 --- a/dev-packages/e2e-tests/test-applications/create-next-app/package.json +++ b/dev-packages/e2e-tests/test-applications/create-next-app/package.json @@ -31,7 +31,7 @@ "sentryTest": { "variants": [ { - "build-command": "test:build-13", + "build-command": "pnpm test:build-13", "label": "create-next-app (next@13)" } ] diff --git a/dev-packages/e2e-tests/test-applications/create-react-app/package.json b/dev-packages/e2e-tests/test-applications/create-react-app/package.json index 981123625b96..0c2bc337d396 100644 --- a/dev-packages/e2e-tests/test-applications/create-react-app/package.json +++ b/dev-packages/e2e-tests/test-applications/create-react-app/package.json @@ -47,7 +47,7 @@ "sentryTest": { "variants": [ { - "build-command": "test:build-ts3.8", + "build-command": "pnpm test:build-ts3.8", "label": "create-react-app (TS 3.8)" } ] diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/package.json b/dev-packages/e2e-tests/test-applications/nextjs-13/package.json index ebb4d632127d..32430917ddc0 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-13/package.json @@ -32,11 +32,11 @@ "sentryTest": { "optionalVariants": [ { - "build-command": "test:build-canary", + "build-command": "pnpm test:build-canary", "label": "nextjs-13 (canary)" }, { - "build-command": "test:build-latest", + "build-command": "pnpm test:build-latest", "label": "nextjs-13 (latest)" } ] diff --git a/dev-packages/e2e-tests/test-applications/nextjs-14/package.json b/dev-packages/e2e-tests/test-applications/nextjs-14/package.json index acffda8eeed5..822d321b2028 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-14/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-14/package.json @@ -33,11 +33,11 @@ "sentryTest": { "optionalVariants": [ { - "build-command": "test:build-canary", + "build-command": "pnpm test:build-canary", "label": "nextjs-14 (canary)" }, { - "build-command": "test:build-latest", + "build-command": "pnpm test:build-latest", "label": "nextjs-14 (latest)" } ] diff --git a/dev-packages/e2e-tests/test-applications/nextjs-15/package.json b/dev-packages/e2e-tests/test-applications/nextjs-15/package.json index 063f36d3b164..052dd62697a1 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-15/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-15/package.json @@ -37,15 +37,15 @@ "sentryTest": { "optionalVariants": [ { - "build-command": "test:build-canary", + "build-command": "pnpm test:build-canary", "label": "nextjs-15 (canary)" }, { - "build-command": "test:build-latest", + "build-command": "pnpm test:build-latest", "label": "nextjs-15 (latest)" }, { - "build-command": "test:build-turbo", + "build-command": "pnpm test:build-turbo", "assert-command": "pnpm test:prod && pnpm test:dev-turbo", "label": "nextjs-15 (turbo)" } diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json index e25c4ec84053..e37e4a0c8ca3 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json @@ -36,17 +36,17 @@ "sentryTest": { "variants": [ { - "build-command": "test:build-13", + "build-command": "pnpm test:build-13", "label": "nextjs-app-dir (next@13)" } ], "optionalVariants": [ { - "build-command": "test:build-canary", + "build-command": "pnpm test:build-canary", "label": "nextjs-app-dir (canary)" }, { - "build-command": "test:build-latest", + "build-command": "pnpm test:build-latest", "label": "nextjs-app-dir (latest)" } ] diff --git a/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/package.json b/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/package.json index 03a7efd1d521..233ceb802536 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/package.json @@ -36,17 +36,17 @@ "sentryTest": { "variants": [ { - "build-command": "test:build-13", + "build-command": "pnpm test:build-13", "label": "nextjs-pages-dir (next@13)" } ], "optionalVariants": [ { - "build-command": "test:build-canary", + "build-command": "pnpm test:build-canary", "label": "nextjs-pages-dir (canary)" }, { - "build-command": "test:build-latest", + "build-command": "pnpm test:build-latest", "label": "nextjs-pages-dir (latest)" } ] diff --git a/dev-packages/e2e-tests/test-applications/nextjs-turbo/package.json b/dev-packages/e2e-tests/test-applications/nextjs-turbo/package.json index 46aba39d865c..1cfbd8eb6628 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-turbo/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-turbo/package.json @@ -34,11 +34,11 @@ "optional": true, "optionalVariants": [ { - "build-command": "test:build-canary", + "build-command": "pnpm test:build-canary", "label": "nextjs-turbo (canary)" }, { - "build-command": "test:build-latest", + "build-command": "pnpm test:build-latest", "label": "nextjs-turbo (latest)" } ] diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/package.json b/dev-packages/e2e-tests/test-applications/nuxt-3/package.json index 536043eec631..b38943d6e3eb 100644 --- a/dev-packages/e2e-tests/test-applications/nuxt-3/package.json +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/package.json @@ -27,7 +27,7 @@ "sentryTest": { "optionalVariants": [ { - "build-command": "test:build-canary", + "build-command": "pnpm test:build-canary", "label": "nuxt-3 (canary)" } ] diff --git a/dev-packages/e2e-tests/test-applications/nuxt-4/package.json b/dev-packages/e2e-tests/test-applications/nuxt-4/package.json index f73e7ff99200..a68c4c823738 100644 --- a/dev-packages/e2e-tests/test-applications/nuxt-4/package.json +++ b/dev-packages/e2e-tests/test-applications/nuxt-4/package.json @@ -30,7 +30,7 @@ "sentryTest": { "optionalVariants": [ { - "build-command": "test:build-canary", + "build-command": "pnpm test:build-canary", "label": "nuxt-4 (canary)" } ] diff --git a/dev-packages/e2e-tests/test-applications/react-router-6/package.json b/dev-packages/e2e-tests/test-applications/react-router-6/package.json index 6de1a0f9b76a..bcab38dad727 100644 --- a/dev-packages/e2e-tests/test-applications/react-router-6/package.json +++ b/dev-packages/e2e-tests/test-applications/react-router-6/package.json @@ -55,7 +55,7 @@ "sentryTest": { "variants": [ { - "build-command": "test:build-ts3.8", + "build-command": "pnpm test:build-ts3.8", "label": "react-router-6 (TS 3.8)" } ] diff --git a/dev-packages/e2e-tests/test-applications/react-router-7-spa/package.json b/dev-packages/e2e-tests/test-applications/react-router-7-spa/package.json index 41ff42c14f09..2c6bf1654cae 100644 --- a/dev-packages/e2e-tests/test-applications/react-router-7-spa/package.json +++ b/dev-packages/e2e-tests/test-applications/react-router-7-spa/package.json @@ -52,7 +52,7 @@ "sentryTest": { "variants": [ { - "build-command": "test:build-ts3.8", + "build-command": "pnpm test:build-ts3.8", "label": "react-router-7-spa (TS 3.8)" } ] From 1f790239afa9a6d317737e093dda5a93b0550783 Mon Sep 17 00:00:00 2001 From: Martin Sonnberger Date: Tue, 26 Aug 2025 10:45:50 +0200 Subject: [PATCH 3/4] increase timeout --- .../test-applications/aws-serverless/playwright.config.ts | 4 +++- .../test-applications/aws-serverless/pull-sam-image.sh | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless/playwright.config.ts b/dev-packages/e2e-tests/test-applications/aws-serverless/playwright.config.ts index 174593c307df..e47333c66e76 100644 --- a/dev-packages/e2e-tests/test-applications/aws-serverless/playwright.config.ts +++ b/dev-packages/e2e-tests/test-applications/aws-serverless/playwright.config.ts @@ -1,3 +1,5 @@ import { getPlaywrightConfig } from '@sentry-internal/test-utils'; -export default getPlaywrightConfig(); +export default getPlaywrightConfig(undefined, { + timeout: 60 * 1000 * 3, // 3 minutes +}); diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless/pull-sam-image.sh b/dev-packages/e2e-tests/test-applications/aws-serverless/pull-sam-image.sh index f9ce20556f74..0c27c1eac24d 100755 --- a/dev-packages/e2e-tests/test-applications/aws-serverless/pull-sam-image.sh +++ b/dev-packages/e2e-tests/test-applications/aws-serverless/pull-sam-image.sh @@ -10,6 +10,6 @@ if [[ -z "$NODE_VERSION" ]]; then fi echo "Pulling SAM Node $NODE_VERSION docker image..." -docker pull --platform linux/amd64 "public.ecr.aws/sam/build-nodejs${NODE_VERSION}.x:latest" +docker pull "public.ecr.aws/sam/build-nodejs${NODE_VERSION}.x:latest" echo "Successfully pulled SAM Node $NODE_VERSION docker image" From 60e6021ce033a254471db7e32f5f9b4f8b4f0bbf Mon Sep 17 00:00:00 2001 From: Martin Sonnberger Date: Tue, 26 Aug 2025 11:37:39 +0200 Subject: [PATCH 4/4] extract default node version --- .../e2e-tests/test-applications/aws-serverless/src/stack.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless/src/stack.ts b/dev-packages/e2e-tests/test-applications/aws-serverless/src/stack.ts index 193a2c248741..d23feae60811 100644 --- a/dev-packages/e2e-tests/test-applications/aws-serverless/src/stack.ts +++ b/dev-packages/e2e-tests/test-applications/aws-serverless/src/stack.ts @@ -12,6 +12,7 @@ const LAMBDA_FUNCTIONS_WITH_LAYER_DIR = './src/lambda-functions-layer'; const LAMBDA_FUNCTIONS_WITH_NPM_DIR = './src/lambda-functions-npm'; const LAMBDA_FUNCTION_TIMEOUT = 10; const LAYER_DIR = './node_modules/@sentry/aws-serverless/'; +const DEFAULT_NODE_VERSION = '22'; export const SAM_PORT = 3001; export class LocalLambdaStack extends Stack { @@ -77,7 +78,7 @@ export class LocalLambdaStack extends Stack { properties: { CodeUri: path.join(functionsDir, lambdaDir), Handler: 'index.handler', - Runtime: `nodejs${process.env.NODE_VERSION ?? '22'}.x`, + Runtime: `nodejs${process.env.NODE_VERSION ?? DEFAULT_NODE_VERSION}.x`, Timeout: LAMBDA_FUNCTION_TIMEOUT, Layers: addLayer ? [{ Ref: this.sentryLayer.logicalId }] : undefined, Environment: {