Deployment you can read end to end

Push a commit. Six stages run in order, each one documented, and the build that passes is the build that serves traffic.

v2.14Rollback in one command
Docs/Deploying/Promote a build

Promote a build

Deploy guidev2.14

A promotion moves an artifact that already passed the pipeline into production. Nothing is rebuilt, so what you tested is exactly what serves traffic.

Before you start

  • A signed artifact and a green pipeline
  • Deploy access in the target region
  • A rollback you have run before
Pipeline passed all six stagesCanary held for four minutesPromote to all 14 regions
Every promotion keeps the previous artifact warm for an hour, so a rollback is one command.
ts
export const promote = async () => {
  await rollout('checkout', { canary: 10 })
}
RegionInstancesRolloutord116Livefra116Livesyd116Canary

The docs are the product. Every page is generated from the same schema the CLI validates against, so a flag that exists is a flag you can look up.

FIG 0.1

Built once

One artifact, built and signed once, then promoted without ever being rebuilt.

FIG 0.2

Fanned out

The same bytes land in fourteen regions from a single promotion.

FIG 0.3

Kept warm

The last thirty artifacts stay ready, so nothing is rebuilt to go back.

FIG 1.0

From zero to deployed

Run init in the repo you already have. It reads the Dockerfile, writes the config, and deploys what it found.

Ksearch the docs
shell · 80×24
unsloppable init
reading Dockerfile
detected node 20.11
wrote deploy.toml
unsloppable deploy --env staging
building 3 services
waiting on health checks
live in ord1 · 41s

Six stages, every time

Resolve, compile, typecheck, test, sign, promote. The same six run on every commit, in the same order, with the same logs.

1.0Pipeline
1.1Locked dependency graph1.2Warm cache between runs
1.3Types and tests as gates1.4Signed before promotion
pipeline · 6 stages
resolveok
compileok
typecheckok
testok
signok
promoteok

Every change is a diff

Services are declared in code, so a rollout strategy arrives as a pull request and leaves a trail behind it.

2.0Diffs
2.1Service defined in TypeScript2.2Planned before it applies
2.3Reviewed like any change2.4Reverted by reverting
services/checkout/service.ts+2-2
01import { service } from '../runtime'
02import { image } from './image'
03
04const { region } = useDeploy()
05if (!region) return null
06
07export default service({
08 image, replicas: 2
09})
01import { service } from '../runtime'
02import { image, canary } from './image'
03
04const { region, build } = useDeploy()
05if (build.stage !== Stage.SIGNED) hold()
06
07export default service({
08 image, rollout: canary(10)
09})

Watch every instance land

Traffic moves ten percent at a time across 224 instances, and stops itself the moment error rates move.

3.0Rollout
3.1Canary at ten percent3.2Held for four minutes
3.3Halts on error budget3.4Reverts to the warm artifact
rollout · 224 instances
0 → 100% of traffic

Our on-call runbook is three lines long now. The first deploy a new engineer does is on their first afternoon.

Head of Platform, Ravenline

Rolling back used to be a meeting with four people in it. It is one line now, and the previous build is still warm.

SRE Lead, Tidepost

Every team on this page ships through the same six stages.More from these teams

Your first deploy is one command