The release that broke on a Friday
Every team has a release story. The deploy went out late in the day, a migration ran longer than expected, someone restarted the wrong service, and the next hour was spent in a call trying to work out what changed.
In stories like this, the cause is rarely the code. The code was reviewed and tested. What failed was the release itself: a sequence of manual steps that only worked when the right person remembered them in the right order.
Zero downtime is not a feature you buy from a cloud provider. It is what you get when the release stops depending on memory.
Habit one: the pipeline does the deploy
If a person types commands to ship a release, the release is a one-off performance. It might go well. It might not. Either way, the next release starts from scratch.
A CI/CD pipeline turns the release into the same steps every time:
- The build runs from a clean environment, not from someone's laptop.
- Tests and checks run before anything is deployed, and a failure stops the release.
- The deploy itself is scripted, including the order of migrations and service restarts.
Habit two: prove it on staging first
Staging is only useful if it looks like production. A staging environment with a different database version, a missing environment variable or no realistic data will pass releases that fail the moment they reach users.
Before a release goes out, it should run on staging the way it will run in production:
- the same infrastructure configuration, defined in code rather than set up by hand;
- the migration run against a copy of production-shaped data, so you see how long it actually takes;
- the main user journeys clicked through, not just the new feature.
Habit three: watch it after it goes live
A release is not finished when the deploy succeeds. It is finished when you know users are fine.
That means monitoring that starts at launch, not after the first complaint:
- error rates and response times compared with the hour before the release;
- alerts that go to a named person, not a shared inbox;
- a rollback path that has been tested, so reversing a bad release is a decision, not a project.
What zero downtime actually requires
Zero-downtime releases come from a few technical choices: deploying new versions alongside old ones, writing migrations that both versions can run against, and switching traffic only when the new version is healthy. None of these are exotic. All of them are easier when the three habits above are already in place, because the release is predictable enough to design around.
This is how we run deployment and launch for the products we build: CI/CD with zero-downtime releases, validation on staging, and monitoring after launch. It is not glamorous work, and that is the point. A good release is one nobody remembers.
A short checklist for your next release
1. Can the release run without anyone typing a command by hand?
2. Has this exact build run on a staging environment that matches production?
3. Do you know how long the migration takes on realistic data?
4. Who is watching errors and response times for the first hour?
5. If you had to roll back, have you done it before?
If any answer is "not yet", that is the next thing to fix, before the next feature.
Planning a launch and want a second opinion on your release process? [Talk to us](/contact).
Part of the team building and running the products behind these posts at Hedaya Global Solutions.