CI gates that scope lint, typecheck, tests and build to the merge-request diff, rolled out to two repositories on the same day. Before that, the first CI/CD pipeline of a company that deployed by hand.
Fails loudly when the change list comes back empty
Caches only the package-manager store
100% conventional commits across 659 commits
gitlab ci
github actions
docker
measured impact · before → after
CI cache save−97%
1:36 → 0:03
◆ PipelineRunner
Verify only what changed, and fail if there's nothing to verify
Run the pipeline and compare before and after the merge-request gate I built: lint, typecheck, tests and build scoped to the MR diff, caching only the package-manager store. The times are the measured ones.
Every MR verifies only the files in the diff (git merge-base) and caches only the package-manager store.
lint·: pending
typecheck·: pending
test·: pending178 s
build·: pending
deploy·: pending
Cache save
0:03
Test suite
178 s
InfraMap
01
Company VPN
Internal servers are reachable only through the VPN, which I run.
→
02
Self-hosted GitLab
Upgrades, daily backups and rollback runbooks are on me.
→
03
MR gate
Lint, typecheck, tests and build on the diff; blocking before merge.
→
04
Production on DigitalOcean
DevOps access across the production environments.
Demo with fictitious data: no real clients and nothing from production.
Cases
Merge-request CI gate
Lint, typecheck, tests and build scoped to the MR diff, made blocking in two repositories on the same day.
The company's first CI/CD
Production deployments were manual and unverified; the pipeline automated build, tests and deploy.
Runbooks and self-hosted infrastructure
I run the self-hosted GitLab (upgrades, daily backups and rollback runbooks) and the company VPN.
Related projects
Upcard · 2026in production
Merge-request CI gate
Pipeline author
GitLab pipeline that scopes lint, typecheck, tests and build to the merge-request diff and fails loudly when the change list comes back empty. Blocking in two repositories.