Skip to content
← Expertise
Technical guideDevOps / Platform Engineering11 min

GitOps and deployment pipelines teams actually trust

Deploy speed is not the metric that matters. Rollback speed is. Here is the pipeline shape that took a 25-developer team from three-hour SSH deploys to under ten minutes, with rollback in under 30 seconds.

By Rahul Ladumor
On this page

Straight answer first

Make Git the only way into production, and make undoing a release faster than explaining it. Everything else in a deploy pipeline is detail. A team that can revert in seconds will ship several times a day; a team that needs an hour to revert will batch changes into a fortnightly release, which makes every release bigger, riskier, and harder to debug when it breaks. The release cadence is downstream of the rollback time.

The rest of this page is the shape I build, drawn from a platform where 25 developers across 12 repositories went from deploying by hand over SSH to a pipeline they trusted enough to use several times a day.

Optimize for rollback, not deploy speed

Before that work, a release took two to three hours, roughly one in five had to be rolled back, and the rollback itself took 30 to 60 minutes. The team shipped once every two weeks and spent much of the gap recovering from the last deploy. That is a rational response to a slow rollback: if undoing a mistake is expensive, you deploy less often, and batching changes makes each deploy more likely to fail.

Afterwards, deploys ran in under ten minutes and rollback in under 30 seconds. Frequency went to five to eight times a day and deploy-related incidents fell from four or five a month to zero or one. The frequency was not the goal; it was the side effect of making failure cheap.

Git as the only way in

GitOps means the repository holds the desired state and the pipeline reconciles production to it. The test is whether anyone can change production another way. If the console still allows writes to production, or there is a bastion host people SSH into, then the repository describes an aspiration, not reality, and drift accumulates in the gap.

Mechanically: infrastructure in Terraform or CDK, remote state in S3 with DynamoDB locking so two changes cannot race, and no manual console writes. On one enterprise estate that combination took infrastructure drift incidents from about a dozen a month to zero. Locking stopped the races; removing the console path stopped the drift.

The pipeline shape that holds up

A promotion pipeline with progressively stronger gates: a feature branch auto-deploys to dev, merges auto-deploy to staging where end-to-end tests run, and production requires a manual approval, deploys blue-green, and announces itself in Slack. Each stage earns the next. The stages are cheap; what makes this work is that nothing skips them.

Across 12 repositories, reusable composite workflows kept the common pattern in one place while each team still owned its own pipeline configuration. That balance matters: a single centrally owned pipeline becomes a bottleneck and teams work around it, while 12 independently invented pipelines drift into 12 different failure modes nobody else can debug.

Zero-downtime deploys on AWS

Blue-green on ECS through CodeDeploy is the workhorse: stand the new version up alongside the old, shift traffic once health checks pass, and keep the old version running long enough that reverting is a traffic switch rather than a redeploy. Automatic rollback on health check failure means the common case needs no human at all.

Blue-green over canary is a deliberate choice for teams new to automated deploys, because the rollback is instant and obvious, and that is what builds the trust the pipeline needs to actually get used. Canary is the better tool once you have per-version metrics and enough traffic for a slice to mean something. Get the health checks right either way: a check that passes while the application behind it is broken turns automatic rollback into automatic confidence in a broken release.

Gates people do not route around

A gate that blocks work without helping gets disabled the first time it is inconvenient. On that platform the coverage gate blocked pull requests below 95%, which caused real pushback until we paired on test writing for two weeks and built test utilities that made the common patterns one-liners. The gate survived because we removed the reason to resent it, not because we insisted on it.

The general rule: every gate you add needs a matching investment in making the thing it demands easy. Otherwise you are not raising quality, you are just training people to find the bypass.

The unglamorous part: importing what exists

Nobody starts from an empty account. On that platform, importing 180 existing resources into Terraform took three weeks, because some of them had dependencies nobody had documented and the import surfaced them one failure at a time. It was the hardest part of the project and the least interesting to talk about.

It is also non-negotiable. Skipping the import leaves a permanent category of resources that exist outside the pipeline, and those are exactly the resources that will be misconfigured during an incident, because they are the ones nobody reviews.

Getting people to use it

Building the pipeline takes a few weeks. Getting 25 developers to trust it enough to stop deploying by hand is the work. The thing that moved the needle was Slack deploy notifications with a one-click rollback: knowing you can undo in 30 seconds, from the place you already are, changed how willing people were to ship. Confidence is a feature, and it is built by making the scary action cheap. Telling people not to be scared accomplishes nothing.

The measure of success is ownership. On that team, the developers now run their own deploys and rollbacks with no platform engineer in the loop, and each team owns its pipeline configuration. A platform nobody can operate without you is not finished.

What I see fail most often

  • Optimizing deploy time while rollback still takes half an hour.
  • Building the pipeline but leaving console write access to production open.
  • Terraform without remote state locking, so two changes race and drift.
  • Skipping the import of existing resources, leaving a permanent shadow estate.
  • Adding gates without investing in making the thing they demand easy.
  • One central pipeline owned by a platform team, which becomes the bottleneck.
  • Health checks that pass while the application behind them is broken.
  • Treating adoption as a mandate instead of a trust problem.

Next step

Have the same problem on your stack?

Send the architecture, AWS bill concern, deploy pain, or GenAI reliability issue. I'll find the first real bottleneck and propose a small, reversible fix.

FAQ

What is GitOps in practice?

Git is the only path to production. The repository holds the desired state of both application and infrastructure, every change arrives as a reviewed commit, and the pipeline reconciles reality to what is in Git. The practical test is simple: if someone can change production by clicking in the AWS console or SSHing into a box, you do not have GitOps yet, you have a pipeline plus a back door, and the back door is where the drift comes from.

How fast should a deploy and a rollback be?

Deploy in under ten minutes, rollback in under a minute. Rollback speed matters far more than deploy speed, because it sets how much a bad release costs. On one platform of 25 developers we took deploys from two to three hours down to under ten minutes, and rollback from 30 to 60 minutes down to under 30 seconds. Deploy frequency went from once every two weeks to five to eight times a day, and deploy-related incidents dropped from four or five a month to zero or one.

Blue-green or canary deployments?

Blue-green when a team is new to automated deploys, canary when you have the metrics and the traffic to make it meaningful. Blue-green gives instant, obvious rollback: the old version is still running, so reverting is a traffic switch. Canary catches problems that only appear under a fraction of real traffic, but it needs solid per-version metrics and enough volume for a small slice to be statistically useful. I have chosen blue-green specifically to make early adoption safe, then added progressive delivery once the team trusted the pipeline.

GitHub Actions or Jenkins?

GitHub Actions for most teams, because it lives next to the code, needs no server of its own, and composite workflows let many repositories share one pipeline definition without copy-paste. Jenkins earns its place where you have heavy self-hosted requirements or an existing investment with people to maintain it. On a 12-repository estate, reusable composite workflows meant each team owned its own pipeline configuration while the common pattern stayed in one place.

How do we stop infrastructure drift?

Remote state with locking, and no console write access to production. Terraform state in S3 with DynamoDB locking stops two changes racing each other, which is the mechanical half. The cultural half is removing the ability to make a change outside the pipeline at all. On one enterprise estate, moving to Terraform with state locking took infrastructure drift incidents from about a dozen a month to zero. The lock did not fix the behaviour; removing the console path did.

Related reading

#GitOps#CI/CD#GitHub Actions#Terraform#Blue-Green#Zero-Downtime
Rahul Ladumor

Rahul Ladumor

Principal Cloud & AI Platform Architect. AWS Professional certified, 5x AWS Community Builder. I work with teams that have real users, real AWS bills, and real production pressure.

About Rahul →