From git push to a canary that aborts by itself
git push
Each change could break checkout: a slow query, a vulnerable library, a version that fails 30% of the requests. Who reviews all of them by hand?
CI
test
performance budget
image
Deploy
promote
@SpringBootTest(webEnvironment = RANDOM_PORT) @AutoConfigureTestRestTemplate @Testcontainers class CatalogApiTest { @Container @ServiceConnection static PostgreSQLContainer db = new PostgreSQLContainer("postgres:17"); ... }
Tests run: 3, Failures: 0
name: CI
permissions: contents: read
load: true
ghcr.io/<you>/boxoffice-catalog:sha-<commit>
Every action pinned to a commit SHA (version in a comment): a tag can be moved by an attacker.
thresholds: { 'http_req_duration{scenario:budget}': ['p(95)<300', 'p(99)<800'], 'http_req_failed{scenario:budget}': ['rate<0.01'], }
.github/ci/compose.perf.yaml
Thread.sleep(400)
k8s/overlays/gitops
prune
selfHeal
git revert
git log
The cluster credentials never leave the cluster.
Rollout
workloadRef
catalog-stable
catalog-canary
AnalysisTemplate
/actuator/prometheus
service
CHAOS_ERROR_RATE=0.3 committed to the overlay. What happens?
CHAOS_ERROR_RATE=0.3
[]
failureLimit: 1
RolloutAborted
Lead time is dominated by tests, image build, Argo CD polling (≤ 3 min) and the canary pauses — a deliberate price for safety.
main
Outline: (1) why automate safety; (2) CI with Testcontainers; (3) supply chain: Trivy, SBOM, provenance; (4) performance budget; (5) GitOps with Argo CD; (6) canary with Argo Rollouts; (7) measure: lead time.