From 7baade5a8d2c22f28b25d7d3a56dcdceaef33079 Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 09:35:00 +0200 Subject: [PATCH 01/17] chore(ci): Streamline tarball packaging & e2e test matrix generation --- .github/workflows/build.yml | 83 +++++++++++-------------------- .github/workflows/ci-metadata.yml | 22 ++++++++ 2 files changed, 52 insertions(+), 53 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 544bb7900008..76229bc44ba1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -48,7 +48,7 @@ env: ${{ github.workspace }}/packages/ember/*.d.ts ${{ github.workspace }}/packages/gatsby/*.d.ts - BUILD_CACHE_TARBALL_KEY: tarball-${{ github.event.inputs.commit || github.sha }} + BUILD_TARBALL_PATH: ${{ github.workspace }}/packages/*/*.tgz # GH will use the first restore-key it finds that matches # So it will start by looking for one from the same branch, else take the newest one it can find elsewhere @@ -298,7 +298,7 @@ jobs: job_artifacts: name: Upload Artifacts - needs: [job_get_metadata, job_build] + needs: [job_get_metadata, job_build, job_build_tarballs] runs-on: ubuntu-24.04 # Build artifacts are only needed for releasing workflow. if: needs.job_get_metadata.outputs.is_release == 'true' @@ -316,8 +316,10 @@ jobs: with: dependency_cache_key: ${{ needs.job_build.outputs.dependency_cache_key }} - - name: Pack tarballs - run: yarn build:tarball + - name: Restore tarball artifacts + uses: actions/download-artifact@v7 + with: + name: tarball-output - name: Archive artifacts uses: actions/upload-artifact@v7 @@ -834,19 +836,16 @@ jobs: cd packages/remix yarn test:integration:ci - job_e2e_prepare: - name: Prepare E2E tests + job_build_tarballs: + name: Build tarballs # We want to run this if: # - The build job was successful, not skipped if: | always() && needs.job_build.result == 'success' needs: [job_get_metadata, job_build] - runs-on: ubuntu-24.04-large-js + runs-on: ubuntu-24.04 timeout-minutes: 15 - outputs: - matrix: ${{ steps.matrix.outputs.matrix }} - matrix-optional: ${{ steps.matrix-optional.outputs.matrix }} steps: - name: Check out base commit (${{ github.event.pull_request.base.sha }}) uses: actions/checkout@v6 @@ -876,33 +875,23 @@ jobs: - name: Build tarballs run: yarn build:tarball - - name: Stores tarballs in cache - uses: actions/cache/save@v5 + - name: Upload tarball artifacts + uses: actions/upload-artifact@v7 with: - path: ${{ github.workspace }}/packages/*/*.tgz - key: ${{ env.BUILD_CACHE_TARBALL_KEY }} - - - name: Determine which E2E test applications should be run - id: matrix - run: - yarn --silent ci:build-matrix --base=${{ (github.event_name == 'pull_request' && - github.event.pull_request.base.sha) || '' }} >> $GITHUB_OUTPUT - working-directory: dev-packages/e2e-tests - - - name: Determine which optional E2E test applications should be run - id: matrix-optional - run: - yarn --silent ci:build-matrix-optional --base=${{ (github.event_name == 'pull_request' && - github.event.pull_request.base.sha) || '' }} >> $GITHUB_OUTPUT - working-directory: dev-packages/e2e-tests + name: tarball-output + path: ${{ env.BUILD_TARBALL_PATH }} + retention-days: 4 + compression-level: 6 + overwrite: true job_e2e_tests: name: E2E ${{ matrix.label || matrix.test-application }} Test # We need to add the `always()` check here because the previous step has this as well :( # See: https://github.com/actions/runner/issues/2205 if: - always() && needs.job_e2e_prepare.result == 'success' && needs.job_e2e_prepare.outputs.matrix != '{"include":[]}' - needs: [job_get_metadata, job_build, job_e2e_prepare] + always() && needs.job_build_tarballs.result == 'success' && needs.job_get_metadata.outputs.e2e-matrix + !='{"include":[]}' + needs: [job_get_metadata, job_build, job_build_tarballs] runs-on: ubuntu-24.04 timeout-minutes: 15 env: @@ -916,7 +905,7 @@ jobs: E2E_TEST_SENTRY_PROJECT: 'sentry-javascript-e2e-tests' strategy: fail-fast: false - matrix: ${{ fromJson(needs.job_e2e_prepare.outputs.matrix) }} + matrix: ${{ fromJson(needs.job_get_metadata.outputs.e2e-matrix) }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v6 @@ -948,16 +937,10 @@ jobs: with: dependency_cache_key: ${{ needs.job_build.outputs.dependency_cache_key }} - - name: Restore tarball cache - uses: actions/cache/restore@v5 - id: restore-tarball-cache + - name: Restore tarball artifacts + uses: actions/download-artifact@v7 with: - path: ${{ github.workspace }}/packages/*/*.tgz - key: ${{ env.BUILD_CACHE_TARBALL_KEY }} - - - name: Build tarballs if not cached - if: steps.restore-tarball-cache.outputs.cache-hit != 'true' - run: yarn build:tarball + name: tarball-output - name: Validate Verdaccio run: yarn test:validate @@ -1022,10 +1005,10 @@ jobs: # We need to add the `always()` check here because the previous step has this as well :( # See: https://github.com/actions/runner/issues/2205 if: - always() && needs.job_get_metadata.outputs.is_release != 'true' && needs.job_e2e_prepare.result == 'success' && - needs.job_e2e_prepare.outputs.matrix-optional != '{"include":[]}' && (github.event_name != 'pull_request' || + always() && needs.job_get_metadata.outputs.is_release != 'true' && needs.job_build_tarballs.result == 'success' && + needs.job_get_metadata.outputs.e2e-matrix-optional != '{"include":[]}' && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && github.actor != 'dependabot[bot]' - needs: [job_get_metadata, job_build, job_e2e_prepare] + needs: [job_get_metadata, job_build, job_build_tarballs] runs-on: ubuntu-24.04 timeout-minutes: 15 env: @@ -1039,7 +1022,7 @@ jobs: E2E_TEST_SENTRY_PROJECT: 'sentry-javascript-e2e-tests' strategy: fail-fast: false - matrix: ${{ fromJson(needs.job_e2e_prepare.outputs.matrix-optional) }} + matrix: ${{ fromJson(needs.job_get_metadata.outputs.e2e-matrix-optional) }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) @@ -1058,16 +1041,10 @@ jobs: with: dependency_cache_key: ${{ needs.job_build.outputs.dependency_cache_key }} - - name: Restore tarball cache - uses: actions/cache/restore@v5 - id: restore-tarball-cache + - name: Restore tarball artifacts + uses: actions/download-artifact@v7 with: - path: ${{ github.workspace }}/packages/*/*.tgz - key: ${{ env.BUILD_CACHE_TARBALL_KEY }} - - - name: Build tarballs if not cached - if: steps.restore-tarball-cache.outputs.cache-hit != 'true' - run: yarn build:tarball + name: tarball-output - name: Validate Verdaccio run: yarn test:validate diff --git a/.github/workflows/ci-metadata.yml b/.github/workflows/ci-metadata.yml index 0f39590bf167..b46e6bdb3f04 100644 --- a/.github/workflows/ci-metadata.yml +++ b/.github/workflows/ci-metadata.yml @@ -31,6 +31,12 @@ on: force_skip_cache: description: 'Whether to skip caching (schedule or ci-skip-cache label)' value: ${{ jobs.get_metadata.outputs.force_skip_cache }} + e2e-matrix: + description: 'The matrix of E2E test applications to run' + value: ${{ jobs.get_metadata.outputs.e2e-matrix }} + e2e-matrix-optional: + description: 'The matrix of optional E2E test applications to run' + value: ${{ jobs.get_metadata.outputs.e2e-matrix-optional }} jobs: get_metadata: @@ -70,6 +76,20 @@ jobs: any_code: - '!**/*.md' + - name: Determine which test applications should be run + id: matrix + run: + yarn --silent ci:build-matrix --base=${{ (github.event_name == 'pull_request' && + github.event.pull_request.base.sha) || '' }} >> $GITHUB_OUTPUT + working-directory: dev-packages/e2e-tests + + - name: Determine which optional E2E test applications should be run + id: matrix-optional + run: + yarn --silent ci:build-matrix-optional --base=${{ (github.event_name == 'pull_request' && + github.event.pull_request.base.sha) || '' }} >> $GITHUB_OUTPUT + working-directory: dev-packages/e2e-tests + outputs: commit_label: '${{ env.COMMIT_SHA }}: ${{ env.COMMIT_MESSAGE }}' # Note: These next three have to be checked as strings ('true'/'false')! @@ -87,3 +107,5 @@ jobs: force_skip_cache: ${{ github.event_name == 'schedule' || (github.event_name == 'pull_request' && contains(toJSON(github.event.pull_request.labels.*.name), 'ci-skip-cache')) }} + e2e-matrix: ${{ steps.matrix.outputs.matrix }} + e2e-matrix-optional: ${{ steps.matrix-optional.outputs.matrix }} From fdd76e59405a21e75d07c987de76764e8daac20e Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 10:03:16 +0200 Subject: [PATCH 02/17] use npx for test matrix thing --- dev-packages/e2e-tests/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-packages/e2e-tests/package.json b/dev-packages/e2e-tests/package.json index ac1f7ddf23f7..672fe162cb27 100644 --- a/dev-packages/e2e-tests/package.json +++ b/dev-packages/e2e-tests/package.json @@ -15,8 +15,8 @@ "test:validate": "run-s test:validate-configuration test:validate-test-app-setups", "clean:verdaccio": "sh -c 'pkill -f verdaccio-runner.mjs 2>/dev/null || true'", "clean": "yarn clean:verdaccio && rimraf tmp node_modules verdaccio-config/storage && yarn clean:test-applications && yarn clean:pnpm", - "ci:build-matrix": "ts-node ./lib/getTestMatrix.ts", - "ci:build-matrix-optional": "ts-node ./lib/getTestMatrix.ts --optional=true", + "ci:build-matrix": "npx ts-node ./lib/getTestMatrix.ts", + "ci:build-matrix-optional": "npx ts-node ./lib/getTestMatrix.ts --optional=true", "ci:copy-to-temp": "ts-node ./ciCopyToTemp.ts", "clean:test-applications": "rimraf --glob test-applications/**/{node_modules,dist,build,.next,.nuxt,.sveltekit,.react-router,.astro,.output,pnpm-lock.yaml,.last-run.json,test-results,.angular,event-dumps}", "clean:pnpm": "pnpm store prune" From 5e1c807eebcec9c921d2d1863bf32604f506d17e Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 10:07:32 +0200 Subject: [PATCH 03/17] avoid glob usage so no dependencies are needed --- dev-packages/e2e-tests/lib/getTestMatrix.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/dev-packages/e2e-tests/lib/getTestMatrix.ts b/dev-packages/e2e-tests/lib/getTestMatrix.ts index 86a4bda3e701..cd561de39ee2 100644 --- a/dev-packages/e2e-tests/lib/getTestMatrix.ts +++ b/dev-packages/e2e-tests/lib/getTestMatrix.ts @@ -1,8 +1,6 @@ import { execSync } from 'child_process'; import * as fs from 'fs'; -import { sync as globSync } from 'glob'; import * as path from 'path'; -import { dirname } from 'path'; import { parseArgs } from 'util'; interface MatrixInclude { @@ -52,9 +50,7 @@ function run(): void { // eslint-disable-next-line no-console console.error(`Parsed command line arguments: base=${base}, head=${head}, optional=${optional}`); - const testApplications = globSync('*/package.json', { - cwd: `${__dirname}/../test-applications`, - }).map(filePath => dirname(filePath)); + const testApplications = discoverTestApplicationDirs(); // For GitHub Action debugging (using stderr the 'matrix=...' output is not polluted) // eslint-disable-next-line no-console @@ -78,6 +74,17 @@ function run(): void { console.log(`matrix=${JSON.stringify({ include: includes })}`); } +/** Direct children of `test-applications/` that contain a `package.json` (replaces glob one-segment + package.json). */ +function discoverTestApplicationDirs(): string[] { + const appsRoot = path.join(__dirname, '..', 'test-applications'); + return fs + .readdirSync(appsRoot, { withFileTypes: true }) + .filter(entry => entry.isDirectory()) + .map(entry => entry.name) + .filter(name => fs.existsSync(path.join(appsRoot, name, 'package.json'))) + .sort(); +} + function addIncludesForTestApp( testApp: string, includes: MatrixInclude[], From da2745b415d3deb16300abb2b2a9cc15e2587f2b Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 10:19:41 +0200 Subject: [PATCH 04/17] avoid ts dependency for test matrix --- dev-packages/e2e-tests/README.md | 2 +- .../{getTestMatrix.ts => getTestMatrix.mjs} | 70 ++++++------------- dev-packages/e2e-tests/package.json | 4 +- 3 files changed, 23 insertions(+), 53 deletions(-) rename dev-packages/e2e-tests/lib/{getTestMatrix.ts => getTestMatrix.mjs} (76%) diff --git a/dev-packages/e2e-tests/README.md b/dev-packages/e2e-tests/README.md index 15de0fd49ee0..2ff4b0665cd3 100644 --- a/dev-packages/e2e-tests/README.md +++ b/dev-packages/e2e-tests/README.md @@ -198,7 +198,7 @@ try { ``` Test apps in the folder `test-applications` will be automatically picked up by CI in the job `job_e2e_tests` (in `.github/workflows/build.yml`). -The test matrix for CI is generated in `dev-packages/e2e-tests/lib/getTestMatrix.ts`. +The test matrix for CI is generated in `dev-packages/e2e-tests/lib/getTestMatrix.mjs`. For each test app, CI checks its dependencies (and devDependencies) to see if any of them have changed in the current PR (based on nx affected projects). For example, if something is changed in the browser package, only E2E test apps that depend on browser will run, while others will be skipped. diff --git a/dev-packages/e2e-tests/lib/getTestMatrix.ts b/dev-packages/e2e-tests/lib/getTestMatrix.mjs similarity index 76% rename from dev-packages/e2e-tests/lib/getTestMatrix.ts rename to dev-packages/e2e-tests/lib/getTestMatrix.mjs index cd561de39ee2..b8be7af5f528 100644 --- a/dev-packages/e2e-tests/lib/getTestMatrix.ts +++ b/dev-packages/e2e-tests/lib/getTestMatrix.mjs @@ -1,40 +1,21 @@ -import { execSync } from 'child_process'; -import * as fs from 'fs'; -import * as path from 'path'; -import { parseArgs } from 'util'; - -interface MatrixInclude { - /** The test application (directory) name. */ - 'test-application': string; - /** Optional override for the build command to run. */ - 'build-command'?: string; - /** Optional override for the assert command to run. */ - 'assert-command'?: string; - /** Optional label for the test run. If not set, defaults to value of `test-application`. */ - label?: string; -} +import { execSync } from 'node:child_process'; +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { parseArgs } from 'node:util'; -interface PackageJsonSentryTestConfig { - /** If this is true, the test app is optional. */ - optional?: boolean; - /** Variant configs that should be run in non-optional test runs. */ - variants?: Partial[]; - /** Variant configs that should be run in optional test runs. */ - optionalVariants?: Partial[]; - /** Skip this test app for matrix generation. */ - skip?: boolean; -} +const __dirname = path.dirname(fileURLToPath(import.meta.url)); /** - * This methods generates a matrix for the GitHub Actions workflow to run the E2E tests. - * It checks which test applications are affected by the current changes in the PR and then generates a matrix + * Generates a matrix for the GitHub Actions workflow to run the E2E tests. + * Checks which test applications are affected by the current changes in the PR and then generates a matrix * including all test apps that have at least one dependency that was changed in the PR. * If no `--base=xxx` is provided, it will output all test applications. * * If `--optional=true` is set, it will generate a matrix of optional test applications only. * Otherwise, these will be skipped. */ -function run(): void { +function run() { const { values } = parseArgs({ args: process.argv.slice(2), options: { @@ -63,7 +44,7 @@ function run(): void { : testApplications; const optionalMode = optional === 'true'; - const includes: MatrixInclude[] = []; + const includes = []; includedTestApplications.forEach(testApp => { addIncludesForTestApp(testApp, includes, { optionalMode }); @@ -75,7 +56,7 @@ function run(): void { } /** Direct children of `test-applications/` that contain a `package.json` (replaces glob one-segment + package.json). */ -function discoverTestApplicationDirs(): string[] { +function discoverTestApplicationDirs() { const appsRoot = path.join(__dirname, '..', 'test-applications'); return fs .readdirSync(appsRoot, { withFileTypes: true }) @@ -85,11 +66,7 @@ function discoverTestApplicationDirs(): string[] { .sort(); } -function addIncludesForTestApp( - testApp: string, - includes: MatrixInclude[], - { optionalMode }: { optionalMode: boolean }, -): void { +function addIncludesForTestApp(testApp, includes, { optionalMode }) { const packageJson = getPackageJson(testApp); const shouldSkip = packageJson.sentryTest?.skip || false; @@ -115,7 +92,7 @@ function addIncludesForTestApp( }); } -function getSentryDependencies(appName: string): string[] { +function getSentryDependencies(appName) { const packageJson = getPackageJson(appName); const dependencies = { @@ -126,11 +103,7 @@ function getSentryDependencies(appName: string): string[] { return Object.keys(dependencies).filter(key => key.startsWith('@sentry')); } -function getPackageJson(appName: string): { - dependencies?: { [key: string]: string }; - devDependencies?: { [key: string]: string }; - sentryTest?: PackageJsonSentryTestConfig; -} { +function getPackageJson(appName) { const fullPath = path.resolve(__dirname, '..', 'test-applications', appName, 'package.json'); if (!fs.existsSync(fullPath)) { @@ -140,19 +113,14 @@ function getPackageJson(appName: string): { return JSON.parse(fs.readFileSync(fullPath, 'utf8')); } -run(); - -function getAffectedTestApplications( - testApplications: string[], - { base = 'develop', head }: { base?: string; head?: string }, -): string[] { +function getAffectedTestApplications(testApplications, { base = 'develop', head }) { const additionalArgs = [`--base=${base}`]; if (head) { additionalArgs.push(`--head=${head}`); } - let affectedProjects: string[] = []; + let affectedProjects = []; try { affectedProjects = execSync(`yarn --silent nx show projects --affected ${additionalArgs.join(' ')}`) .toString() @@ -208,7 +176,7 @@ function getAffectedTestApplications( return Array.from(testAppsToRun); } -function getChangedTestApps(base: string, head?: string): false | Set { +function getChangedTestApps(base, head) { const changedFiles = execSync(`git diff --name-only ${base}${head ? `..${head}` : ''} -- .`, { encoding: 'utf-8', }) @@ -221,7 +189,7 @@ function getChangedTestApps(base: string, head?: string): false | Set { // eslint-disable-next-line no-console console.error(`Changed files since ${base}${head ? `..${head}` : ''}: ${JSON.stringify(changedFiles)}`); - const changedTestApps: Set = new Set(); + const changedTestApps = new Set(); const testAppsPrefix = 'dev-packages/e2e-tests/test-applications/'; for (const file of changedFiles) { @@ -240,3 +208,5 @@ function getChangedTestApps(base: string, head?: string): false | Set { return changedTestApps; } + +run(); diff --git a/dev-packages/e2e-tests/package.json b/dev-packages/e2e-tests/package.json index 672fe162cb27..14f746e12b0a 100644 --- a/dev-packages/e2e-tests/package.json +++ b/dev-packages/e2e-tests/package.json @@ -15,8 +15,8 @@ "test:validate": "run-s test:validate-configuration test:validate-test-app-setups", "clean:verdaccio": "sh -c 'pkill -f verdaccio-runner.mjs 2>/dev/null || true'", "clean": "yarn clean:verdaccio && rimraf tmp node_modules verdaccio-config/storage && yarn clean:test-applications && yarn clean:pnpm", - "ci:build-matrix": "npx ts-node ./lib/getTestMatrix.ts", - "ci:build-matrix-optional": "npx ts-node ./lib/getTestMatrix.ts --optional=true", + "ci:build-matrix": "node ./lib/getTestMatrix.mjs", + "ci:build-matrix-optional": "node ./lib/getTestMatrix.mjs --optional=true", "ci:copy-to-temp": "ts-node ./ciCopyToTemp.ts", "clean:test-applications": "rimraf --glob test-applications/**/{node_modules,dist,build,.next,.nuxt,.sveltekit,.react-router,.astro,.output,pnpm-lock.yaml,.last-run.json,test-results,.angular,event-dumps}", "clean:pnpm": "pnpm store prune" From 1692ea2f28447f6a7253839f45a081510b0f4d28 Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 10:28:00 +0200 Subject: [PATCH 05/17] use nx command via npx use correct nx version fix linting --- dev-packages/e2e-tests/lib/getTestMatrix.mjs | 22 +++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/dev-packages/e2e-tests/lib/getTestMatrix.mjs b/dev-packages/e2e-tests/lib/getTestMatrix.mjs index b8be7af5f528..7e1d34b91c3f 100644 --- a/dev-packages/e2e-tests/lib/getTestMatrix.mjs +++ b/dev-packages/e2e-tests/lib/getTestMatrix.mjs @@ -5,6 +5,18 @@ import { fileURLToPath } from 'node:url'; import { parseArgs } from 'node:util'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); +/** Repository root (this file lives in dev-packages/e2e-tests/lib/). */ +const REPO_ROOT = path.resolve(__dirname, '..', '..', '..'); + +/** Nx semver from root `package.json` (no `yarn install` required for matrix generation). */ +function getPinnedNxVersion() { + const rootPkg = JSON.parse(fs.readFileSync(path.join(REPO_ROOT, 'package.json'), 'utf8')); + const raw = rootPkg.devDependencies?.nx ?? rootPkg.dependencies?.nx; + if (typeof raw !== 'string') { + throw new Error('Root package.json must declare nx in devDependencies or dependencies'); + } + return raw.replace(/^[\^~>=<]/, ''); +} /** * Generates a matrix for the GitHub Actions workflow to run the E2E tests. @@ -122,8 +134,12 @@ function getAffectedTestApplications(testApplications, { base = 'develop', head let affectedProjects = []; try { - affectedProjects = execSync(`yarn --silent nx show projects --affected ${additionalArgs.join(' ')}`) - .toString() + // CI may run this before `yarn install`; use npx with the same major.minor.patch as root package.json. + const nxVersion = getPinnedNxVersion(); + affectedProjects = execSync(`npx --yes nx@${nxVersion} show projects --affected ${additionalArgs.join(' ')}`, { + cwd: REPO_ROOT, + encoding: 'utf-8', + }) .split('\n') .map(line => line.trim()) .filter(Boolean); @@ -178,9 +194,9 @@ function getAffectedTestApplications(testApplications, { base = 'develop', head function getChangedTestApps(base, head) { const changedFiles = execSync(`git diff --name-only ${base}${head ? `..${head}` : ''} -- .`, { + cwd: REPO_ROOT, encoding: 'utf-8', }) - .toString() .split('\n') .map(line => line.trim()) .filter(Boolean); From ce7bdfb7a821807aaa520209521e9674932e60a7 Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 10:55:40 +0200 Subject: [PATCH 06/17] Revert "use nx command via npx" This reverts commit e2107f099dffb763fcdd95717ffe8b4ba7b7e002. --- dev-packages/e2e-tests/lib/getTestMatrix.mjs | 22 +++----------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/dev-packages/e2e-tests/lib/getTestMatrix.mjs b/dev-packages/e2e-tests/lib/getTestMatrix.mjs index 7e1d34b91c3f..b8be7af5f528 100644 --- a/dev-packages/e2e-tests/lib/getTestMatrix.mjs +++ b/dev-packages/e2e-tests/lib/getTestMatrix.mjs @@ -5,18 +5,6 @@ import { fileURLToPath } from 'node:url'; import { parseArgs } from 'node:util'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); -/** Repository root (this file lives in dev-packages/e2e-tests/lib/). */ -const REPO_ROOT = path.resolve(__dirname, '..', '..', '..'); - -/** Nx semver from root `package.json` (no `yarn install` required for matrix generation). */ -function getPinnedNxVersion() { - const rootPkg = JSON.parse(fs.readFileSync(path.join(REPO_ROOT, 'package.json'), 'utf8')); - const raw = rootPkg.devDependencies?.nx ?? rootPkg.dependencies?.nx; - if (typeof raw !== 'string') { - throw new Error('Root package.json must declare nx in devDependencies or dependencies'); - } - return raw.replace(/^[\^~>=<]/, ''); -} /** * Generates a matrix for the GitHub Actions workflow to run the E2E tests. @@ -134,12 +122,8 @@ function getAffectedTestApplications(testApplications, { base = 'develop', head let affectedProjects = []; try { - // CI may run this before `yarn install`; use npx with the same major.minor.patch as root package.json. - const nxVersion = getPinnedNxVersion(); - affectedProjects = execSync(`npx --yes nx@${nxVersion} show projects --affected ${additionalArgs.join(' ')}`, { - cwd: REPO_ROOT, - encoding: 'utf-8', - }) + affectedProjects = execSync(`yarn --silent nx show projects --affected ${additionalArgs.join(' ')}`) + .toString() .split('\n') .map(line => line.trim()) .filter(Boolean); @@ -194,9 +178,9 @@ function getAffectedTestApplications(testApplications, { base = 'develop', head function getChangedTestApps(base, head) { const changedFiles = execSync(`git diff --name-only ${base}${head ? `..${head}` : ''} -- .`, { - cwd: REPO_ROOT, encoding: 'utf-8', }) + .toString() .split('\n') .map(line => line.trim()) .filter(Boolean); From 671ee8d490e4b460f6c3488c7619d3fe6f168d70 Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 10:58:39 +0200 Subject: [PATCH 07/17] run it in build step --- .github/workflows/build.yml | 24 ++++++++++++++++++++---- .github/workflows/ci-metadata.yml | 22 ---------------------- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 76229bc44ba1..a82fca34a520 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -138,6 +138,20 @@ jobs: compression-level: 6 overwrite: true + - name: Determine which test applications should be run + id: matrix + run: + yarn --silent ci:build-matrix --base=${{ (github.event_name == 'pull_request' && + github.event.pull_request.base.sha) || '' }} >> $GITHUB_OUTPUT + working-directory: dev-packages/e2e-tests + + - name: Determine which optional E2E test applications should be run + id: matrix-optional + run: + yarn --silent ci:build-matrix-optional --base=${{ (github.event_name == 'pull_request' && + github.event.pull_request.base.sha) || '' }} >> $GITHUB_OUTPUT + working-directory: dev-packages/e2e-tests + outputs: dependency_cache_key: ${{ steps.install_dependencies.outputs.cache_key }} changed_node_integration: @@ -164,6 +178,8 @@ jobs: changed_browser_integration: ${{ needs.job_get_metadata.outputs.changed_ci == 'true' || contains(steps.checkForAffected.outputs.affected, '@sentry-internal/browser-integration-tests') }} + e2e-matrix: ${{ steps.matrix.outputs.matrix }} + e2e-matrix-optional: ${{ steps.matrix-optional.outputs.matrix }} job_check_branches: name: Check PR branches @@ -889,7 +905,7 @@ jobs: # We need to add the `always()` check here because the previous step has this as well :( # See: https://github.com/actions/runner/issues/2205 if: - always() && needs.job_build_tarballs.result == 'success' && needs.job_get_metadata.outputs.e2e-matrix + always() && needs.job_build_tarballs.result == 'success' && needs.job_build.outputs.e2e-matrix !='{"include":[]}' needs: [job_get_metadata, job_build, job_build_tarballs] runs-on: ubuntu-24.04 @@ -905,7 +921,7 @@ jobs: E2E_TEST_SENTRY_PROJECT: 'sentry-javascript-e2e-tests' strategy: fail-fast: false - matrix: ${{ fromJson(needs.job_get_metadata.outputs.e2e-matrix) }} + matrix: ${{ fromJson(needs.job_build.outputs.e2e-matrix) }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v6 @@ -1006,7 +1022,7 @@ jobs: # See: https://github.com/actions/runner/issues/2205 if: always() && needs.job_get_metadata.outputs.is_release != 'true' && needs.job_build_tarballs.result == 'success' && - needs.job_get_metadata.outputs.e2e-matrix-optional != '{"include":[]}' && (github.event_name != 'pull_request' || + needs.job_build.outputs.e2e-matrix-optional != '{"include":[]}' && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && github.actor != 'dependabot[bot]' needs: [job_get_metadata, job_build, job_build_tarballs] runs-on: ubuntu-24.04 @@ -1022,7 +1038,7 @@ jobs: E2E_TEST_SENTRY_PROJECT: 'sentry-javascript-e2e-tests' strategy: fail-fast: false - matrix: ${{ fromJson(needs.job_get_metadata.outputs.e2e-matrix-optional) }} + matrix: ${{ fromJson(needs.job_build.outputs.e2e-matrix-optional) }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) diff --git a/.github/workflows/ci-metadata.yml b/.github/workflows/ci-metadata.yml index b46e6bdb3f04..0f39590bf167 100644 --- a/.github/workflows/ci-metadata.yml +++ b/.github/workflows/ci-metadata.yml @@ -31,12 +31,6 @@ on: force_skip_cache: description: 'Whether to skip caching (schedule or ci-skip-cache label)' value: ${{ jobs.get_metadata.outputs.force_skip_cache }} - e2e-matrix: - description: 'The matrix of E2E test applications to run' - value: ${{ jobs.get_metadata.outputs.e2e-matrix }} - e2e-matrix-optional: - description: 'The matrix of optional E2E test applications to run' - value: ${{ jobs.get_metadata.outputs.e2e-matrix-optional }} jobs: get_metadata: @@ -76,20 +70,6 @@ jobs: any_code: - '!**/*.md' - - name: Determine which test applications should be run - id: matrix - run: - yarn --silent ci:build-matrix --base=${{ (github.event_name == 'pull_request' && - github.event.pull_request.base.sha) || '' }} >> $GITHUB_OUTPUT - working-directory: dev-packages/e2e-tests - - - name: Determine which optional E2E test applications should be run - id: matrix-optional - run: - yarn --silent ci:build-matrix-optional --base=${{ (github.event_name == 'pull_request' && - github.event.pull_request.base.sha) || '' }} >> $GITHUB_OUTPUT - working-directory: dev-packages/e2e-tests - outputs: commit_label: '${{ env.COMMIT_SHA }}: ${{ env.COMMIT_MESSAGE }}' # Note: These next three have to be checked as strings ('true'/'false')! @@ -107,5 +87,3 @@ jobs: force_skip_cache: ${{ github.event_name == 'schedule' || (github.event_name == 'pull_request' && contains(toJSON(github.event.pull_request.labels.*.name), 'ci-skip-cache')) }} - e2e-matrix: ${{ steps.matrix.outputs.matrix }} - e2e-matrix-optional: ${{ steps.matrix-optional.outputs.matrix }} From a1255ff3e9ed13b8853a80e2887ec42202ad3d2f Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 11:05:35 +0200 Subject: [PATCH 08/17] fix linting --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a82fca34a520..df351b2fdb7d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -905,8 +905,7 @@ jobs: # We need to add the `always()` check here because the previous step has this as well :( # See: https://github.com/actions/runner/issues/2205 if: - always() && needs.job_build_tarballs.result == 'success' && needs.job_build.outputs.e2e-matrix - !='{"include":[]}' + always() && needs.job_build_tarballs.result == 'success' && needs.job_build.outputs.e2e-matrix !='{"include":[]}' needs: [job_get_metadata, job_build, job_build_tarballs] runs-on: ubuntu-24.04 timeout-minutes: 15 From 83b0c74bf887b97f89bd2dc5b7a89409d4d7d2c9 Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 11:45:53 +0200 Subject: [PATCH 09/17] better path handling for artifacts --- .github/workflows/build.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index df351b2fdb7d..04890c109339 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -48,7 +48,11 @@ env: ${{ github.workspace }}/packages/ember/*.d.ts ${{ github.workspace }}/packages/gatsby/*.d.ts - BUILD_TARBALL_PATH: ${{ github.workspace }}/packages/*/*.tgz + # upload-artifact globs drop the path through the first `*` (see upload-artifact + # README). Tarballs therefore land in the artifact as /*.tgz; download + # tarball-output into packages/ so they resolve to packages//*.tgz. + TARBALL_ARTIFACT_GLOB: packages/*/*.tgz + TARBALL_ARTIFACT_DOWNLOAD_PATH: ${{ github.workspace }}/packages # GH will use the first restore-key it finds that matches # So it will start by looking for one from the same branch, else take the newest one it can find elsewhere @@ -336,6 +340,7 @@ jobs: uses: actions/download-artifact@v7 with: name: tarball-output + path: ${{ env.TARBALL_ARTIFACT_DOWNLOAD_PATH }} - name: Archive artifacts uses: actions/upload-artifact@v7 @@ -895,7 +900,8 @@ jobs: uses: actions/upload-artifact@v7 with: name: tarball-output - path: ${{ env.BUILD_TARBALL_PATH }} + path: ${{ env.TARBALL_ARTIFACT_GLOB }} + if-no-files-found: error retention-days: 4 compression-level: 6 overwrite: true @@ -956,6 +962,7 @@ jobs: uses: actions/download-artifact@v7 with: name: tarball-output + path: ${{ env.TARBALL_ARTIFACT_DOWNLOAD_PATH }} - name: Validate Verdaccio run: yarn test:validate @@ -1060,6 +1067,7 @@ jobs: uses: actions/download-artifact@v7 with: name: tarball-output + path: ${{ env.TARBALL_ARTIFACT_DOWNLOAD_PATH }} - name: Validate Verdaccio run: yarn test:validate From ef6a087b13f814a805425112a6b0570897e7804e Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 14:46:09 +0200 Subject: [PATCH 10/17] better nx cache --- .github/workflows/build.yml | 40 ++++++++++++------------------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 04890c109339..8c781efba2d2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -54,13 +54,8 @@ env: TARBALL_ARTIFACT_GLOB: packages/*/*.tgz TARBALL_ARTIFACT_DOWNLOAD_PATH: ${{ github.workspace }}/packages - # GH will use the first restore-key it finds that matches - # So it will start by looking for one from the same branch, else take the newest one it can find elsewhere - # We want to prefer the cache from the current develop branch, if we don't find any on the current branch - NX_CACHE_RESTORE_KEYS: | - nx-Linux-${{ github.ref }}-${{ github.event.inputs.commit || github.sha }} - nx-Linux-${{ github.ref }} - nx-Linux + # Ensure we only cache nx per-commit, so we do not cross-contaminate it + NX_CACHE_KEY: nx-Linux-${{ github.ref }}-${{ github.event.inputs.commit || github.sha }} # https://bsky.app/profile/joyeecheung.bsky.social/post/3lhy6o54fo22h # Apparently some of our CI failures are attributable to a corrupt v8 cache, causing v8 failures with: "Check failed: current == end_slot_index.". @@ -114,25 +109,17 @@ jobs: base: ${{ github.event.pull_request.base.sha }} head: ${{ env.HEAD_COMMIT }} - - name: NX cache - uses: actions/cache@v5 - # Disable cache when: - # - on release branches - # - when PR has `ci-skip-cache` label or on nightly builds - if: | - needs.job_get_metadata.outputs.is_release == 'false' && - needs.job_get_metadata.outputs.force_skip_cache == 'false' - with: - path: .nxcache - key: nx-Linux-${{ github.ref }}-${{ env.HEAD_COMMIT || github.sha }} - # On develop branch, we want to _store_ the cache (so it can be used by other branches), but never _restore_ from it - restore-keys: - ${{needs.job_get_metadata.outputs.is_base_branch == 'false' && env.NX_CACHE_RESTORE_KEYS || - 'nx-never-restore'}} - - name: Build packages run: yarn build + - name: Store NX cache + uses: actions/cache/save@v5 + # Only cache this per-PR to speed up CI. + if: github.event_name == 'pull_request' + with: + path: .nxcache + key: ${{ env.NX_CACHE_KEY }} + - name: Upload build artifacts uses: actions/upload-artifact@v7 with: @@ -885,13 +872,12 @@ jobs: uses: ./.github/actions/restore-cache with: dependency_cache_key: ${{ needs.job_build.outputs.dependency_cache_key }} - - name: NX cache + + - name: Restore NX cache uses: actions/cache/restore@v5 with: path: .nxcache - key: nx-Linux-${{ github.ref }}-${{ env.HEAD_COMMIT }} - # On develop branch, we want to _store_ the cache (so it can be used by other branches), but never _restore_ from it - restore-keys: ${{ env.NX_CACHE_RESTORE_KEYS }} + key: ${{ env.NX_CACHE_KEY }} - name: Build tarballs run: yarn build:tarball From c9e68ac6e10817dc3b1be528df2ef1962c085cb5 Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 14:51:50 +0200 Subject: [PATCH 11/17] cache per-branch --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8c781efba2d2..f3fe45c075bc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -54,8 +54,8 @@ env: TARBALL_ARTIFACT_GLOB: packages/*/*.tgz TARBALL_ARTIFACT_DOWNLOAD_PATH: ${{ github.workspace }}/packages - # Ensure we only cache nx per-commit, so we do not cross-contaminate it - NX_CACHE_KEY: nx-Linux-${{ github.ref }}-${{ github.event.inputs.commit || github.sha }} + # We cache NX per-PR for faster CI, other than this we do not want to rely on it + NX_CACHE_KEY: nx-Linux-${{ github.ref }} # https://bsky.app/profile/joyeecheung.bsky.social/post/3lhy6o54fo22h # Apparently some of our CI failures are attributable to a corrupt v8 cache, causing v8 failures with: "Check failed: current == end_slot_index.". From 8c7335bba6d145200d66d73e780ea4e867d1ed7d Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 14:57:48 +0200 Subject: [PATCH 12/17] reset cache before storing it??? --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f3fe45c075bc..b5597e5affb0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -109,6 +109,9 @@ jobs: base: ${{ github.event.pull_request.base.sha }} head: ${{ env.HEAD_COMMIT }} + - name: Cleanup NX cache + run: yarn nx reset + - name: Build packages run: yarn build From ee7781c7e58758d30313d25737d0bb64f7d55e8b Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 15:00:43 +0200 Subject: [PATCH 13/17] store cache in .nx and cache this?? --- .github/workflows/build.yml | 6 +++--- nx.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b5597e5affb0..9e5f71bbb72d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -120,7 +120,7 @@ jobs: # Only cache this per-PR to speed up CI. if: github.event_name == 'pull_request' with: - path: .nxcache + path: .nx key: ${{ env.NX_CACHE_KEY }} - name: Upload build artifacts @@ -675,7 +675,7 @@ jobs: dependency_cache_key: ${{ needs.job_build.outputs.dependency_cache_key }} - name: Check for dts files that reference stuff in the temporary build folder run: | - if grep -r --include "*.d.ts" --exclude-dir ".nxcache" 'import("@sentry(-internal)?/[^/]*/build' .; then + if grep -r --include "*.d.ts" --exclude-dir ".nx" 'import("@sentry(-internal)?/[^/]*/build' .; then echo "Found illegal TypeScript import statement." exit 1 fi @@ -879,7 +879,7 @@ jobs: - name: Restore NX cache uses: actions/cache/restore@v5 with: - path: .nxcache + path: .nx key: ${{ env.NX_CACHE_KEY }} - name: Build tarballs diff --git a/nx.json b/nx.json index 7cd807e089fb..08faf7cf2e62 100644 --- a/nx.json +++ b/nx.json @@ -61,7 +61,7 @@ } }, "$schema": "./node_modules/nx/schemas/nx-schema.json", - "cacheDirectory": ".nxcache", + "cacheDirectory": ".nx/cache", "tui": { "autoExit": true }, From a3c9b204b17ffc7479615cc349bfb87be95c4203 Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 16:41:53 +0200 Subject: [PATCH 14/17] no need to reset cache --- .github/workflows/build.yml | 3 --- .github/workflows/flaky-test-detector.yml | 12 ++++-------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9e5f71bbb72d..6a1acd31bee2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -109,9 +109,6 @@ jobs: base: ${{ github.event.pull_request.base.sha }} head: ${{ env.HEAD_COMMIT }} - - name: Cleanup NX cache - run: yarn nx reset - - name: Build packages run: yarn build diff --git a/.github/workflows/flaky-test-detector.yml b/.github/workflows/flaky-test-detector.yml index c0a8f1f720b1..973c3e296cdc 100644 --- a/.github/workflows/flaky-test-detector.yml +++ b/.github/workflows/flaky-test-detector.yml @@ -10,10 +10,7 @@ on: env: HEAD_COMMIT: ${{ github.event.inputs.commit || github.sha }} - NX_CACHE_RESTORE_KEYS: | - nx-Linux-${{ github.ref }}-${{ github.event.inputs.commit || github.sha }} - nx-Linux-${{ github.ref }} - nx-Linux + NX_CACHE_KEY: nx-Linux-${{ github.ref }} # Cancel in progress workflows on pull_requests. # https://docs.github.com/en/actions/using-jobs/using-concurrency#example-using-a-fallback-value @@ -39,12 +36,11 @@ jobs: - name: Install dependencies run: yarn install --ignore-engines --frozen-lockfile - - name: NX cache + - name: Restore NX cache uses: actions/cache/restore@v5 with: - path: .nxcache - key: nx-Linux-${{ github.ref }}-${{ env.HEAD_COMMIT }} - restore-keys: ${{ env.NX_CACHE_RESTORE_KEYS }} + path: .nx + key: ${{ env.NX_CACHE_KEY }} - name: Build packages run: yarn build From 4fa3cc45c24704bbeb0e2c121080775714a405d2 Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 16:42:05 +0200 Subject: [PATCH 15/17] fix types cache for nestjs --- packages/nestjs/package.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/nestjs/package.json b/packages/nestjs/package.json index 625f8330a65f..29c313fc292f 100644 --- a/packages/nestjs/package.json +++ b/packages/nestjs/package.json @@ -85,5 +85,19 @@ "volta": { "extends": "../../package.json" }, + "nx": { + "targets": { + "build:types": { + "inputs": ["production", "^production"], + "dependsOn": ["^build:types"], + "outputs": [ + "{projectRoot}/build/types", + "{projectRoot}/build/types-ts3.8", + "{projectRoot}/*.d.ts" + ], + "cache": true + } + } + }, "sideEffects": false } From 9c67896f14ac6753df7ba36df8bd22c341dfd952 Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 16:47:46 +0200 Subject: [PATCH 16/17] small cleanup and improvements --- .github/workflows/build.yml | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6a1acd31bee2..ee57a47747ba 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,8 +28,6 @@ concurrency: env: HEAD_COMMIT: ${{ github.event.inputs.commit || github.sha }} - # WARNING: this disables cross os caching as ~ and - # github.workspace evaluate to differents paths CACHED_DEPENDENCY_PATHS: | ${{ github.workspace }}/node_modules ${{ github.workspace }}/packages/*/node_modules @@ -38,15 +36,10 @@ env: # DEPENDENCY_CACHE_KEY: can't be set here because we don't have access to yarn.lock - # WARNING: this disables cross os caching as ~ and - # github.workspace evaluate to differents paths - # packages/utils/cjs and packages/utils/esm: Symlinks to the folders inside of `build`, needed for tests - CACHED_BUILD_PATHS: | + BUILD_PATHS: | ${{ github.workspace }}/dev-packages/*/build ${{ github.workspace }}/packages/*/build - ${{ github.workspace }}/packages/*/lib - ${{ github.workspace }}/packages/ember/*.d.ts - ${{ github.workspace }}/packages/gatsby/*.d.ts + ${{ github.workspace }}/packages/*.d.ts # upload-artifact globs drop the path through the first `*` (see upload-artifact # README). Tarballs therefore land in the artifact as /*.tgz; download @@ -65,6 +58,7 @@ env: jobs: job_get_metadata: uses: ./.github/workflows/ci-metadata.yml + name: Get CI Metadata with: head_commit: ${{ github.event.inputs.commit || github.sha }} permissions: @@ -124,7 +118,7 @@ jobs: uses: actions/upload-artifact@v7 with: name: build-output - path: ${{ env.CACHED_BUILD_PATHS }} + path: ${{ env.BUILD_PATHS }} retention-days: 4 compression-level: 6 overwrite: true From 4481233c2680381fa3bcbf4d60f15fc6fd04204b Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Mon, 20 Apr 2026 16:48:15 +0200 Subject: [PATCH 17/17] fix linting --- packages/nestjs/package.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/nestjs/package.json b/packages/nestjs/package.json index 29c313fc292f..024e25cf3cce 100644 --- a/packages/nestjs/package.json +++ b/packages/nestjs/package.json @@ -88,8 +88,13 @@ "nx": { "targets": { "build:types": { - "inputs": ["production", "^production"], - "dependsOn": ["^build:types"], + "inputs": [ + "production", + "^production" + ], + "dependsOn": [ + "^build:types" + ], "outputs": [ "{projectRoot}/build/types", "{projectRoot}/build/types-ts3.8",