Blue Green Deployment
Implement blue-green deployment strategy with zero-downtime switching, health validation, and automatic rollback
$ npx claude-code-templates@latest --command="deployment/blue-green-deployment" --yesRequires Claude Code. The command adds this command to your project's .claudedirectory — nothing runs on ToolZip's servers.
What's inside this command
Component source (preview)
Blue-Green Deployment Strategy
Implement blue-green deployment: $ARGUMENTS
Current Infrastructure State
- Load balancer config: @nginx.conf or @haproxy.cfg or cloud LB configuration
- Current deployment: !
curl -s https://api.example.com/version 2>/dev/null || echo "Version endpoint needed" - Container orchestration: !
kubectl get deployments 2>/dev/null || docker service ls 2>/dev/null || echo "Container platform detection needed" - Health endpoints: !
curl -s https://api.example.com/health 2>/dev/null | jq -r '.status // "Unknown"' || echo "Health check setup needed" - DNS configuration: Check for DNS management capabilities
Task
Implement production-grade blue-green deployment with comprehensive validation and monitoring.
Blue-Green Architecture Components
1. Infrastructure Setup
Load Balancer Configuration (NGINX)
upstream blue {
server blue-app-1:3000;
server blue-app-2:3000;
server blue-app-3:3000;
}
upstream green {
server green-app-1:3000;
server green-app-2:3000;
server green-app-3:3000;
}
# Current active environment
upstream active {
server blue-app-1:3000;
server blue-app-2:3000;
server blue-app-3:3000;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://active;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Environment $environment;
# Health check configuration
proxy_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
# Retry configuration
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
proxy_next_upstream_tries 2;
}
# Health check endpoint
location /health {
access_log off;
proxy_pass http://active/health;
proxy_connect_timeout 1s;
proxy_send_timeout 1s;
proxy_read_timeout 1s;
}
# Environment indicator
location /environment {
access_log off;
return 200 $environment;
add_header Content-Type text/plain;
}
}
HAProxy Configuration
global
daemon
log 127.0.0.1:514 local0
stats socket /var/run/haproxy.sock mode 600 level admin
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
option httplog
option dontlognull
# Blue environment
backend blue_backend
balance roundrobin
option httpchk GET /health
http-check expect status 200
server blue1 blue-app-1:3000 check
server blue2 blue-app-2:3000 check
server blue3 blue-app-3:3000 check
# Green environment
backend green_backend
balance roundrobin
option httpchk GET /health
http-check expect status 200
server green1 green-app-1:3000 check
server green2 green-app-2:3000 check
server green3 green-app-3:3000 check
# Frontend with switching logic
frontend main_frontend
bind *:80
# Environment switching via ACL
use_backend blue_backend if { var(txn.environment) -m str blue }
use_backend green_backend if { var(txn.environment) -m str green }
default_backend blue_backend # Default to blue
# Stats interface
frontend stats
bind *:8404
stats enable
stats uri /stats
stats refresh 5s
2. Kubernetes Blue-Green Implementation
Blue-Green Service Management
# blue-service.yaml
apiVersion: v1
kind: Service
metadata:
name: app-service-blue
labels:
app: myapp
environment: blue
spec:
selector:
app: myapp
environment: blue
ports:
- port: 80
targetPort: 3000
type: ClusterIP
---
# green-service.yaml
apiVersion: v1
kind: Service
metadata:
name: app-service-green
labels:
app: myapp
environment: green
spec:
selector:
app: myapp
environment: green
ports:
- port: 80
targetPort: 3000
type: ClusterIP
---
# active-service.yaml (points to current active environment)
apiVersion: v1
kind: Service
metadata:
name: app-service-active
labels:
app: myapp
environment: active
spec:
selector:
app: myapp
environment: blue # Switch this to 'green' during deployment
ports:
- port: 80
targetPort: 3000
type: LoadBalancer
Blue-Green Deployments
# blue-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-blue
labels:
app: myapp
environment: blue
spec:
replicas: 3
selector:
matchLabels:
app: myapp
environment: blue
template:
metadata:
labels:
app: myapp
environment: blue
spec:
containers:
- name: app
image: myapp:v1.0.0
ports:
- containerPort: 3000
env:
- name: ENVIRONMENT
value: "blue"
- name: VERSION
value: "v1.0.0"
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 5
periodSeconds: 5
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
---
# green-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-green
labels:
app: myapp
environment: green
spec:
replicas: 3
selector:
matchLabels:
app: myapp
environment: green
template:
metadata:
labels:
app: myapp
environment: green
spec:
containers:
- name: app
image: myapp:v1.1.0 # New version
ports:
- containerPort: 3000
env:
- name: ENVIRONMENT
value: "green"
- name: VERSION
value: "v1.1.0"
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 5
periodSeconds: 5
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
3. Deployment Automation Scripts
Blue-Green Deployment Script
```bash
#!/bin/bash
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/config.sh"
Configuration
BLUE_ENV="blue"
GREEN_ENV="green"
HEALTH_CHECK_URL="${APP_URL}/health"
READY_CHECK_URL="${APP_URL}/ready"
VERSION_URL="${APP_URL}/version"
Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log() {
echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] $1${NC}"
}
warn() {
echo -e "${YELLOW}[WARNING] $1${NC}"
}
error() {
echo -e "${RED}[ERROR] $1${NC}"
exit 1
}
Get current active environment
get_current_env() {
if kubectl get service app-service-active &>/dev/null; then
kubectl get service app-service-active -o jsonpath='{.spec.selector.environment}'
else
echo "blue" # Default to blue if service doesn't exist
fi
}
Get inactive environment (opposite of current)
get_inactive_env() {
local current_env=$1
if [ "$current_env" = "blue" ]; then
echo "green"
else
echo "blue"
fi
}
Deploy to inactive environment
deploy_to_inactive() {
local version=$1
local current_env=$(get_current_env)
local inactive_env=$(get_inactive_env "$current_env")
log "Current active environment: $current_env"
log "Deploying version $version to $inactive_env environment"
# Update deployment with new image
kubectl set image deployment/app-$inactive_env app=myapp:$version
# Wait for rollout to complete
log "Waiting for deployment rollout to complete..."
kubectl rollout status deployment/app-$inactive_env --timeout=600s
# Verify pods are running
log "Verifying pods are running..."
kubectl wait --for=condition=ready pod -l app=myapp,environment=$inactive_env --timeout=300s
log "Deployment to $inactive_env environment completed successfully"
}
Health check function
health_check() {
local env=$1
local service_url="http://app-service-$env.$NAMESPACE.svc.cluster.local"
log "Performing health check for $env environment..."
# Use kubectl port-forward for internal testing
kubectl port-forward service/app-service-$env 8080:80 &
local port_forward_pid=$!
sleep 5 # Wait for port-forward to establish
local health_status=1
local attempts=0
local max_attempts=10
while [ $attempts -lt $max_attempts ]; do
if curl -f -s http://localhost:8080/health > /dev/null; then
health_status=0
break
fi
attempts=$((attempts + 1))
log "Health check attempt $attempts/$max_attempts failed, retrying..."
sleep 10
done
# Clean up port-forward
kill $port_forward_pid 2>/dev/null || true
if [ $health_status -eq 0 ]; then
log "Health check passed for $env environment"
return 0
else
error "Health check failed for $env environment after $max_attempts attempts"
fi
}
Smoke tests
run_smoke_tests() {
local env=$1
log "Running smoke tests for $env environment..."
# Port-forward for testing
kubectl port-forward service/app-service-$env 8080:80 &
local port_forward_pid=$!
sleep 5
local test_results=()
# Test 1: Health endpoint
if curl -f -s http://localhost:8080/health | jq -e '.status == "healthy"' > /dev/null; then
test_results+=("✅ Health endpoint")
else
test_results+=("❌ Health endpoint")
fi
# Test 2: Version endpoint
if curl -f -s http://localhost:8080/version > /dev/null; then
test_results+=("✅ Version endpoint")
else
test_results+=("❌ Version endpoint")
fi
# Test 3: Main application endpoint
if curl -f -s http://localhost:8080/ > /dev/null; then
test_results+=("✅ Main endpoint")
else
test_results+=("❌ Main endpoint")
fi
# Test 4: Database connectivity (if applicable)
if curl -f -s http://localhost:8080/db-health 2>/dev/null | jq -e '.connected == true' > /dev/null; then
test_results+=("✅ Database connectivity")
else
test_results+=("⚠️ Database connectivity (not tested)")
fi
# Clean up port-forward
kill $port_forward_pid 2>/dev/null || true
# Display results
log "Smoke test results for $env:"
printf '%s\n' "${test_results[@]}"
# Check if all critical tests passed
local failed_tests=$(printf '%s\n' "${test_results[@]}" | grep -c "❌" || true)
if [ "$failed_tests" -gt 0 ]; then
error "Smoke tests failed with $failed_tests failures"
fi
log "All smoke tests passed for $env environment"
}
Switch traffic to new environment
switch_traffic() {
local target_env=$1
local current_env=$(get_current_env)
if [ "$target_env" = "$current_env" ]; then
warn "Target environment ($target_env) is already active"
return 0
fi
log "Switching traffic from $current_env to $target_env"
# Create backup of current service configuration
kubectl get service app-service-active -o yaml > "/tmp/service-backup-$(date +%Y%m%d-%H%M%S).yaml"
# Update service selector to point to new environment
kubectl patch service app-service-active -p '{"spec":{"selector":{"environment":"'$target_env'"}}}'
# Verify the switch
sleep 10
local new_active_env=$(get_current_env)
if
Preview truncated. View the full source on GitHub →
Related Claude Code Commands
Add Changelog
Generate and maintain project changelog with Keep a Changelog format
Containerize Application
Containerize application with optimized Docker configuration, security, and multi-stage builds
Ci Setup
Setup comprehensive CI/CD pipeline with automated testing, building, and deployment
Prepare Release
Prepare and validate release packages with comprehensive testing, documentation, and automation
Setup Automated Releases
Setup automated release workflows with semantic versioning, conventional commits, and comprehensive automation
Rollback Deploy
Rollback deployment to previous version with safety checks, database considerations, and monitoring
Catalog data and component content are sourced from the open-source davila7/claude-code-templates project (MIT license). ToolZip curates the listing and writes original descriptions; every component links back to its original source. Claude Code is a product of Anthropic. ToolZip is an independent catalog and is not affiliated with or endorsed by Anthropic.