Skip to main content

v2.90.0

Binaries and the merged-pull-request list are on the GitHub releases page.

A build can stop after its scaffold stage​

orun.work, the app builder on Orunbase, builds an app from a baseline in two stages. The scaffold stage needs GitHub only: the code placed and branded, a repository created, the first pull request landed. The live stage needs the baseline's providers: credentials reconciled, deployed, probed. An account with no Cloudflare connection gets a code-only app by stopping after scaffold, and a later build runs the live stage (orun-cloud saas-orun-work WA5).

The bootstrap door tells the runner where to stop with one of two variables. Before this release the bootstrap driver ignored both, so a scaffold-only request ran the whole build. From this release:

  • orun agent serve --driver bootstrap reads ORUN_BASELINE_UNTIL and ORUN_BASELINE_PHASE. ORUN_BASELINE_UNTIL=<phase> adds --until <phase> and ORUN_BASELINE_PHASE=<phase> adds --phase <phase>, beside the --run-hooks --resume the driver always passes. When both are set the driver refuses to launch and names both. When neither is set the command is byte for byte what it was.
  • --resume composes with --until and --phase. It used to be refused beside either, which would have failed every stopped build. --resume now places the phases not already in place within the window the other flag names, so a runner restarted mid-stage resumes like a full build. A resumed run reports a phase past its stop as not part of this run, not already in place. A --redo outside the window is refused. --phase with --until is still refused.
  • A stopped build ends like any other. It emits the run-level done event, exits 0, and the driver reports completed.

Late-bound inputs​

A build document input can be declared lateBound: true. The value comes from a later stage, such as the workers.dev subdomain of a Cloudflare account the app has not connected yet. Its default is the placeholder the scaffold stage writes:

inputs:
subdomain:
type: string
default: your-workers-subdomain
lateBound: true

The live stage must replace the placeholder and may never keep it:

  • A run that --until stops before the build's last phase may leave the input unset, and places the placeholder.
  • Every other run must be given a value: a full build, --resume without a stop, --phase, and --until the last phase. Without one the run is refused before anything is placed, exit 1, naming the input and its placeholder. --phase counts because the platform runs the live stage on its own that way, and orun cannot tell a scaffold phase from a live one.
  • A resumed run takes a given value over the recorded one. Every other input is still refused when it disagrees with .orun/provenance.lock. The lock then records the new value. A recorded placeholder is not recovered as though it were a value, so a live run that forgot the value is refused instead of deploying the placeholder.

A late-bound input needs a default and at least two phases, and cannot also be secret. Each of these is a parse error.

A build that stops skips the readiness gate​

orun baseline new --local refused the whole build when any provider the baseline requires was not connected. That refused every code-only app. The registry reports a full build's readiness and carries no stages, so it cannot say which providers the phases up to the stop use.

From this release, --until <phase> skips the gate:

  • on the platform, the bootstrap door has already checked readiness for the phases that will run;
  • by hand, --until is the operator's choice, and each phase still checks the providers it needs when it starts (requires.probe).

The command still prints which providers are not connected. Without --until, including with --phase, the gate is unchanged. --via-platform is unchanged too: it does not forward --until or --phase.

What to do​

  • Nothing, for a build that does not stop: its command, its gate and its inputs are as they were.
  • A baseline offered to orun.work declares its stages on its card and marks inputs only the live stage can have as lateBound: true in its build document. orun does not re-place files the scaffold stage already placed, so the live stage replaces the placeholder wherever the scaffold wrote it, in its own modules or hooks.
  • Orunbase must run this release on its bootstrap runner before the apps plane asks for a stop. A driver older than v2.90.0 ignores both variables and runs the whole build.