// ci/cd & release engineering · 2019 → today
Build only what changed, ship every merge
I built a CI/CD platform from scratch and have kept evolving it as the team and codebase grew. Today it runs on self-hosted Buildkite defined in Terraform, driven by an in-house TypeScript build-and-deploy engine. It models the monorepo’s dependency graph, so each change builds and deploys only the packages it affects.
Every merge to master, end to end
- mergeto master
- package graphwhat's affected?
- build in parallelaffected packages only
- Validate gate
- stagingauto-deploy
- productionlive, no release train
How it evolved: pipelines → a graph-aware release engine
- hosted pipelines
- Buildkite + build engine
- continuous deployment
- merge queue · staging
- one Validate gate
# in practice
- Merged work reaches customers automatically. There has been no release train since 2022.
- A small fix rebuilds a handful of packages, not the whole platform.
- Every PR passes one required quality gate, and
/deployon a PR puts it into a test environment. - Deploys wait for healthy tasks and detect rollbacks, so a bad release stops itself.