From b1966dfe57713f3ddcaa781d0551a1088a22424e Mon Sep 17 00:00:00 2001 From: Christian Sparks Date: Wed, 5 Feb 2025 09:11:03 -0600 Subject: [PATCH] BANDA-631 Add worker name override for workers CI (#7990) --- .changeset/cool-monkeys-exercise.md | 5 ++ .../wrangler/src/__tests__/deploy.test.ts | 81 +++++++++++++++++++ .../wrangler/src/__tests__/output.test.ts | 8 ++ packages/wrangler/src/deploy/index.ts | 16 +++- .../src/environment-variables/factory.ts | 1 + .../environment-variables/misc-variables.ts | 9 +++ packages/wrangler/src/output.ts | 8 ++ packages/wrangler/src/versions/upload.ts | 15 +++- 8 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 .changeset/cool-monkeys-exercise.md diff --git a/.changeset/cool-monkeys-exercise.md b/.changeset/cool-monkeys-exercise.md new file mode 100644 index 000000000000..a687f1c6b1fe --- /dev/null +++ b/.changeset/cool-monkeys-exercise.md @@ -0,0 +1,5 @@ +--- +"wrangler": patch +--- + +Add WRANGLER_CI_OVERRIDE_NAME for Workers CI diff --git a/packages/wrangler/src/__tests__/deploy.test.ts b/packages/wrangler/src/__tests__/deploy.test.ts index 86e7e185dafd..0dd3ba066aad 100644 --- a/packages/wrangler/src/__tests__/deploy.test.ts +++ b/packages/wrangler/src/__tests__/deploy.test.ts @@ -14,6 +14,7 @@ import { printBundleSize, printOffendingDependencies, } from "../deployment-bundle/bundle-reporter"; +import { clearOutputFilePath } from "../output"; import { writeAuthConfigFile } from "../user"; import { mockAccountId, mockApiToken } from "./helpers/mock-account-id"; import { mockAuthDomain } from "./helpers/mock-auth-domain"; @@ -90,6 +91,7 @@ describe("deploy", () => { afterEach(() => { vi.unstubAllGlobals(); clearDialogs(); + clearOutputFilePath(); }); it("should output log file with deployment details", async () => { @@ -177,6 +179,85 @@ describe("deploy", () => { expect(std.err).toMatchInlineSnapshot(`""`); }); + it("should successfully override name with WRANGLER_CI_OVERRIDE_NAME", async () => { + vi.stubEnv("WRANGLER_CI_OVERRIDE_NAME", "test-name"); + writeWorkerSource(); + writeWranglerConfig({ + name: "name-to-override", + workers_dev: true, + }); + mockServiceScriptData({ + scriptName: "test-name", + script: { id: "test-name", tag: "abc123" }, + }); + mockUploadWorkerRequest(); + mockSubDomainRequest(); + mockGetWorkerSubdomain({ enabled: false }); + mockUpdateWorkerSubdomain({ enabled: true }); + + await runWrangler("deploy ./index.js"); + expect(std.out).toMatchInlineSnapshot(` + "Total Upload: xx KiB / gzip: xx KiB + Worker Startup Time: 100 ms + Uploaded test-name (TIMINGS) + Deployed test-name triggers (TIMINGS) + https://test-name.test-sub-domain.workers.dev + Current Version ID: Galaxy-Class" + `); + expect(std.err).toMatchInlineSnapshot(`""`); + }); + + it("should successfully override name with WRANGLER_CI_OVERRIDE_NAME and outputs the correct output file", async () => { + vi.stubEnv("WRANGLER_OUTPUT_FILE_DIRECTORY", "override-output"); + vi.stubEnv("WRANGLER_OUTPUT_FILE_PATH", ""); + vi.stubEnv("WRANGLER_CI_OVERRIDE_NAME", "test-name"); + writeWorkerSource(); + writeWranglerConfig({ + name: "override-name", + workers_dev: true, + }); + mockUploadWorkerRequest(); + mockSubDomainRequest(); + mockGetWorkerSubdomain({ enabled: true }); + + await runWrangler("deploy ./index.js --env staging"); + expect(std.out).toMatchInlineSnapshot(` + "Total Upload: xx KiB / gzip: xx KiB + Worker Startup Time: 100 ms + Uploaded test-name (TIMINGS) + Deployed test-name triggers (TIMINGS) + https://test-name.test-sub-domain.workers.dev + Current Version ID: Galaxy-Class" + `); + expect(std.err).toMatchInlineSnapshot(`""`); + + const outputFilePaths = fs.readdirSync("override-output"); + + expect(outputFilePaths.length).toEqual(1); + expect(outputFilePaths[0]).toMatch(/wrangler-output-.+\.json/); + const outputFile = fs.readFileSync( + path.join("override-output", outputFilePaths[0]), + "utf8" + ); + const entries = outputFile + .split("\n") + .filter(Boolean) + .map((e) => JSON.parse(e)); + + expect(entries.find((e) => e.type === "deploy")).toMatchObject({ + targets: ["https://test-name.test-sub-domain.workers.dev"], + // Omitting timestamp for matching + // timestamp: ... + type: "deploy", + version: 1, + version_id: "Galaxy-Class", + worker_name: "test-name", + worker_tag: "tag:test-name", + worker_name_overridden: true, + wrangler_environment: "staging", + }); + }); + it("should resolve wrangler.toml relative to the entrypoint", async () => { fs.mkdirSync("./some-path/worker", { recursive: true }); fs.writeFileSync( diff --git a/packages/wrangler/src/__tests__/output.test.ts b/packages/wrangler/src/__tests__/output.test.ts index c5e0fccd3e1c..309f889a12c0 100644 --- a/packages/wrangler/src/__tests__/output.test.ts +++ b/packages/wrangler/src/__tests__/output.test.ts @@ -86,6 +86,8 @@ describe("writeOutput()", () => { worker_tag: "ABCDE12345", version_id: "1234", targets: undefined, + worker_name_overridden: false, + wrangler_environment: undefined, }); const outputFile = readFileSync(WRANGLER_OUTPUT_FILE_PATH, "utf8"); @@ -104,6 +106,8 @@ describe("writeOutput()", () => { worker_tag: "ABCDE12345", version_id: "1234", targets: undefined, + worker_name_overridden: false, + wrangler_environment: undefined, }, ]); }); @@ -151,6 +155,8 @@ describe("writeOutput()", () => { worker_tag: "ABCDE12345", version_id: "1234", targets: undefined, + worker_name_overridden: false, + wrangler_environment: undefined, }); const outputFilePaths = readdirSync("output"); @@ -172,6 +178,8 @@ describe("writeOutput()", () => { worker_tag: "ABCDE12345", version_id: "1234", targets: undefined, + worker_name_overridden: false, + wrangler_environment: undefined, }, ]); }); diff --git a/packages/wrangler/src/deploy/index.ts b/packages/wrangler/src/deploy/index.ts index dd1bc21f004c..745e44b1681f 100644 --- a/packages/wrangler/src/deploy/index.ts +++ b/packages/wrangler/src/deploy/index.ts @@ -3,6 +3,7 @@ import path from "node:path"; import { getAssetsOptions, validateAssetsArgsAndConfig } from "../assets"; import { configFileName, readConfig } from "../config"; import { getEntry } from "../deployment-bundle/entry"; +import { getCIOverrideName } from "../environment-variables/misc-variables"; import { UserError } from "../errors"; import { run } from "../experimental-flags"; import { logger } from "../logger"; @@ -336,7 +337,18 @@ async function deployWorker(args: DeployArgs) { } const beforeUpload = Date.now(); - const name = getScriptName(args, config); + let name = getScriptName(args, config); + + const ciOverrideName = getCIOverrideName(); + let workerNameOverridden = false; + if (ciOverrideName !== undefined && ciOverrideName !== name) { + logger.warn( + `Failed to match Worker name. Your config file is using the Worker name "${name}", but the CI system expected "${ciOverrideName}". Overriding using the CI provided Worker name. Workers Builds connected builds will attempt to open a pull request to resolve this config name mismatch.` + ); + name = ciOverrideName; + workerNameOverridden = true; + } + assert( name, 'You need to provide a name when publishing a worker. Either pass it as a cli arg with `--name ` or in your config file as `name = ""`' @@ -390,6 +402,8 @@ async function deployWorker(args: DeployArgs) { worker_tag: workerTag, version_id: versionId, targets, + wrangler_environment: args.env, + worker_name_overridden: workerNameOverridden, }); metrics.sendMetricsEvent( diff --git a/packages/wrangler/src/environment-variables/factory.ts b/packages/wrangler/src/environment-variables/factory.ts index 8a2124386ff7..f91e184e20f5 100644 --- a/packages/wrangler/src/environment-variables/factory.ts +++ b/packages/wrangler/src/environment-variables/factory.ts @@ -23,6 +23,7 @@ type VariableNames = | "WRANGLER_OUTPUT_FILE_DIRECTORY" | "WRANGLER_OUTPUT_FILE_PATH" | "WRANGLER_CI_MATCH_TAG" + | "WRANGLER_CI_OVERRIDE_NAME" | "WRANGLER_BUILD_CONDITIONS" | "WRANGLER_BUILD_PLATFORM" | "WRANGLER_UNENV_RESOLVE_PATHS" diff --git a/packages/wrangler/src/environment-variables/misc-variables.ts b/packages/wrangler/src/environment-variables/misc-variables.ts index 3af8754f4664..1377961f6ce7 100644 --- a/packages/wrangler/src/environment-variables/misc-variables.ts +++ b/packages/wrangler/src/environment-variables/misc-variables.ts @@ -101,6 +101,15 @@ export const getCIMatchTag = getEnvironmentVariableFactory({ variableName: "WRANGLER_CI_MATCH_TAG", }); +/** + * `WRANGLER_CI_OVERRIDE_TAG` specifies a worker tag + * + * If this is set, Wrangler will override the worker name with this tag + */ +export const getCIOverrideName = getEnvironmentVariableFactory({ + variableName: "WRANGLER_CI_OVERRIDE_NAME", +}); + /** * `WRANGLER_BUILD_CONDITIONS` specifies the "build conditions" to use when importing packages at build time. * diff --git a/packages/wrangler/src/output.ts b/packages/wrangler/src/output.ts index 4b193031e506..3914dc6ce717 100644 --- a/packages/wrangler/src/output.ts +++ b/packages/wrangler/src/output.ts @@ -93,6 +93,10 @@ interface OutputEntryDeployment extends OutputEntryBase<"deploy"> { version_id: string | null; /** A list of URLs that represent the HTTP triggers associated with this deployment */ targets: string[] | undefined; + /** set if the worker's name was overridden */ + worker_name_overridden: boolean; + /** wrangler environment used */ + wrangler_environment: string | undefined; } interface OutputEntryPagesDeployment extends OutputEntryBase<"pages-deploy"> { @@ -138,6 +142,10 @@ interface OutputEntryVersionUpload extends OutputEntryBase<"version-upload"> { version_id: string | null; /** The preview URL associated with this version upload */ preview_url: string | undefined; + /** set if the worker's name was overridden */ + worker_name_overridden: boolean; + /** wrangler environment used */ + wrangler_environment: string | undefined; } interface OutputEntryVersionDeployment diff --git a/packages/wrangler/src/versions/upload.ts b/packages/wrangler/src/versions/upload.ts index bab53ae28630..fdcb619024aa 100644 --- a/packages/wrangler/src/versions/upload.ts +++ b/packages/wrangler/src/versions/upload.ts @@ -32,6 +32,7 @@ import { validateNodeCompatMode } from "../deployment-bundle/node-compat"; import { loadSourceMaps } from "../deployment-bundle/source-maps"; import { confirm } from "../dialogs"; import { getMigrationsToUpload } from "../durable"; +import { getCIOverrideName } from "../environment-variables/misc-variables"; import { UserError } from "../errors"; import { getFlag } from "../experimental-flags"; import { logger } from "../logger"; @@ -352,7 +353,17 @@ export const versionsUploadCommand = createCommand({ const cliAlias = collectKeyValues(args.alias); const accountId = args.dryRun ? undefined : await requireAuth(config); - const name = getScriptName(args, config); + let name = getScriptName(args, config); + + const ciOverrideName = getCIOverrideName(); + let workerNameOverridden = false; + if (ciOverrideName !== undefined && ciOverrideName !== name) { + logger.warn( + `Failed to match Worker name. Your config file is using the Worker name "${name}", but the CI system expected "${ciOverrideName}". Overriding using the CI provided Worker name. Workers Builds connected builds will attempt to open a pull request to resolve this config name mismatch.` + ); + name = ciOverrideName; + workerNameOverridden = true; + } assert( name, @@ -407,6 +418,8 @@ export const versionsUploadCommand = createCommand({ worker_tag: workerTag, version_id: versionId, preview_url: versionPreviewUrl, + wrangler_environment: args.env, + worker_name_overridden: workerNameOverridden, }); }, });