Commit to the demo app
A Git event starts the lab pipeline. Sent by hand for now: no public webhook.
My lab proves canary gates and promotion, but the page a visitor can open was released without them. This is how I put the same gate in front of both: one commit, two delivery setups, one rule.
Swipe the drawing to see GitHub and the Cloudflare edge. →
Drawn by me, not a screenshot. Every line in it ran in a recorded run, and the red dots replay one release on each path. Both paths end in the same GitHub Actions job, so the gate is written once and the Cloudflare API token never enters the cluster.
In the lab, a release goes through Argo Rollouts canaries, an SLI analysis on the service mesh and Kargo promotion, and a bad version rolls back by itself. But the lab ran a sample image, and its CI only validated manifests.
The public demo is my own Cloudflare Worker. GitHub Actions tested it, then a script sent it to the edge at a typed share of traffic. Nothing measured the new version before everyone got it.
Cloud setup: a push to main only runs the tests. The edge release is a dispatch of the same workflow, which uploads the new version next to the old one at a small share of traffic, measures it, then promotes it or rolls it back. Dispatched by hand from main, it needs no lab: the fallback when the lab is down.
Self managed setup: Argo Workflows tests, builds and pushes the image inside the lab. Kargo promotes it through dev and staging under Rollouts and the mesh analysis, and only verified freight reaches the prod step, which dispatches the same edge release. The Cloudflare API token stays in GitHub.
The rule is the same on both paths: promote when the measured success ratio of the new version is at or above target, roll back otherwise, and no data means no promotion.
The new version gets 10 % of traffic. The previous version keeps the rest.
The job sends a fixed number of requests and counts only the answers of the new version.
It compares the success ratio of the new version with the target, the same target as the lab analysis.
No data
No promotion. The previous version keeps all traffic.
Below target
Roll back. All traffic returns to the previous version.
At or above target
Promote. The new version takes all traffic.
Both paths ran end to end, the self managed one on my existing lab, not a fresh rebuild.
In my Kubernetes lab, with Argo Workflows and Kargo.
Commit to the demo app
A Git event starts the lab pipeline. Sent by hand for now: no public webhook.
Argo Workflows: test, build, push
A failing test stopped the push: no image. Rootless BuildKit, no Docker socket.
2 min 33 s from event to image
Registry in the lab
The image runs the same code as the edge, on workerd.
Kargo freight
Kargo turns the new image in the lab registry into freight, a release candidate.
dev: first deploy
One pod, no analysis. Freight that runs here moves on to staging.
staging: mesh canary at 5 %
Argo Rollouts sends 5 % of traffic to the new version through Linkerd, and the SLI analysis measures it. A version returning 500 measured 0 and was aborted.
6 min 15 s from event to verified in staging
Kargo prod step
I promote by hand, and only verified freight. The aborted version was refused: "Freight is not available to this Stage". The step dispatches the edge release with that version.
1 min 35 s from promotion to 100 % at the edge
GitHub Actions only, no lab needed. The fallback when the lab is down.
Commit to the demo app
A push to main starts the workflow.
GitHub Actions: test
Type check and tests. A push to main stops here.
Dispatch by hand from main
Releases the head of main to the edge, through the same gate.
Edge: canary, gate, promote or roll back
The new version takes 10 % of traffic. The gate measures it and decides.
49 of 49 good: promoted in 10 s · 0 of 50 good: rolled back in 9 s
Status page
Shows the running version, its share of traffic and the last gate result.
Rendered from the recorded output of the runs, not screen recordings: the GitHub Actions log of the edge run and the runbook record of the lab run. Every value shown comes from those records.
The edge runs went through GitHub Actions from main against the live Worker, with no manual step. The lab run started from a push event sent by hand, and I approved the prod promotion; that wait is not counted. The refusal of the broken version was a server side dry run, so nothing was dispatched.