One deploy, from a terminal, Cloudflare Workers Builds and GitHub
- otta deploy is the one deploy. From a terminal it is the whole first deployThe D1, KV, R2 and queue, their ids filled in, the build, the deploy, the secrets and the bootstrap. In Cloudflare Workers Builds and GitHub Actions it is the same command with --ci: nothing created, no secret touched, every missing value named before anything builds.
- Cloudflare Workers Builds is the way to ship every push.GitHub runs the tests on pull requests and keeps a manual deploy and PR previews, all running otta deploy instead of their own scripts.
- One file per app says how it shipscloudflare-config.json, read strictly, so a typo stops the deploy and names itself instead of changing how the app ships. Only the workspace packages an app uses are built.
- Only what changed deploys--watch-paths prints an app's build watch paths in Workers Builds' own syntax (the app, every workspace package it reaches, the root build files), --changed-since deploys from a diff, and #skipdeploy in a commit message skips a deploy anywhere.
- PR previews are their own Workers on the preview resources, removed when the PR closes; a manual preview follows its branch and goes when the branch is deleted. Deploys run in GitHub Environments, so a reviewer can approve a PR before its code sees a secret.
- Safer by defaultVersion URLs are off for every app, the CI secrets never reach a build script (only the names an app asks for in requiresSecrets do), a health check gives up after ten seconds, and a new app gets its own private files and backups buckets.
- Ottabase ProBlackbox's source map upload gets its token through requiresSecrets, and the demo builds with otta deploy --config-only.
3 breaking changes
- cloudflare-config.json drops workerName, outputDirectory, assetsDirectory and customBuildSteps, an unknown key stops the deploy, and every app Cloudflare deploys needs one.
- The APPS_TO_DEPLOY and CF_WORKER_SUBDOMAIN secrets are gone: deployable in each app's manifest decides what CI ships, and deploy.yml is manual.
- An app's deploy script runs otta deploy, and .github/scripts (the secret substitution and app discovery scripts) is gone.