Skip to content

Commit d83dd19

Browse files
Upload sourcemaps to sentry for workers-shared workers (#8094)
1 parent 1fdc88e commit d83dd19

File tree

7 files changed

+220
-24
lines changed

7 files changed

+220
-24
lines changed

.changeset/cuddly-jeans-check.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@cloudflare/workers-shared": minor
3+
---
4+
5+
Provides sentry sourcemap generation and upload on production deploys.

.github/workflows/changesets.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,7 @@ jobs:
6060
WORKERS_NEW_CLOUDFLARE_ACCOUNT_ID: ${{ secrets.WORKERS_NEW_CLOUDFLARE_ACCOUNT_ID }}
6161
WORKERS_NEW_CLOUDFLARE_API_TOKEN: ${{ secrets.WORKERS_NEW_CLOUDFLARE_API_TOKEN }}
6262
WORKERS_DEPLOY_AND_CONFIG_CLOUDFLARE_API_TOKEN: ${{ secrets.WORKERS_DEPLOY_AND_CONFIG_CLOUDFLARE_API_TOKEN }}
63+
WORKERS_SHARED_SENTRY_ACCESS_ID: ${{ secrets.WORKERS_SHARED_SENTRY_ACCESS_ID }}
64+
WORKERS_SHARED_SENTRY_ACCESS_SECRET: ${{ secrets.WORKERS_SHARED_SENTRY_ACCESS_SECRET }}
65+
WORKERS_SHARED_SENTRY_AUTH_TOKEN: ${{ secrets.WORKERS_SHARED_SENTRY_AUTH_TOKEN }}
6366
VSCE_PAT: ${{ secrets.VSCE_PAT }}

.github/workflows/workers-shared-deploy-production.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,6 @@ jobs:
1919
working-directory: packages/workers-shared
2020
env:
2121
WORKERS_DEPLOY_AND_CONFIG_CLOUDFLARE_API_TOKEN: ${{ secrets.WORKERS_DEPLOY_AND_CONFIG_CLOUDFLARE_API_TOKEN }}
22+
WORKERS_SHARED_SENTRY_ACCESS_ID: ${{ secrets.WORKERS_SHARED_SENTRY_ACCESS_ID }}
23+
WORKERS_SHARED_SENTRY_ACCESS_SECRET: ${{ secrets.WORKERS_SHARED_SENTRY_ACCESS_SECRET }}
24+
WORKERS_SHARED_SENTRY_AUTH_TOKEN: ${{ secrets.WORKERS_SHARED_SENTRY_AUTH_TOKEN }}

packages/workers-shared/package.json

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,24 @@
3232
"check:type": "pnpm run check:type:tests && tsc",
3333
"check:type:tests": "tsc -p ./asset-worker/tests/tsconfig.json && tsc -p ./router-worker/tests/tsconfig.json",
3434
"clean": "rimraf dist",
35-
"deploy": "pnpm run deploy:router-worker && pnpm run deploy:asset-worker",
36-
"deploy:asset-worker": "CLOUDFLARE_API_TOKEN=$WORKERS_DEPLOY_AND_CONFIG_CLOUDFLARE_API_TOKEN pnpx wrangler versions upload -c asset-worker/wrangler.toml",
35+
"deploy": "pnpm run generate-sourcemaps && pnpm run deploy:router-worker && pnpm run deploy:asset-worker && pnpm run upload-sourcemaps",
36+
"deploy:asset-worker": "CLOUDFLARE_API_TOKEN=$WORKERS_DEPLOY_AND_CONFIG_CLOUDFLARE_API_TOKEN pnpx wrangler versions upload -c asset-worker/wrangler.toml --tag $(node -r esbuild-register ./scripts/get-version-tag.ts)",
3737
"deploy:asset-worker-staging": "CLOUDFLARE_API_TOKEN=$WORKERS_DEPLOY_AND_CONFIG_CLOUDFLARE_API_TOKEN pnpx wrangler deploy -c asset-worker/wrangler.toml -e staging",
38-
"deploy:router-worker": "CLOUDFLARE_API_TOKEN=$WORKERS_DEPLOY_AND_CONFIG_CLOUDFLARE_API_TOKEN pnpx wrangler versions upload -c router-worker/wrangler.toml",
38+
"deploy:router-worker": "CLOUDFLARE_API_TOKEN=$WORKERS_DEPLOY_AND_CONFIG_CLOUDFLARE_API_TOKEN pnpx wrangler versions upload -c router-worker/wrangler.toml --tag $(node -r esbuild-register ./scripts/get-version-tag.ts)",
3939
"deploy:router-worker-staging": "CLOUDFLARE_API_TOKEN=$WORKERS_DEPLOY_AND_CONFIG_CLOUDFLARE_API_TOKEN pnpx wrangler deploy -c router-worker/wrangler.toml -e staging",
4040
"deploy:staging": "pnpm run deploy:router-worker-staging && pnpm run deploy:asset-worker-staging",
4141
"dev": "pnpm run clean && concurrently -n bundle:asset-worker,bundle:router-worker -c blue,magenta \"pnpm run bundle:asset-worker --watch\" \"pnpm run bundle:router-worker --watch\"",
42+
"generate-sourcemaps": "pnpm run generate-sourcemaps:asset-worker && pnpm generate-sourcemaps:router-worker",
43+
"generate-sourcemaps:asset-worker": "npx wrangler versions upload -c asset-worker/wrangler.toml --dry-run --outdir=./dist",
44+
"generate-sourcemaps:router-worker": "npx wrangler versions upload -c router-worker/wrangler.toml --dry-run --outdir=./dist",
4245
"test": "concurrently --group -n router-worker,asset-worker \"pnpm run test:router-worker\" \"pnpm run test:asset-worker\"",
4346
"test:asset-worker": "vitest -c asset-worker/vitest.config.mts --dir asset-worker",
4447
"test:ci": "concurrently --group -n router-worker,asset-worker \"pnpm run test:router-worker --run\" \"pnpm run test:asset-worker --run\"",
4548
"test:router-worker": "vitest -c router-worker/vitest.config.mts --dir router-worker",
46-
"types:emit": "tsc index.ts --declaration --emitDeclarationOnly --declarationDir ./dist"
49+
"types:emit": "tsc index.ts --declaration --emitDeclarationOnly --declarationDir ./dist",
50+
"upload-sourcemaps": "pnpm run upload-sourcemaps:asset-worker && pnpm run upload-sourcemaps:router-worker",
51+
"upload-sourcemaps:asset-worker": "node -r esbuild-register ./scripts/upload-sourcemaps.ts --worker asset-worker --tag $(node -r esbuild-register ./scripts/get-version-tag.ts)",
52+
"upload-sourcemaps:router-worker": "node -r esbuild-register ./scripts/upload-sourcemaps.ts --worker router-worker --tag $(node -r esbuild-register ./scripts/get-version-tag.ts)"
4753
},
4854
"dependencies": {
4955
"mime": "^3.0.0",
@@ -54,6 +60,7 @@
5460
"@cloudflare/vitest-pool-workers": "^0.5.31",
5561
"@cloudflare/workers-tsconfig": "workspace:*",
5662
"@cloudflare/workers-types": "^4.20250204.0",
63+
"@sentry/cli": "^2.37.0",
5764
"@types/mime": "^3.0.4",
5865
"concurrently": "^8.2.2",
5966
"esbuild": "0.17.19",
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Generates a version tag which can be used with version upload and associated with sentry releases
2+
3+
import { execSync } from "child_process";
4+
5+
try {
6+
const hash = execSync("git rev-parse --short=10 HEAD").toString().trim();
7+
console.log(hash);
8+
} catch (error) {
9+
console.log("UNKNOWN");
10+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Creates a sentry release with associated sourcemaps
2+
import SentryCli from "@sentry/cli";
3+
4+
const requireEnvVar = (varName: string): string => {
5+
const varValue = process.env[varName];
6+
if (varValue === undefined || varValue === "") {
7+
throw new Error(`Missing required environment variable: ${varName}`);
8+
}
9+
return varValue;
10+
};
11+
12+
const requireVar = (varName: string): string => {
13+
const args = process.argv.slice(2);
14+
15+
for (let i = 0; i < args.length; i += 2) {
16+
if (args[i].startsWith("--") && args[i].substring(2) === varName) {
17+
return args[i + 1];
18+
}
19+
}
20+
throw new Error(`Missing required variable: ${varName}`);
21+
};
22+
23+
// Vars
24+
const targetWorker = requireVar("worker");
25+
const sentryRelease = requireVar("tag");
26+
27+
// EnvVars
28+
const sentryAuthToken = requireEnvVar("WORKERS_SHARED_SENTRY_AUTH_TOKEN");
29+
const sentryAccessClientID = requireEnvVar("WORKERS_SHARED_SENTRY_ACCESS_ID");
30+
const sentryAccessClientSecret = requireEnvVar(
31+
"WORKERS_SHARED_SENTRY_ACCESS_SECRET"
32+
);
33+
34+
// Add a custom header to get through cf access
35+
const accessHeader = `cf-access-client-id: ${sentryAccessClientID}
36+
cf-access-client-secret: ${sentryAccessClientSecret}`;
37+
38+
async function generateRelease(worker: string, release: string) {
39+
const dir = `./${worker}/dist`;
40+
console.log(`Dir path: ${dir}`);
41+
42+
const sentryCli = new SentryCli(null, {
43+
org: "cloudflare",
44+
project: worker,
45+
url: "https://sentry10.cfdata.org/",
46+
authToken: sentryAuthToken,
47+
customHeader: accessHeader,
48+
});
49+
50+
console.log(`Creating release: ${release}`);
51+
await sentryCli.releases.new(release);
52+
53+
console.log("Finalizing release");
54+
await sentryCli.releases.finalize(release);
55+
56+
console.log("Inject debug ids");
57+
await sentryCli.execute(["sourcemaps", "inject", dir], true);
58+
59+
console.log("Uploading sourcemaps");
60+
await sentryCli.releases.uploadSourceMaps(release, {
61+
include: [dir],
62+
urlPrefix: "/",
63+
});
64+
}
65+
66+
generateRelease(targetWorker, sentryRelease)
67+
.then(() =>
68+
console.log(`Successfully uploaded sourcemaps for ${targetWorker}`)
69+
)
70+
.catch((e) => {
71+
console.error(e);
72+
process.exit(1);
73+
});

0 commit comments

Comments
 (0)