From 3e76c605af74e10cad5f3a5fb3dbf872206f020c Mon Sep 17 00:00:00 2001 From: Raz1o Date: Fri, 12 Jul 2024 01:35:41 +0800 Subject: [PATCH 1/4] fix: Resolve the deletion task order --- .../src/debug-id-upload.ts | 5 +- packages/bundler-plugin-core/src/index.ts | 6 +- .../src/plugins/release-management.ts | 5 +- .../src/plugins/sourcemap-deletion.ts | 74 +++++++++---------- 4 files changed, 43 insertions(+), 47 deletions(-) diff --git a/packages/bundler-plugin-core/src/debug-id-upload.ts b/packages/bundler-plugin-core/src/debug-id-upload.ts index 7ff8f226..525a993b 100644 --- a/packages/bundler-plugin-core/src/debug-id-upload.ts +++ b/packages/bundler-plugin-core/src/debug-id-upload.ts @@ -33,7 +33,7 @@ interface DebugIdUploadPluginOptions { silent: boolean; headers?: Record; }; - freeDependencyOnSourcemapFiles: () => void; + createDependencyOnSourcemapFiles: () => () => void; } export function createDebugIdUploadFunction({ @@ -47,7 +47,7 @@ export function createDebugIdUploadFunction({ sentryClient, sentryCliOptions, rewriteSourcesHook, - freeDependencyOnSourcemapFiles, + createDependencyOnSourcemapFiles, }: DebugIdUploadPluginOptions) { return async (buildArtifactPaths: string[]) => { const artifactBundleUploadTransaction = sentryHub.startTransaction({ @@ -56,6 +56,7 @@ export function createDebugIdUploadFunction({ let folderToCleanUp: string | undefined; + const freeDependencyOnSourcemapFiles = createDependencyOnSourcemapFiles(); try { const mkdtempSpan = artifactBundleUploadTransaction.startChild({ description: "mkdtemp" }); const tmpUploadFolder = await fs.promises.mkdtemp( diff --git a/packages/bundler-plugin-core/src/index.ts b/packages/bundler-plugin-core/src/index.ts index d7dc2585..eb6789ff 100644 --- a/packages/bundler-plugin-core/src/index.ts +++ b/packages/bundler-plugin-core/src/index.ts @@ -342,7 +342,7 @@ export function sentryUnpluginFactory({ vcsRemote: options.release.vcsRemote, headers: options.headers, }, - freeDependencyOnSourcemapFiles: createDependencyOnSourcemapFiles(), + createDependencyOnSourcemapFiles, }) ); } @@ -367,7 +367,7 @@ export function sentryUnpluginFactory({ createDebugIdUploadFunction({ assets: options.sourcemaps?.assets, ignore: options.sourcemaps?.ignore, - freeDependencyOnSourcemapFiles: createDependencyOnSourcemapFiles(), + createDependencyOnSourcemapFiles, dist: options.release.dist, releaseName: options.release.name, logger: logger, @@ -407,7 +407,7 @@ export function sentryUnpluginFactory({ fileDeletionPlugin({ // It is very important that this is only called after all other dependencies have been created with `createDependencyOnSourcemapFiles`. // Ideally, we always register this plugin last. - dependenciesAreFreedPromise: waitUntilSourcemapFileDependenciesAreFreed(), + dependenciesAreFreedPromise: () => waitUntilSourcemapFileDependenciesAreFreed(), filesToDeleteAfterUpload: options.sourcemaps?.filesToDeleteAfterUpload ?? options.sourcemaps?.deleteFilesAfterUpload, diff --git a/packages/bundler-plugin-core/src/plugins/release-management.ts b/packages/bundler-plugin-core/src/plugins/release-management.ts index d984cc4e..22f69889 100644 --- a/packages/bundler-plugin-core/src/plugins/release-management.ts +++ b/packages/bundler-plugin-core/src/plugins/release-management.ts @@ -27,7 +27,7 @@ interface ReleaseManagementPluginOptions { silent: boolean; headers?: Record; }; - freeDependencyOnSourcemapFiles: () => void; + createDependencyOnSourcemapFiles: () => () => void; } export function releaseManagementPlugin({ @@ -42,11 +42,12 @@ export function releaseManagementPlugin({ sentryHub, sentryClient, sentryCliOptions, - freeDependencyOnSourcemapFiles, + createDependencyOnSourcemapFiles, }: ReleaseManagementPluginOptions): UnpluginOptions { return { name: "sentry-debug-id-upload-plugin", async writeBundle() { + const freeDependencyOnSourcemapFiles = createDependencyOnSourcemapFiles() try { const cliInstance = new SentryCli(null, sentryCliOptions); diff --git a/packages/bundler-plugin-core/src/plugins/sourcemap-deletion.ts b/packages/bundler-plugin-core/src/plugins/sourcemap-deletion.ts index 6ea38fb2..7917b54b 100644 --- a/packages/bundler-plugin-core/src/plugins/sourcemap-deletion.ts +++ b/packages/bundler-plugin-core/src/plugins/sourcemap-deletion.ts @@ -7,7 +7,7 @@ import fs from "fs"; interface FileDeletionPlugin { handleRecoverableError: (error: unknown) => void; - dependenciesAreFreedPromise: Promise; + dependenciesAreFreedPromise: () => Promise; sentryHub: Hub; sentryClient: NodeClient; filesToDeleteAfterUpload: string | string[] | undefined; @@ -22,49 +22,43 @@ export function fileDeletionPlugin({ dependenciesAreFreedPromise, logger, }: FileDeletionPlugin): UnpluginOptions { - const writeBundle = async () => { - try { - if (filesToDeleteAfterUpload !== undefined) { - const filePathsToDelete = await glob(filesToDeleteAfterUpload, { - absolute: true, - nodir: true, - }); + return { + name: "sentry-file-deletion-plugin", + async writeBundle() { + try { + if (filesToDeleteAfterUpload !== undefined) { + const filePathsToDelete = await glob(filesToDeleteAfterUpload, { + absolute: true, + nodir: true, + }); - logger.debug("Waiting for dependencies on generated files to be freed before deleting..."); + logger.debug( + "Waiting for dependencies on generated files to be freed before deleting..." + ); - await dependenciesAreFreedPromise; + await dependenciesAreFreedPromise(); - filePathsToDelete.forEach((filePathToDelete) => { - logger.debug(`Deleting asset after upload: ${filePathToDelete}`); - }); + filePathsToDelete.forEach((filePathToDelete) => { + logger.debug(`Deleting asset after upload: ${filePathToDelete}`); + }); - await Promise.all( - filePathsToDelete.map((filePathToDelete) => - fs.promises.rm(filePathToDelete, { force: true }).catch((e) => { - // This is allowed to fail - we just don't do anything - logger.debug( - `An error occurred while attempting to delete asset: ${filePathToDelete}`, - e - ); - }) - ) - ); + await Promise.all( + filePathsToDelete.map((filePathToDelete) => + fs.promises.rm(filePathToDelete, { force: true }).catch((e) => { + // This is allowed to fail - we just don't do anything + logger.debug( + `An error occurred while attempting to delete asset: ${filePathToDelete}`, + e + ); + }) + ) + ); + } + } catch (e) { + sentryHub.captureException('Error in "sentry-file-deletion-plugin" buildEnd hook'); + await safeFlushTelemetry(sentryClient); + handleRecoverableError(e); } - } catch (e) { - sentryHub.captureException('Error in "sentry-file-deletion-plugin" buildEnd hook'); - await safeFlushTelemetry(sentryClient); - handleRecoverableError(e); - } - }; - return { - name: "sentry-file-deletion-plugin", - vite: { - writeBundle: { - sequential: true, - order: "post", - handler: writeBundle, - }, }, - writeBundle, }; -} +} \ No newline at end of file From 8e7d157a3660fb601a321111e1c83a5654e8c717 Mon Sep 17 00:00:00 2001 From: Raz1o Date: Fri, 12 Jul 2024 02:00:58 +0800 Subject: [PATCH 2/4] style: format --- packages/bundler-plugin-core/src/plugins/release-management.ts | 2 +- packages/bundler-plugin-core/src/plugins/sourcemap-deletion.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/bundler-plugin-core/src/plugins/release-management.ts b/packages/bundler-plugin-core/src/plugins/release-management.ts index 22f69889..2752667b 100644 --- a/packages/bundler-plugin-core/src/plugins/release-management.ts +++ b/packages/bundler-plugin-core/src/plugins/release-management.ts @@ -47,7 +47,7 @@ export function releaseManagementPlugin({ return { name: "sentry-debug-id-upload-plugin", async writeBundle() { - const freeDependencyOnSourcemapFiles = createDependencyOnSourcemapFiles() + const freeDependencyOnSourcemapFiles = createDependencyOnSourcemapFiles(); try { const cliInstance = new SentryCli(null, sentryCliOptions); diff --git a/packages/bundler-plugin-core/src/plugins/sourcemap-deletion.ts b/packages/bundler-plugin-core/src/plugins/sourcemap-deletion.ts index 7917b54b..95c5a8ed 100644 --- a/packages/bundler-plugin-core/src/plugins/sourcemap-deletion.ts +++ b/packages/bundler-plugin-core/src/plugins/sourcemap-deletion.ts @@ -61,4 +61,4 @@ export function fileDeletionPlugin({ } }, }; -} \ No newline at end of file +} From f48f2349ecff0e83558c3d4bd0d494f060ef9230 Mon Sep 17 00:00:00 2001 From: Raz1o Date: Fri, 12 Jul 2024 02:24:14 +0800 Subject: [PATCH 3/4] fix: Keep the old waiting logic --- packages/bundler-plugin-core/src/debug-id-upload.ts | 2 ++ packages/bundler-plugin-core/src/plugins/release-management.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/bundler-plugin-core/src/debug-id-upload.ts b/packages/bundler-plugin-core/src/debug-id-upload.ts index 525a993b..13f88956 100644 --- a/packages/bundler-plugin-core/src/debug-id-upload.ts +++ b/packages/bundler-plugin-core/src/debug-id-upload.ts @@ -49,6 +49,7 @@ export function createDebugIdUploadFunction({ rewriteSourcesHook, createDependencyOnSourcemapFiles, }: DebugIdUploadPluginOptions) { + const freeInitDependencyOnSourcemapFiles = createDependencyOnSourcemapFiles(); return async (buildArtifactPaths: string[]) => { const artifactBundleUploadTransaction = sentryHub.startTransaction({ name: "debug-id-sourcemap-upload", @@ -195,6 +196,7 @@ export function createDebugIdUploadFunction({ cleanupSpan.finish(); } artifactBundleUploadTransaction.finish(); + freeInitDependencyOnSourcemapFiles(); freeDependencyOnSourcemapFiles(); await safeFlushTelemetry(sentryClient); } diff --git a/packages/bundler-plugin-core/src/plugins/release-management.ts b/packages/bundler-plugin-core/src/plugins/release-management.ts index 2752667b..043bab48 100644 --- a/packages/bundler-plugin-core/src/plugins/release-management.ts +++ b/packages/bundler-plugin-core/src/plugins/release-management.ts @@ -44,6 +44,7 @@ export function releaseManagementPlugin({ sentryCliOptions, createDependencyOnSourcemapFiles, }: ReleaseManagementPluginOptions): UnpluginOptions { + const freeInitDependencyOnSourcemapFiles = createDependencyOnSourcemapFiles(); return { name: "sentry-debug-id-upload-plugin", async writeBundle() { @@ -91,6 +92,7 @@ export function releaseManagementPlugin({ await safeFlushTelemetry(sentryClient); handleRecoverableError(e); } finally { + freeInitDependencyOnSourcemapFiles(); freeDependencyOnSourcemapFiles(); } }, From e641dd1b5249560637fb665ce392ce1baf19b605 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Fri, 12 Jul 2024 11:06:34 +0200 Subject: [PATCH 4/4] cleanup --- packages/bundler-plugin-core/src/debug-id-upload.ts | 7 ++----- packages/bundler-plugin-core/src/index.ts | 8 +++----- .../bundler-plugin-core/src/plugins/release-management.ts | 7 ++----- .../bundler-plugin-core/src/plugins/sourcemap-deletion.ts | 6 +++--- 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/packages/bundler-plugin-core/src/debug-id-upload.ts b/packages/bundler-plugin-core/src/debug-id-upload.ts index 13f88956..7ff8f226 100644 --- a/packages/bundler-plugin-core/src/debug-id-upload.ts +++ b/packages/bundler-plugin-core/src/debug-id-upload.ts @@ -33,7 +33,7 @@ interface DebugIdUploadPluginOptions { silent: boolean; headers?: Record; }; - createDependencyOnSourcemapFiles: () => () => void; + freeDependencyOnSourcemapFiles: () => void; } export function createDebugIdUploadFunction({ @@ -47,9 +47,8 @@ export function createDebugIdUploadFunction({ sentryClient, sentryCliOptions, rewriteSourcesHook, - createDependencyOnSourcemapFiles, + freeDependencyOnSourcemapFiles, }: DebugIdUploadPluginOptions) { - const freeInitDependencyOnSourcemapFiles = createDependencyOnSourcemapFiles(); return async (buildArtifactPaths: string[]) => { const artifactBundleUploadTransaction = sentryHub.startTransaction({ name: "debug-id-sourcemap-upload", @@ -57,7 +56,6 @@ export function createDebugIdUploadFunction({ let folderToCleanUp: string | undefined; - const freeDependencyOnSourcemapFiles = createDependencyOnSourcemapFiles(); try { const mkdtempSpan = artifactBundleUploadTransaction.startChild({ description: "mkdtemp" }); const tmpUploadFolder = await fs.promises.mkdtemp( @@ -196,7 +194,6 @@ export function createDebugIdUploadFunction({ cleanupSpan.finish(); } artifactBundleUploadTransaction.finish(); - freeInitDependencyOnSourcemapFiles(); freeDependencyOnSourcemapFiles(); await safeFlushTelemetry(sentryClient); } diff --git a/packages/bundler-plugin-core/src/index.ts b/packages/bundler-plugin-core/src/index.ts index eb6789ff..c25535d3 100644 --- a/packages/bundler-plugin-core/src/index.ts +++ b/packages/bundler-plugin-core/src/index.ts @@ -342,7 +342,7 @@ export function sentryUnpluginFactory({ vcsRemote: options.release.vcsRemote, headers: options.headers, }, - createDependencyOnSourcemapFiles, + freeDependencyOnSourcemapFiles: createDependencyOnSourcemapFiles(), }) ); } @@ -367,7 +367,7 @@ export function sentryUnpluginFactory({ createDebugIdUploadFunction({ assets: options.sourcemaps?.assets, ignore: options.sourcemaps?.ignore, - createDependencyOnSourcemapFiles, + freeDependencyOnSourcemapFiles: createDependencyOnSourcemapFiles(), dist: options.release.dist, releaseName: options.release.name, logger: logger, @@ -405,9 +405,7 @@ export function sentryUnpluginFactory({ plugins.push( fileDeletionPlugin({ - // It is very important that this is only called after all other dependencies have been created with `createDependencyOnSourcemapFiles`. - // Ideally, we always register this plugin last. - dependenciesAreFreedPromise: () => waitUntilSourcemapFileDependenciesAreFreed(), + waitUntilSourcemapFileDependenciesAreFreed, filesToDeleteAfterUpload: options.sourcemaps?.filesToDeleteAfterUpload ?? options.sourcemaps?.deleteFilesAfterUpload, diff --git a/packages/bundler-plugin-core/src/plugins/release-management.ts b/packages/bundler-plugin-core/src/plugins/release-management.ts index 043bab48..d984cc4e 100644 --- a/packages/bundler-plugin-core/src/plugins/release-management.ts +++ b/packages/bundler-plugin-core/src/plugins/release-management.ts @@ -27,7 +27,7 @@ interface ReleaseManagementPluginOptions { silent: boolean; headers?: Record; }; - createDependencyOnSourcemapFiles: () => () => void; + freeDependencyOnSourcemapFiles: () => void; } export function releaseManagementPlugin({ @@ -42,13 +42,11 @@ export function releaseManagementPlugin({ sentryHub, sentryClient, sentryCliOptions, - createDependencyOnSourcemapFiles, + freeDependencyOnSourcemapFiles, }: ReleaseManagementPluginOptions): UnpluginOptions { - const freeInitDependencyOnSourcemapFiles = createDependencyOnSourcemapFiles(); return { name: "sentry-debug-id-upload-plugin", async writeBundle() { - const freeDependencyOnSourcemapFiles = createDependencyOnSourcemapFiles(); try { const cliInstance = new SentryCli(null, sentryCliOptions); @@ -92,7 +90,6 @@ export function releaseManagementPlugin({ await safeFlushTelemetry(sentryClient); handleRecoverableError(e); } finally { - freeInitDependencyOnSourcemapFiles(); freeDependencyOnSourcemapFiles(); } }, diff --git a/packages/bundler-plugin-core/src/plugins/sourcemap-deletion.ts b/packages/bundler-plugin-core/src/plugins/sourcemap-deletion.ts index 95c5a8ed..97d743f2 100644 --- a/packages/bundler-plugin-core/src/plugins/sourcemap-deletion.ts +++ b/packages/bundler-plugin-core/src/plugins/sourcemap-deletion.ts @@ -7,7 +7,7 @@ import fs from "fs"; interface FileDeletionPlugin { handleRecoverableError: (error: unknown) => void; - dependenciesAreFreedPromise: () => Promise; + waitUntilSourcemapFileDependenciesAreFreed: () => Promise; sentryHub: Hub; sentryClient: NodeClient; filesToDeleteAfterUpload: string | string[] | undefined; @@ -19,7 +19,7 @@ export function fileDeletionPlugin({ sentryHub, sentryClient, filesToDeleteAfterUpload, - dependenciesAreFreedPromise, + waitUntilSourcemapFileDependenciesAreFreed, logger, }: FileDeletionPlugin): UnpluginOptions { return { @@ -36,7 +36,7 @@ export function fileDeletionPlugin({ "Waiting for dependencies on generated files to be freed before deleting..." ); - await dependenciesAreFreedPromise(); + await waitUntilSourcemapFileDependenciesAreFreed(); filePathsToDelete.forEach((filePathToDelete) => { logger.debug(`Deleting asset after upload: ${filePathToDelete}`);