diff --git a/e2e/utils/global-setup.ts b/e2e/utils/global-setup.ts index 5cc94f587a..d95882dafb 100644 --- a/e2e/utils/global-setup.ts +++ b/e2e/utils/global-setup.ts @@ -2,51 +2,60 @@ import { Config } from '@jest/types'; import { startLocalRegistry } from '@nx/js/plugins/jest/local-registry'; import { existsSync, removeSync } from 'fs-extra'; import * as isCI from 'is-ci'; -import { exec, execSync } from 'node:child_process'; +import { exec } from 'node:child_process'; import { join } from 'node:path'; import { registerTsConfigPaths } from '../../packages/nx/src/plugins/js/utils/register'; import { runLocalRelease } from '../../scripts/local-registry/populate-storage'; export default async function (globalConfig: Config.ConfigGlobals) { - const isVerbose: boolean = - process.env.NX_VERBOSE_LOGGING === 'true' || !!globalConfig.verbose; + try { + const isVerbose: boolean = + process.env.NX_VERBOSE_LOGGING === 'true' || !!globalConfig.verbose; - /** - * For e2e-ci we populate the verdaccio storage up front, but for other workflows we need - * to run the full local release process before running tests. - */ - const requiresLocalRelease = - !process.env.NX_TASK_TARGET_TARGET?.startsWith('e2e-ci'); + /** + * For e2e-ci we populate the verdaccio storage up front, but for other workflows we need + * to run the full local release process before running tests. + */ + const requiresLocalRelease = + !process.env.NX_TASK_TARGET_TARGET?.startsWith('e2e-ci'); - global.e2eTeardown = await startLocalRegistry({ - localRegistryTarget: '@nx/nx-source:local-registry', - verbose: isVerbose, - clearStorage: requiresLocalRelease, - }); + global.e2eTeardown = await startLocalRegistry({ + localRegistryTarget: '@nx/nx-source:local-registry', + verbose: isVerbose, + clearStorage: requiresLocalRelease, + }); - /** - * Set the published version based on what has previously been loaded into the - * verdaccio storage. - */ - if (!requiresLocalRelease) { - const publishedVersion = await getPublishedVersion(); - if (publishedVersion) { - process.env.PUBLISHED_VERSION = publishedVersion; + /** + * Set the published version based on what has previously been loaded into the + * verdaccio storage. + */ + if (!requiresLocalRelease) { + const publishedVersion = await getPublishedVersion(); + if (publishedVersion) { + process.env.PUBLISHED_VERSION = publishedVersion; + } } - } - if (process.env.NX_E2E_SKIP_CLEANUP !== 'true' || !existsSync('./build')) { - if (!isCI) { - registerTsConfigPaths(join(__dirname, '../../tsconfig.base.json')); - const { e2eCwd } = await import('./get-env-info'); - removeSync(e2eCwd); + if (process.env.NX_E2E_SKIP_CLEANUP !== 'true' || !existsSync('./build')) { + if (!isCI) { + registerTsConfigPaths(join(__dirname, '../../tsconfig.base.json')); + const { e2eCwd } = await import('./get-env-info'); + removeSync(e2eCwd); + } + if (requiresLocalRelease) { + console.log('Publishing packages to local registry'); + const publishVersion = process.env.PUBLISHED_VERSION ?? 'major'; + // Always show full release logs on CI, they should only happen once via e2e-ci + await runLocalRelease(publishVersion, isCI || isVerbose); + } } - if (requiresLocalRelease) { - console.log('Publishing packages to local registry'); - const publishVersion = process.env.PUBLISHED_VERSION ?? 'major'; - // Always show full release logs on CI, they should only happen once via e2e-ci - await runLocalRelease(publishVersion, isCI || isVerbose); + } catch (err) { + // Clean up registry if possible after setup related errors + if (typeof global.e2eTeardown === 'function') { + global.e2eTeardown(); + console.log('Killed local registry process due to an error during setup'); } + throw err; } } diff --git a/scripts/local-registry/populate-storage.js b/scripts/local-registry/populate-storage.js index 8f39ac6987..e6e163877b 100644 --- a/scripts/local-registry/populate-storage.js +++ b/scripts/local-registry/populate-storage.js @@ -7,10 +7,11 @@ const { } = require('nx/src/executors/run-commands/run-commands.impl'); async function populateLocalRegistryStorage() { + let registryTeardown; try { const publishVersion = process.env.PUBLISHED_VERSION ?? 'major'; const isVerbose = process.env.NX_VERBOSE_LOGGING === 'true'; - const registryTeardown = await startLocalRegistry({ + registryTeardown = await startLocalRegistry({ localRegistryTarget: '@nx/nx-source:local-registry', verbose: isVerbose, clearStorage: true, @@ -22,6 +23,11 @@ async function populateLocalRegistryStorage() { registryTeardown(); console.log('Killed local registry process'); } catch (err) { + // Clean up registry if possible after setup related errors + if (typeof registryTeardown === 'function') { + registryTeardown(); + console.log('Killed local registry process due to an error during setup'); + } console.error('Error:', err); process.exit(1); }