cloudflare / cloudflare/developer-platform

Deploy to Cloudflare: ZodError on previews_base_config.deploy_command aborts every submit, including Cloudflare's own templates

Aperta
#70 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Nessun dato sulla lingua
Stelle
1
Fork
0
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

### What version of `wrangler` are you using?

Not applicable — this is the dashboard's Deploy to Cloudflare flow, no local wrangler involved.

### What operating system and version are you using?

macOS, Chrome 148–150.

### Please provide a link to a minimal reproduction

https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/templates/tree/main/hello-world-do-template

### Describe the Bug

Pressing **Deploy** on the Deploy to Cloudflare setup form throws an uncaught `ZodError` and the submission aborts. It reproduces with Cloudflare's own templates, so it is not specific to any one repository.

```
Uncaught (in promise) ZodError: [
{
"expected": "string",
"code": "invalid_type",
"path": [
"previews_base_config",
"deploy_command"
],
"message": "Invalid input: expected string, received undefined"
}
]
at at (cf-useBuilds.Q3C8LSNY.js:3:1874)
at Hl (cf-ConfigureTemplate.CN_WXn13.js:38:62815)
at Zl (cf-ConfigureTemplate.CN_WXn13.js:38:68824)
at async onSubmit (cf-ConfigureTemplate.CN_WXn13.js:38:74781)
at async cf-authenticated-app.T9NSyoF.js:22:22118
```

**Steps to reproduce**

1. Open the link above while signed in to an affected account.
2. Fill in the form (the defaults are fine).
3. Press **Deploy**.
4. The form shows *"Setting up your repository. This may take a few seconds…"*, then returns to its previous state. The `ZodError` above is in the console.

**What the user is left with.** This is the part worth prioritising: the flow fails *silently*. By the time it throws, the dashboard has already created a Worker from the placeholder template and a repository in the user's GitHub account. What remains is:

* A repository containing exactly two files, `README.md` and the parsed wrangler config, committed by `cloudflare-workers-and-pages[bot]` with the message `Uploading template.` (a working import commits as `cloudflare[bot]` with `source repo import` and contains the full tree).
* No queued build — Workers Builds is never configured, so nothing ever builds.
* The placeholder Worker still deployed and answering `Hello world`.
* **A dashboard that reports success.**

Nothing surfaces an error to the user, so people reasonably believe the install worked and go looking for the fault in their own project.

### Scope: what we varied

We chased this for a day assuming it was our repository. It is not. Each row is a real attempt:

| Repository | Cloudflare account | GitHub account | Result |
| --- | --- | --- | --- |
| Our app, current | A | 1 | ZodError |
| Our app, byte-exact tree that imported successfully on 11 Aug | B (created that day) | 2 (created that day) | ZodError |
| Our app, with the `deploy` script removed so the form falls back to its documented defaults | A | 1 | ZodError |
| **`cloudflare/templates` → `hello-world-do-template`** | A | 1 | **ZodError** |
| **`cloudflare/templates` → `hello-world-do-template`** | C | 3 | **ZodError** |

Four repositories, three Cloudflare accounts, three GitHub identities, two browsers. The error follows none of them.

The second row is the useful control: that tree is byte-for-byte the one Cloudflare imported successfully on **2026-08-11 05:37 UTC** (95 files, `cloudflare[bot]`, `source repo import`). Published unchanged as a separate repository and deployed again the next day on a brand new account, it fails. Same bytes, different day, different outcome.

### Analysis

From `cf-ConfigureTemplate.CN_WXn13.js`, the build settings sent to the API are assembled as:

```js
let m = a ? !!i.enable_preview_builds : !!i.non_production_branch_builds,
h = a ? i.preview_command : i.non_production_branch_deploy_command;
```

```js
return {
script_tag: e,
git_repository: { ...n, branch: t },
production_settings: { ...d, deploy_command: o },
previews_enabled: c,
previews_base_config: { ...d, deploy_command: s } // s ← h, undefined here
}
```

and the form's default values are:

```js
[jo]: n && r && `build` in n ? `${r} run build` : ``,
[Fo]: n && r && `deploy` in n ? `${r} run deploy` : `npx wrangler deploy`,
[ji]: `npx wrangler versions upload`, // non_production_branch_deploy_command
[Uo]: `npx wrangler preview`, // preview_command
```

So `build_command` and the production `deploy_command` are derived from the repository's `package.json` and are always populated — both are visibly filled in on the form in every failing case. `previews_base_config.deploy_command` comes only from a form field: `preview_command` when the account has Worker Previews enabled, otherwise `non_production_branch_deploy_command`. Neither field is rendered on the deploy-to-workers template form, and the value reaches the schema as `undefined`.

Two things point at the Worker Previews rollout rather than at anything a user controls:

* Affected accounts take the `createPath: 'worker_previews'` branch during build-token creation, which selects `i.preview_command` — the field with no input on this form.
* Both defaults are hardcoded in the bundle. Nothing in a repository can supply this value, which is consistent with the documented behaviour that [Workers Builds does not honour build configuration from the Wrangler file](https://developers.cloudflare.com/workers/ci-cd/builds/configuration/).

### Suggested fix

Defaulting `h` to `` `npx wrangler versions upload` `` when the form does not collect it would restore the flow, since that is already the documented default for the non-production branch deploy command.

Separately, and regardless of this specific bug: it would help a lot if a failed submit did not leave behind a two-file repository, an unconfigured build and a placeholder Worker under a success message. The silent half-completed state cost far more time than the error itself.

### Please provide any relevant error logs

Related, and possibly the same root cause seen from the other end: cloudflare/cf-platform-issues#31 reports the two-file repository and the Worker stuck on the Hello World placeholder, which is exactly the state this `ZodError` leaves behind.

The three repositories used in the table above are public and unchanged, if they are useful for reproducing:

* `thankywal/muxel-probe-a` — the byte-exact tree that imported successfully on 11 Aug
* `thankywal/muxel-probe-c` — same tree with the `deploy` script removed
* `thankywal/muxel` — the application itself

Happy to supply HAR files, the failing request payloads, or account IDs privately if that would help.

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Reproduce the failure from the Deploy to Cloudflare URL and inspect the cf-ConfigureTemplate and cf-useBuilds entry points mentioned in the stack trace, especially construction of previews_base_config.deploy_command. Confirm the deploy flow supplies a valid preview deploy command, then verify submission completes without a ZodError, creates the full repository, configures the build, and reports failures instead of success.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
javascript
Ambito
cloud, devops
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Tranquilla
Chiarezza
Abbastanza chiara
Idoneità per principianti
55/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.