Skip to main content
Case Studies

CI/CD Pipeline — When a 25-Person Dev Team Can Deploy Only Twice a Month, How Do You Accelerate to 15 Deployments a Day?

A case study on building a CI/CD pipeline for a 25-person development team that used to deploy only twice a month and spent 4 hours per deployment—transformed into 15 deployments a day in just 8 minutes.

13 Mar 20269 min
CI/CDDevOpsPipeline AutomationDeploymentSoftware Delivery

"If you don’t feel confident deploying, the pipeline isn’t good enough—not that people are afraid."

This is a real case study from a project where we helped transform the deployment process for a mid-sized enterprise software development team. The team had 25 people, the core platform served hundreds of thousands of users, and every deployment day was a day everyone held their breath.


The problem: "Deploy Day" was the day everyone hated most

Before we came in, the situation looked like this:

  • Only 2 deployments per month — there was a designated "deploy window" only on Thursday nights in the 2nd and 4th weeks of the month
  • Every step was manual — one lead developer handled everything, taking 4 hours per deployment from merge, build, test, and deploy to verification
  • Every deployment introduced bugs — an average of 3.4 issues per deploy required follow-up hotfixes
  • Rollback was painfully slow — if a serious problem occurred, rollback took 2 hours
  • Developer wait time was extremely high — the average time from PR merge to production was 11 days
  • Incident rate was high — 1 in 3 deployments resulted in customer-facing errors in production
  • No one deployed on Fridays — because no one wanted to spend the weekend fixing bugs

The most painful issue was the 11-day developer wait time. That meant a feature completed on Monday would not reach customers for another two weeks. The product team complained every week: "Why isn’t the feature we approved ages ago live yet?" Meanwhile, the dev team was stressed because they had to context-switch back to fix bugs in code they had written two weeks earlier.

Developer satisfaction score: 4.2/10 — the lowest in 3 years


The goal: Set targets based on DORA Metrics

We used DORA Metrics as our North Star and set the following targets:

Metric Before Target DORA Level
Deploy Frequency 2/month 10+/day Elite
Lead Time for Changes 11 days < 1 hour Elite
Mean Time to Recovery (MTTR) 2 hours < 10 minutes Elite
Change Failure Rate 33% < 5% Elite

Many people on the team thought these targets were unrealistic—especially 10+ deployments per day, considering they had only been able to deploy twice a month. But we believed that if the pipeline was designed well enough, these numbers would become natural outcomes, not something the team had to force.


The approach: 3 core pillars

1. Trunk-based Development

We stopped using long-lived branches that led to huge merges and moved to short-lived branches merged into main every day. Smaller changes mean smaller risk.

2. Progressive Delivery

Instead of "deploy and hope," we shifted to "deploy and gradually enable" using Feature Flags and Canary Deployment. Traffic was routed to the new version incrementally, so if something went wrong, we could pull back immediately.

3. Shift-Left Everything

We moved everything possible upstream: testing, security scanning, performance checks. If the pipeline could catch bugs at code push time, there was no need to gamble during deployment.


The 4-phase process (20 weeks)

Phase 1: Foundation (Weeks 1–4)

We started by getting the basics in order:

  • Version control cleanup — removed 47 stale branches untouched for 3 months and set branch protection rules
  • Branching strategy — moved from Gitflow (with its tangled develop, staging, release, and hotfix branches) to trunk-based development
  • Basic CI — every push had to pass automated build + lint + type checks; if it failed, it could not be merged

Phase 1 result: deploy frequency remained the same, but merge conflicts dropped from 12 per week to 2 per week.

Phase 2: Automated Testing (Weeks 5–10)

This was the most time-consuming phase—and the one where we failed on the first try (more on that below):

  • Designed a proper test pyramid
  • Built unit tests, integration tests, and E2E tests for critical paths
  • Set minimum coverage thresholds for new code

Phase 3: CD Pipeline (Weeks 11–16)

  • Built a staging environment that truly mirrored production
  • Designed canary deployment — release at 5% → 25% → 50% → 100%
  • Rollback automation — if the error rate exceeded a threshold, the system would automatically roll back within 2 minutes
  • Built a deployment dashboard so everyone could see real-time pipeline status

Phase 4: Observability & Culture (Weeks 17–20)

  • Implemented monitoring and alerting that covered business metrics, not just technical metrics
  • Set up a fair on-call rotation instead of having the lead dev shoulder everything
  • Introduced blameless postmortems — every incident became a learning opportunity, not a search for someone to blame
  • Built a culture where everyone could deploy confidently, not just the lead dev

Round 1 failed: when the test suite became the bottleneck

Phase 2 was where we made our biggest mistake.

The team was highly committed and wrote 800+ test cases within 4 weeks. Coverage jumped from 12% to 68%, which looked great on paper.

But the problem was that the full test suite took 47 minutes to run.

What happened next:

  1. Developers stopped running tests locally — who wants to wait 47 minutes? They just pushed code and let CI handle it while they moved on
  2. The CI queue became massive — with 25 people pushing in parallel, the build queue stretched to 2–3 hours
  3. 15% flaky tests — tests passed sometimes and failed sometimes even when the code hadn’t changed, which made the team stop trusting the results
  4. The team started ignoring failures — "Oh, the tests are red again. Never mind, re-run them and they’ll probably pass."

By week 8, we had to admit the approach was wrong. High coverage that no one actually uses is effectively no test coverage at all.

Lesson learned: A slow test suite = no test suite


The fix: redesign the test strategy from the ground up

1. Rebalance the test pyramid

Test Type Before Fix After Fix
Unit Tests 180 cases (23%) 520 cases (72%)
Integration Tests 270 cases (34%) 150 cases (21%)
E2E Tests 350 cases (43%) 50 cases (7%)
Total 800 cases 720 cases
Run Time 47 minutes 6 minutes

Among the 350 E2E tests, many were redundantly validating the same things already covered by integration tests. We removed those and kept only 50 cases that truly covered critical user journeys, then added more fast, reliable unit tests in their place.

2. Parallel test execution

We split the suite into shards and ran them in parallel, reducing execution time from 47 minutes to 6 minutes.

3. Flaky test quarantine

We created a quarantine system that moved flaky tests into a separate suite. They no longer blocked the pipeline, but the team still received alerts to fix them each week. Within 3 weeks, the flaky rate dropped from 15% to 1.2%.

4. Test impact analysis

There was no need to run every test every time. We analyzed which tests were affected by each code change and ran only the relevant ones. Small PRs touching just 2–3 files could complete testing in as little as 30 seconds.


Results: Before vs After

After 20 weeks, the numbers spoke for themselves:

Metric Before After Change
Deploy Frequency 2/month 15/day +225x
Lead Time for Changes 11 days 45 minutes -99.7%
MTTR 2 hours 4 minutes (auto-rollback) -96.7%
Change Failure Rate 33% 2.1% -93.6%
Test Suite Time 47 minutes 6 minutes -87.2%
Hotfix Issues / Deploy 3.4 issues 0.3 issues -91.2%
Developer Satisfaction 4.2/10 8.9/10 +112%
Manual Deploy Steps 23 steps 1 click -95.7%

A deployment frequency of 15 times per day does not mean every individual developer deploys 15 times. It means the 25-person team has the freedom to deploy whenever the code is ready—without waiting for a window, asking for permission, or relying on the lead dev to handle it.

And the thing we were proudest of: the team could confidently deploy on Friday afternoons because they knew the pipeline would auto-rollback within 4 minutes if anything went wrong.


Cost analysis: how much it cost, and what it returned

A common question is: "Was it worth it?" Here’s how we calculated it:

The cost of slow deployments (per month)

Item Cost
Lead dev doing manual deploys (8 hrs. x 2 times) Developer hours
Hotfix time (3.4 issues x 2 deploys x 2 hrs./issue) Developer hours
Developer wait time (25 people x avg. 2 blocked days) 50 man-days/month
Incident response (1 in 3 deploys) On-call + reputation cost
Opportunity cost (features that missed deployment) Revenue delay

Developer wait time alone = 50 man-days per month, equivalent to paying 2.5 developers to sit and wait instead of creating value.

The cost of the pipeline transformation

  • 20 weeks of implementation
  • A DevOps team of 2 people + developer representatives contributing part-time
  • A slight increase in infrastructure cost for parallel testing and the staging environment

ROI

The pipeline paid for itself by week 12, before the project had even finished. Reducing developer wait time alone created major savings—before even counting lower incident costs and increased feature delivery velocity.


5 lessons from this project

1. A slow pipeline = no pipeline

If CI/CD takes 47 minutes to run, developers will find ways around it—skipping tests, ignoring failures, or pushing directly to production. At that point, it is effectively no pipeline at all. Speed is a feature, not a nice-to-have.

2. Culture matters more than tools

You can have the best pipeline in the world, but if the team does not trust the process, it will not help. Blameless postmortems, shared ownership, and giving everyone the right to deploy matter more than the tools you choose.

3. Start with pain, not best practices

We did not start from "DORA says you should do X." We started from "What hurts the most?" The answer was the 11-day developer wait time. Once we started from the real pain point, team buy-in followed naturally.

4. Measure everything

If you do not measure, you do not know whether things are truly improving or only feel better. A dashboard showing real-time DORA metrics gave everyone the same view and made the impact of each change visible.

5. Small batches beat big bang every time

Frequent, incremental deployments are always safer than large one-shot releases. No exceptions. Smaller changes are easier to review, easier to test, easier to debug, and easier to roll back.


What still needs improvement

Even with strong results, we do not consider the work "done." There are still several areas to improve:

GitOps

Some infrastructure changes are still partially manual. The goal is for every environment change to go through Git just like application code, providing a complete audit trail and enabling infrastructure rollbacks as quickly as application rollbacks.

Chaos Engineering

The pipeline is much better now, but we still have not fully tested how the system handles unexpected failures—for example, unusually high database replica lag or three third-party APIs timing out at the same time. Game Day exercises would help uncover weaknesses that monitoring still does not catch.

AI-powered Test Generation

We already have test impact analysis, but the next step is using AI to suggest test cases for changed code—especially edge cases that humans often miss. It is currently being piloted in a limited scope.

Multi-region Deployment

Today, deployments go to only one region. The goal is multi-region deployment with cross-region traffic shifting to improve resilience and reduce latency for international users.


Closing thoughts

These 20 weeks proved that a CI/CD pipeline is not just about tools or technology. It is about changing how the organization thinks—from "deployment is scary" to "deployment is a normal part of everyday work."

If your team is facing similar problems—slow deployments, unstable pipelines, or a team that lacks confidence to deploy—we have been through it before, and we would be happy to share our experience.

Talk to the Enersys team


Sources

"Empowering Innovation,
Transforming Futures."

Contact us to make your project a reality.