The Challenge
The microservices ecosystem had grown to 20+ services, each owned by different teams deploying independently. API compatibility issues were causing 3-4 production incidents per month, with each incident requiring emergency rollbacks and costing an average of $50K in downtime and engineering time.
- •20+ microservices with complex interdependencies
- •3-4 production incidents monthly due to API breaking changes
- •Integration tests taking 2+ hours and frequently flaky
- •No visibility into API compatibility until deployment to staging
- •Teams deploying blindly without knowing impact on consumers
The Solution
- Implemented Pact.js for consumer-driven contract testing across all services
- Deployed PactBroker as central contract registry with version management
- Created 'can-i-deploy' checks integrated into GitLab CI pipelines
- Built automated contract generation from OpenAPI specs
- Established contract versioning strategy aligned with semantic versioning
We adopted a consumer-driven approach where frontend teams define their API expectations as contracts. These contracts are published to PactBroker, and backend services verify against them before deployment. The 'can-i-deploy' CLI tool prevents any service from deploying if it would break existing contracts.
Consumer Contract Definition
typescript
Key Results
Quantifiable outcomes achieved through this implementation
0
API Incidents
100%
Deploy Confidence
-85%
Integration Time
12+
Months Stability
Performance Metrics
Loading chart...
Contract Testing Flow
1
Consumer Defines Contract
Frontend team writes Pact tests specifying expected API behavior and response schemas
2
Publish to PactBroker
Contracts are versioned and stored centrally, tagged with consumer version and environment
3
Provider Verification
Backend services verify their implementation against all consumer contracts automatically
4
Can-I-Deploy Check
CI pipeline queries PactBroker to ensure deployment won't break any consumers