Skip to content
Harjot Singh Rana
Back to blog
DevOpsCI/CDGoKubernetes7 min read

Designing a Zero-Downtime Deployment Pipeline

September 18, 2024

The deployment problem

Deploying software is the most dangerous operation in any engineering organization. A bad deployment can take down production, lose data, and wake you up at 3am. Zero-downtime deployments aren't just about user experience — they're about engineering confidence.

Canary releases

Instead of routing all traffic to the new version at once, a canary release sends a small percentage of traffic to the new version first. If error rates spike, the canary is automatically rolled back and only a tiny fraction of users were affected.

Automated health checks

Before routing any traffic to a new deployment, run a comprehensive health check suite. This should include:

  • HTTP health endpoint responding 200
  • Database connectivity
  • Upstream dependency health
  • Synthetic transaction success

Rollback automation

A deployment isn't complete until you've verified the rollback works. Every deployment should automatically create a rollback point, and the rollback should be a single command or button click.

The orchestration layer

We built a deployment orchestrator in Go that manages the entire lifecycle:

type Deployment struct {
    Service   string
    Version   string
    Strategy  Strategy // canary, blue-green, rolling
    CanaryPct int
    Timeout   time.Duration
}

func (d *Deployment) Execute(ctx context.Context) error {
    // 1. Deploy canary
    // 2. Run health checks
    // 3. Gradually shift traffic
    // 4. Monitor for N minutes
    // 5. Promote or rollback
}

Key metrics to monitor during deployment

  • Error rate (5xx responses)
  • P50/P95/P99 latency
  • Request throughput
  • CPU and memory usage
  • Database connection pool saturation

A deployment should be paused or rolled back if any of these metrics deviate beyond a configured threshold.

Built with Moonshift