Green Deployment ≠ Healthy Production

Page content

A green CI/CD pipeline is one of the most satisfying things in software engineering.

The build succeeds.

All tests pass.

Static analysis is clean.

The deployment completes successfully.

Health checks are green.

The new version is live.

Everything looks perfect.

Until twenty minutes later.


Deployment Success Is Not Production Success

Many teams unconsciously equate a successful deployment with a successful release.

They are not the same thing.

A deployment simply means that a new version of the software has been installed successfully.

It says very little about how the system behaves under real production traffic.

Production environments introduce conditions that are difficult—or sometimes impossible—to reproduce elsewhere:

  • Real user behaviour
  • Concurrent requests
  • Large datasets
  • Network latency
  • External service degradation
  • Partial failures
  • Infrastructure limits
  • Unexpected timing issues

The deployment may be technically successful while the production system is already moving towards failure.


Runtime Is Where Reality Begins

Most critical incidents are not syntax errors.

They are runtime problems.

Examples include:

  • Database connection pool exhaustion
  • Memory leaks
  • Deadlocks
  • Retry storms
  • Cache stampedes
  • Kafka consumer lag
  • Race conditions
  • Thread starvation
  • Slow downstream dependencies
  • Distributed timeout cascades

None of these necessarily prevents a deployment from succeeding.

Many of them only become visible once the application is under realistic production load.


Tests Reduce Risk. They Don’t Eliminate It.

Testing remains one of the most effective ways to improve software quality.

Unit tests verify business logic.

Integration tests verify component interaction.

End-to-end tests validate user workflows.

Performance tests expose scalability limits.

Chaos engineering validates behaviour during failures.

The higher the quality and coverage of these tests, the fewer surprises reach production.

But no realistic test suite can perfectly reproduce production.

Production is simply too dynamic.

The goal is not to eliminate every possible bug.

The goal is to reduce uncertainty before deployment.


Observability Is Your Second Line of Defense

Once software reaches production, observability becomes just as important as testing.

Good observability allows engineers to answer questions such as:

  • What changed?
  • Which dependency is slowing down?
  • Which requests became slower?
  • Which service introduced additional retries?
  • Which deployment correlates with the first symptoms?

Without meaningful metrics, logs and traces, debugging becomes guesswork.

A system that generates gigabytes of logs every day may still provide almost no useful information during an incident.


Reliability Is Designed Before Incidents Happen

Reliable systems are rarely the result of luck.

They are the result of engineering decisions made long before production.

Examples include:

  • Graceful degradation
  • Timeouts
  • Circuit breakers
  • Backpressure
  • Idempotent operations
  • Resource limits
  • Proper retry strategies
  • Meaningful monitoring
  • Recovery procedures

These decisions often determine whether a small issue remains a minor degradation or evolves into a company-wide outage.


The Question That Matters

Instead of asking:

“Did the deployment succeed?”

Ask:

  • Did the system behave as expected?
  • What assumptions could fail under production traffic?
  • Can we detect problems before customers report them?
  • Can we explain an incident after it happens?
  • Can we recover quickly?

A green deployment is an important milestone.

It is not proof that production is healthy.

The real test begins only after your users start interacting with the system.


Final Thoughts

Successful software engineering is not about deploying code.

It is about operating reliable systems.

A green pipeline gives confidence.

Testing reduces uncertainty.

Observability provides understanding.

Reliability engineering turns all of these into systems that continue to work even when reality does not match expectations.


Next

In the next article, I will explore why tracing, metrics, and context propagation are essential for understanding modern production systems, and which tools can help us achieve better observability.