From ba89fba53966eb3573eb9c53244c2df92cfd45d2 Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Mon, 14 Aug 2023 15:22:32 +0100 Subject: [PATCH 1/7] feat(remix): Add debugid injection and map deletion to sourcemaps script --- packages/remix/package.json | 2 +- packages/remix/scripts/createRelease.js | 18 ++++++++++++--- packages/remix/scripts/deleteSourcemaps.js | 21 +++++++++++++++++ packages/remix/scripts/injectDebugId.js | 15 ++++++++++++ .../remix/scripts/sentry-upload-sourcemaps.js | 23 ++++++++++++++++++- .../test/scripts/upload-sourcemaps.test.ts | 3 +++ yarn.lock | 11 ++++----- 7 files changed, 82 insertions(+), 11 deletions(-) create mode 100644 packages/remix/scripts/deleteSourcemaps.js create mode 100644 packages/remix/scripts/injectDebugId.js diff --git a/packages/remix/package.json b/packages/remix/package.json index d89135c01dba..a88968fd361c 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -27,7 +27,7 @@ "access": "public" }, "dependencies": { - "@sentry/cli": "2.2.0", + "@sentry/cli": "2.20.4", "@sentry/core": "7.64.0", "@sentry/node": "7.64.0", "@sentry/react": "7.64.0", diff --git a/packages/remix/scripts/createRelease.js b/packages/remix/scripts/createRelease.js index 4b71bb3bfd75..fa7743da01e2 100644 --- a/packages/remix/scripts/createRelease.js +++ b/packages/remix/scripts/createRelease.js @@ -1,19 +1,31 @@ +/* eslint-disable no-console */ const SentryCli = require('@sentry/cli'); + +const { deleteSourcemaps } = require('./deleteSourcemaps'); + const sentry = new SentryCli(); -async function createRelease(argv, DEFAULT_URL_PREFIX, DEFAULT_BUILD_PATH) { +async function createRelease(argv, URL_PREFIX, BUILD_PATH) { const RELEASE = argv.release || (await sentry.releases.proposeVersion()); - const URL_PREFIX = argv.urlPrefix || DEFAULT_URL_PREFIX; - const BUILD_PATH = argv.buildPath || DEFAULT_BUILD_PATH; await sentry.releases.new(RELEASE); await sentry.releases.uploadSourceMaps(RELEASE, { urlPrefix: URL_PREFIX, include: [BUILD_PATH], + useArtifactBundle: !argv.disableDebugIds, }); await sentry.releases.finalize(RELEASE); + + if (argv.deleteAfterUpload) { + try { + deleteSourcemaps(BUILD_PATH); + } catch (error) { + console.warn(`Failed to delete sourcemaps in build directory: ${BUILD_PATH}`); + console.error(error); + } + } } module.exports = { diff --git a/packages/remix/scripts/deleteSourcemaps.js b/packages/remix/scripts/deleteSourcemaps.js new file mode 100644 index 000000000000..7b6b7d0a1dfc --- /dev/null +++ b/packages/remix/scripts/deleteSourcemaps.js @@ -0,0 +1,21 @@ +/* eslint-disable no-console */ +const fs = require('fs'); +const path = require('path'); + +function deleteSourcemaps(buildPath) { + console.info(`Deleting sourcemaps from ${buildPath}`); + + const files = fs.readdirSync(buildPath); + + files.forEach(file => { + if (file.endsWith('.map')) { + fs.unlinkSync(path.join(buildPath, file)); + + console.info(`Deleted ${file}`); + } + }); +} + +module.exports = { + deleteSourcemaps, +}; diff --git a/packages/remix/scripts/injectDebugId.js b/packages/remix/scripts/injectDebugId.js new file mode 100644 index 000000000000..729b4adb51c9 --- /dev/null +++ b/packages/remix/scripts/injectDebugId.js @@ -0,0 +1,15 @@ +/* eslint-disable no-console */ +const { execSync } = require('child_process'); + +function injectDebugId(buildPath) { + try { + execSync(`node ./node_modules/@sentry/cli/bin/sentry-cli sourcemaps inject ${buildPath}`); + } catch (error) { + console.warn('Failed to inject debug ids.'); + console.error(error); + } +} + +module.exports = { + injectDebugId, +}; diff --git a/packages/remix/scripts/sentry-upload-sourcemaps.js b/packages/remix/scripts/sentry-upload-sourcemaps.js index 0d7a081ddc98..43305c22351e 100755 --- a/packages/remix/scripts/sentry-upload-sourcemaps.js +++ b/packages/remix/scripts/sentry-upload-sourcemaps.js @@ -1,7 +1,9 @@ #!/usr/bin/env node +/* eslint-disable no-console */ const yargs = require('yargs'); const { createRelease } = require('./createRelease'); +const { injectDebugId } = require('./injectDebugId'); const DEFAULT_URL_PREFIX = '~/build/'; const DEFAULT_BUILD_PATH = 'public/build'; @@ -24,11 +26,23 @@ const argv = yargs(process.argv.slice(2)) describe: 'The path to the build directory', default: DEFAULT_BUILD_PATH, }) + .option('disableDebugIds', { + type: 'boolean', + describe: 'Disable the injection and upload of debug ids', + default: false, + }) + .option('deleteAfterUpload', { + type: 'boolean', + describe: 'Delete sourcemaps after uploading', + default: true, + }) .usage( 'Usage: $0\n' + ' [--release RELEASE]\n' + ' [--urlPrefix URL_PREFIX]\n' + ' [--buildPath BUILD_PATH]\n\n' + + ' [--disableDebugIds true|false]\n\n' + + ' [--deleteAfterUpload true|false]\n\n' + 'This CLI tool will upload sourcemaps to Sentry for the given release.\n' + 'It has defaults for URL prefix and build path for Remix builds, but you can override them.\n\n' + 'If you need a more advanced configuration, you can use `sentry-cli` instead.\n' + @@ -36,4 +50,11 @@ const argv = yargs(process.argv.slice(2)) ) .wrap(120).argv; -createRelease(argv, DEFAULT_URL_PREFIX, DEFAULT_BUILD_PATH); +const buildPath = argv.buildPath || DEFAULT_BUILD_PATH; +const urlPrefix = argv.urlPrefix || DEFAULT_URL_PREFIX; + +if (!argv.disableDebugIds) { + injectDebugId(buildPath); +} + +createRelease(argv, urlPrefix, buildPath); diff --git a/packages/remix/test/scripts/upload-sourcemaps.test.ts b/packages/remix/test/scripts/upload-sourcemaps.test.ts index f7886c5380fb..de4575cd8ec1 100644 --- a/packages/remix/test/scripts/upload-sourcemaps.test.ts +++ b/packages/remix/test/scripts/upload-sourcemaps.test.ts @@ -36,6 +36,7 @@ describe('createRelease', () => { expect(uploadSourceMapsMock).toHaveBeenCalledWith('0.1.2.3', { urlPrefix: '~/build/', include: ['public/build'], + useArtifactBundle: true, }); expect(finalizeMock).toHaveBeenCalledWith('0.1.2.3'); }); @@ -48,6 +49,7 @@ describe('createRelease', () => { expect(uploadSourceMapsMock).toHaveBeenCalledWith('0.1.2.3.4', { urlPrefix: '~/build/', include: ['public/build'], + useArtifactBundle: true, }); expect(finalizeMock).toHaveBeenCalledWith('0.1.2.3.4'); }); @@ -67,6 +69,7 @@ describe('createRelease', () => { expect(uploadSourceMapsMock).toHaveBeenCalledWith('0.1.2.3.4', { urlPrefix: '~/build/subfolder', include: ['public/build/subfolder'], + useArtifactBundle: true, }); expect(finalizeMock).toHaveBeenCalledWith('0.1.2.3.4'); }); diff --git a/yarn.lock b/yarn.lock index 2f4c50f00895..133fd20bfe47 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4428,14 +4428,13 @@ unplugin "1.0.1" webpack-sources "3.2.3" -"@sentry/cli@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.2.0.tgz#0cf4d529d87e290dea54d7e58fa5ff87ea200e4e" - integrity sha512-ywFtB8VHyWN248LuM67fsRtdMLif/SOHYY3zyef5WybvnAmRLDmGTWK//hSUCebsHBpehRIkmt4iMiyUXwgd5w== +"@sentry/cli@2.20.4": + version "2.20.4" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.20.4.tgz#755719aeaa58dbd3910ee23cc020decc16f5a5bf" + integrity sha512-mycBCKQmLdaJpSKpXc3IXrQwb5HLxrdjgJgLGbb8saFHIkXl/1ePH171j+REq4dIP1uetu0bdDgEYj6AQjkleQ== dependencies: https-proxy-agent "^5.0.0" node-fetch "^2.6.7" - npmlog "^6.0.1" progress "^2.0.3" proxy-from-env "^1.1.0" which "^2.0.2" @@ -20552,7 +20551,7 @@ npmlog@^4.1.2: gauge "~2.7.3" set-blocking "~2.0.0" -npmlog@^6.0.0, npmlog@^6.0.1, npmlog@^6.0.2: +npmlog@^6.0.0, npmlog@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== From 5d6630d828f4e887e99569ccfa1d1963d3219c5d Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Thu, 17 Aug 2023 12:12:10 +0100 Subject: [PATCH 2/7] Bump `@sentry/cli` to `2.20.5` --- packages/remix/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/remix/package.json b/packages/remix/package.json index a88968fd361c..ca37b0f4c02b 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -27,7 +27,7 @@ "access": "public" }, "dependencies": { - "@sentry/cli": "2.20.4", + "@sentry/cli": "2.20.5", "@sentry/core": "7.64.0", "@sentry/node": "7.64.0", "@sentry/react": "7.64.0", From 43fe66c4c54f3237c1cd8477d260c718d60e0138 Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Fri, 18 Aug 2023 02:50:37 +0300 Subject: [PATCH 3/7] Add `[sentry]` prefix to user-facing logs. --- packages/remix/scripts/createRelease.js | 2 +- packages/remix/scripts/deleteSourcemaps.js | 4 ++-- packages/remix/scripts/injectDebugId.js | 2 +- packages/remix/scripts/sentry-upload-sourcemaps.js | 1 - 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/remix/scripts/createRelease.js b/packages/remix/scripts/createRelease.js index fa7743da01e2..a04fdf67a693 100644 --- a/packages/remix/scripts/createRelease.js +++ b/packages/remix/scripts/createRelease.js @@ -22,7 +22,7 @@ async function createRelease(argv, URL_PREFIX, BUILD_PATH) { try { deleteSourcemaps(BUILD_PATH); } catch (error) { - console.warn(`Failed to delete sourcemaps in build directory: ${BUILD_PATH}`); + console.warn(`[sentry] Failed to delete sourcemaps in build directory: ${BUILD_PATH}`); console.error(error); } } diff --git a/packages/remix/scripts/deleteSourcemaps.js b/packages/remix/scripts/deleteSourcemaps.js index 7b6b7d0a1dfc..411e34dff098 100644 --- a/packages/remix/scripts/deleteSourcemaps.js +++ b/packages/remix/scripts/deleteSourcemaps.js @@ -3,7 +3,7 @@ const fs = require('fs'); const path = require('path'); function deleteSourcemaps(buildPath) { - console.info(`Deleting sourcemaps from ${buildPath}`); + console.info(`[sentry] Deleting sourcemaps from ${buildPath}`); const files = fs.readdirSync(buildPath); @@ -11,7 +11,7 @@ function deleteSourcemaps(buildPath) { if (file.endsWith('.map')) { fs.unlinkSync(path.join(buildPath, file)); - console.info(`Deleted ${file}`); + console.info(`[sentry] Deleted ${file}`); } }); } diff --git a/packages/remix/scripts/injectDebugId.js b/packages/remix/scripts/injectDebugId.js index 729b4adb51c9..6c5aad85df88 100644 --- a/packages/remix/scripts/injectDebugId.js +++ b/packages/remix/scripts/injectDebugId.js @@ -5,7 +5,7 @@ function injectDebugId(buildPath) { try { execSync(`node ./node_modules/@sentry/cli/bin/sentry-cli sourcemaps inject ${buildPath}`); } catch (error) { - console.warn('Failed to inject debug ids.'); + console.warn('[sentry] Failed to inject debug ids.'); console.error(error); } } diff --git a/packages/remix/scripts/sentry-upload-sourcemaps.js b/packages/remix/scripts/sentry-upload-sourcemaps.js index 43305c22351e..c7eef6b0fa92 100755 --- a/packages/remix/scripts/sentry-upload-sourcemaps.js +++ b/packages/remix/scripts/sentry-upload-sourcemaps.js @@ -1,5 +1,4 @@ #!/usr/bin/env node -/* eslint-disable no-console */ const yargs = require('yargs'); const { createRelease } = require('./createRelease'); From 6bbc3d9e81c832ae67475c4509a918a92dcc09dc Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Fri, 18 Aug 2023 03:14:57 +0300 Subject: [PATCH 4/7] Fix tests. --- packages/remix/test/scripts/upload-sourcemaps.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/remix/test/scripts/upload-sourcemaps.test.ts b/packages/remix/test/scripts/upload-sourcemaps.test.ts index de4575cd8ec1..1a4a4acbd5c4 100644 --- a/packages/remix/test/scripts/upload-sourcemaps.test.ts +++ b/packages/remix/test/scripts/upload-sourcemaps.test.ts @@ -57,8 +57,8 @@ describe('createRelease', () => { it('should use given buildPath and urlPrefix over the defaults when given.', async () => { await createRelease( { - urlPrefix: '~/build/subfolder', - buildPath: 'public/build/subfolder', + urlPrefix: '~/build/', + buildPath: 'public/build', }, '~/build/', 'public/build', @@ -67,8 +67,8 @@ describe('createRelease', () => { expect(proposeVersionMock).toHaveBeenCalled(); expect(newMock).toHaveBeenCalledWith('0.1.2.3.4'); expect(uploadSourceMapsMock).toHaveBeenCalledWith('0.1.2.3.4', { - urlPrefix: '~/build/subfolder', - include: ['public/build/subfolder'], + urlPrefix: '~/build/', + include: ['public/build'], useArtifactBundle: true, }); expect(finalizeMock).toHaveBeenCalledWith('0.1.2.3.4'); From 038577a3811d8faa4e6172c0971d7c85a0cedad1 Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Fri, 18 Aug 2023 15:34:21 +0300 Subject: [PATCH 5/7] Update lockfile to reflect sentry-cli version bump. --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 133fd20bfe47..7228ceab27d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4428,10 +4428,10 @@ unplugin "1.0.1" webpack-sources "3.2.3" -"@sentry/cli@2.20.4": - version "2.20.4" - resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.20.4.tgz#755719aeaa58dbd3910ee23cc020decc16f5a5bf" - integrity sha512-mycBCKQmLdaJpSKpXc3IXrQwb5HLxrdjgJgLGbb8saFHIkXl/1ePH171j+REq4dIP1uetu0bdDgEYj6AQjkleQ== +"@sentry/cli@2.20.5": + version "2.20.5" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.20.5.tgz#255a5388ca24c211a0eae01dcc4ad813a7ff335a" + integrity sha512-ZvWb86eF0QXH9C5Mbi87aUmr8SH848yEpXJmlM2AoBowpE9kKDnewCAKvyXUihojUFwCSEEjoJhrRMMgmCZqXA== dependencies: https-proxy-agent "^5.0.0" node-fetch "^2.6.7" From fa20a3115f5ffd660954b444d67101b4a9aa6ce4 Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Fri, 18 Aug 2023 15:34:49 +0300 Subject: [PATCH 6/7] Use getPath to locate CLI. --- packages/remix/scripts/injectDebugId.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/remix/scripts/injectDebugId.js b/packages/remix/scripts/injectDebugId.js index 6c5aad85df88..2eb05ef87ba6 100644 --- a/packages/remix/scripts/injectDebugId.js +++ b/packages/remix/scripts/injectDebugId.js @@ -1,9 +1,13 @@ /* eslint-disable no-console */ const { execSync } = require('child_process'); +const SentryCli = require('@sentry/cli'); + function injectDebugId(buildPath) { + const cliPath = SentryCli.getPath(); + try { - execSync(`node ./node_modules/@sentry/cli/bin/sentry-cli sourcemaps inject ${buildPath}`); + execSync(`${cliPath} sourcemaps inject ${buildPath}`); } catch (error) { console.warn('[sentry] Failed to inject debug ids.'); console.error(error); From 22e5b7a9fd1c7a2da22944c2f9326e334ba2b6e9 Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Fri, 18 Aug 2023 16:54:15 +0300 Subject: [PATCH 7/7] Find sourcemap files via glob, and delete .map files in subfolders. --- packages/remix/scripts/deleteSourcemaps.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/remix/scripts/deleteSourcemaps.js b/packages/remix/scripts/deleteSourcemaps.js index 411e34dff098..f73cc678f7df 100644 --- a/packages/remix/scripts/deleteSourcemaps.js +++ b/packages/remix/scripts/deleteSourcemaps.js @@ -2,17 +2,18 @@ const fs = require('fs'); const path = require('path'); +const glob = require('glob'); + function deleteSourcemaps(buildPath) { console.info(`[sentry] Deleting sourcemaps from ${buildPath}`); - const files = fs.readdirSync(buildPath); + // Delete all .map files in the build folder and its subfolders + const mapFiles = glob.sync('**/*.map', { cwd: buildPath }); - files.forEach(file => { - if (file.endsWith('.map')) { - fs.unlinkSync(path.join(buildPath, file)); + mapFiles.forEach(file => { + fs.unlinkSync(path.join(buildPath, file)); - console.info(`[sentry] Deleted ${file}`); - } + console.info(`[sentry] Deleted ${file}`); }); }