| name | Deployment Strategies |
| description | Comprehensive guide to modern deployment strategies including blue-green, canary, rolling updates, and zero-downtime deployments |
Deployment Strategies
Purpose
Master production deployment strategies:
- Zero-downtime deployments
- Risk mitigation
- Rollback procedures
- Progressive delivery
- Infrastructure patterns
When to Use
Invoke this skill when:
- Planning production deployments
- Designing deployment pipelines
- Troubleshooting failed deploys
- Implementing new deployment strategy
- Reducing deployment risk
Deployment Strategies
1. Blue-Green Deployment
Concept: Two identical environments (Blue=current, Green=new)
┌─────────────┐
│ Load │
│ Balancer │
└──────┬──────┘
│
├─────────────┐
│ │
┌────▼───┐ ┌───▼────┐
│ Blue │ │ Green │
│ (v1.0) │ │ (v2.0) │
│ LIVE │ │ IDLE │
└────────┘ └────────┘
After testing Green:
Switch traffic → Green becomes LIVE
If issues:
Switch back → Instant rollback
Implementation:
async function blueGreenDeploy(version: string): Promise<void> {
await deployToEnvironment('green', version);
const testsPass = await runSmokeTests('green');
if (!testsPass) {
throw new Error('Green environment failed tests');
}
await shiftTraffic('blue', 'green', {
steps: [10, 25, 50, 100],
intervalMinutes: 5,
});
const errors = await monitorErrors('green', { duration: '10m' });
if (errors > THRESHOLD) {
await rollback('blue');
throw new Error('Rollback triggered due to errors');
}
await decommission('blue');
}
Pros: ✅ Instant rollback, ✅ Zero downtime, ✅ Full testing before switch
Cons: ❌ 2x infrastructure cost, ❌ Database migrations tricky
2. Canary Deployment
Concept: Gradually roll out to small percentage of users
Phase 1: 5% traffic → v2.0
95% traffic → v1.0
Phase 2: 25% traffic → v2.0
75% traffic → v1.0
Phase 3: 50% traffic → v2.0
50% traffic → v1.0
Phase 4: 100% traffic → v2.0
Implementation:
interface CanaryConfig {
stages: number[];
stageDuration: string;
successCriteria: {
errorRate: number;
latencyP95: number;
cpuUsage: number;
};
}
async function canaryDeploy(version: string, config: CanaryConfig): Promise<void> {
for (const percentage of config.stages) {
console.log(`Canary: Routing ${percentage}% to ${version}`);
await routeTraffic(version, percentage);
await sleep(config.stageDuration);
const metrics = await collectMetrics(version, config.stageDuration);
if (!meetsSuccessCriteria(metrics, config.successCriteria)) {
await rollback(version);
throw new Error(`Canary failed at ${percentage}%: ${metrics}`);
}
}
console.log('Canary successful - deployed to 100%');
}
function meetsSuccessCriteria(metrics: Metrics, criteria: SuccessCriteria): boolean {
return (
metrics.errorRate < criteria.errorRate &&
metrics.latencyP95 < criteria.latencyP95 &&
metrics.cpuUsage < criteria.cpuUsage
);
}
Pros: ✅ Low risk, ✅ Real user feedback, ✅ Gradual rollout
Cons: ❌ Slower deployment, ❌ Complex routing, ❌ Inconsistent UX
3. Rolling Update
Concept: Update instances one-by-one or in batches
Initial State:
[v1.0] [v1.0] [v1.0] [v1.0] [v1.0]
Step 1: Update first instance
[v2.0] [v1.0] [v1.0] [v1.0] [v1.0]
Step 2: Update second instance
[v2.0] [v2.0] [v1.0] [v1.0] [v1.0]
Step 3: Update third instance
[v2.0] [v2.0] [v2.0] [v1.0] [v1.0]
...continue until all updated
Kubernetes Implementation:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
spec:
containers:
- name: app
image: my-app:2.0
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
Pros: ✅ Simple, ✅ No extra infrastructure, ✅ Gradual
Cons: ❌ Slow rollback, ❌ Mixed versions during deploy
4. Feature Flags (Dark Launch)
Concept: Deploy code but control feature activation
class PaymentService {
async processPayment(amount: number): Promise<void> {
if (featureFlags.isEnabled('new-payment-provider')) {
return this.newPaymentProvider.process(amount);
} else {
return this.oldPaymentProvider.process(amount);
}
}
}
featureFlags.enableFor('new-payment-provider', {
percentage: 10,
userIds: [123, 456],
countries: ['US', 'CA'],
});
Progressive Rollout:
await featureFlags.enable('new-feature', { internal: true });
await featureFlags.enable('new-feature', { beta: true });
await featureFlags.enable('new-feature', { percentage: 5 });
await featureFlags.enable('new-feature', { percentage: 25 });
await featureFlags.enable('new-feature', { percentage: 100 });
await featureFlags.remove('new-feature');
Pros: ✅ Instant rollback, ✅ A/B testing, ✅ Gradual rollout
Cons: ❌ Code complexity, ❌ Technical debt if not cleaned up
5. A/B Testing Deployment
Concept: Run multiple versions for comparison
interface ABTest {
name: string;
variants: {
control: string;
treatment: string;
};
traffic: {
control: number;
treatment: number;
};
metrics: string[];
duration: string;
}
async function deployABTest(test: ABTest): Promise<void> {
await deploy(test.variants.control);
await deploy(test.variants.treatment);
await routeTraffic({
[test.variants.control]: test.traffic.control,
[test.variants.treatment]: test.traffic.treatment,
});
const results = await collectMetrics(test.metrics, test.duration);
const winner = analyzeResults(results);
console.log(`Winner: ${winner}`);
await deploy(winner, { percentage: 100 });
}
Zero-Downtime Patterns
Health Checks
app.get('/health/ready', (req, res) => {
const checks = [
database.isConnected(),
cache.isConnected(),
];
const ready = checks.every(check => check);
res.status(ready ? 200 : 503).json({ ready, checks });
});
app.get('/health/live', (req, res) => {
res.status(200).json({ alive: true });
});
Graceful Shutdown
let isShuttingDown = false;
process.on('SIGTERM', async () => {
console.log('SIGTERM received, starting graceful shutdown');
isShuttingDown = true;
server.close(() => {
console.log('Server closed, no new connections');
});
await waitForCompletion({ timeout: 30000 });
await database.close();
process.exit(0);
});
app.use((req, res, next) => {
if (isShuttingDown) {
res.status(503).send('Server is shutting down');
} else {
next();
}
});
Database Migrations
Backward-Compatible Pattern:
Phase 1: Add new column (nullable)
Phase 2: Deploy code that writes to both old and new
Phase 3: Backfill data
Phase 4: Deploy code that reads from new
Phase 5: Remove old column
Never do destructive changes in same deploy as code!
Rollback Strategies
Automatic Rollback Triggers
interface RollbackCriteria {
errorRate: number;
latency: number;
availability: number;
customMetric?: () => boolean;
}
async function deployWithAutoRollback(
version: string,
criteria: RollbackCriteria
): Promise<void> {
const previousVersion = await getCurrentVersion();
try {
await deploy(version);
const metrics = await monitorDeployment(version, '10m');
if (shouldRollback(metrics, criteria)) {
throw new Error('Metrics exceeded thresholds');
}
} catch (error) {
console.error('Deployment failed, rolling back:', error);
await deploy(previousVersion);
throw error;
}
}
function shouldRollback(metrics: Metrics, criteria: RollbackCriteria): boolean {
return (
metrics.errorRate > criteria.errorRate ||
metrics.latencyP95 > criteria.latency ||
metrics.availability < criteria.availability ||
criteria.customMetric?.()
);
}
Deployment Checklist
Pre-Deployment
- [ ] Code reviewed and approved
- [ ] Tests passing (unit, integration, E2E)
- [ ] Database migrations tested
- [ ] Rollback plan documented
- [ ] Stakeholders notified
- [ ] Feature flags configured
- [ ] Monitoring/alerts set up
- [ ] Load testing completed (if major change)
- [ ] Security scan passed
- [ ] Deployment window scheduled
During Deployment
- [ ] Announcement sent to team
- [ ] Deployment started (timestamp)
- [ ] Health checks passing
- [ ] Metrics monitored
- [ ] Error rates normal
- [ ] Logs reviewed
- [ ] User reports monitored
- [ ] No rollback needed
Post-Deployment
- [ ] Smoke tests passed
- [ ] Metrics stable for 30 minutes
- [ ] No unusual errors
- [ ] Performance acceptable
- [ ] Documentation updated
- [ ] Deployment announcement (success)
- [ ] Post-mortem (if issues)
- [ ] Remove old infrastructure (if blue-green)
Related Skills
incident-response: For handling deployment issues
monitoring-setup: For deployment metrics
database-migrations: For schema changes
feature-flags: For progressive rollout