From 3e76c605af74e10cad5f3a5fb3dbf872206f020c Mon Sep 17 00:00:00 2001 From: Raz1o Date: Fri, 12 Jul 2024 01:35:41 +0800 Subject: [PATCH] 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