Skip to content
Back to case studies
SanitizedDevOps2023

DevOps Transformation

SSH deploys + rollback terror → <10 min pipelines, <30s rollback, deploy-related incidents near zero.

Role
Lead Platform Engineer
Context
SaaS / Platform
Duration
4 months
Team
2 platform engineers (me + 1) supporting 25 developers

Tech stack

  • GitHub Actions
  • Terraform
  • AWS ECS
  • CodeDeploy
  • Docker
  • ECR
  • S3
  • DynamoDB
  • CloudWatch
  • Slack Webhooks
Executive summary

Business problem and production context.

Business problem

Engineering team of 25+ developers was deploying manually via SSH. Release cycles took 2-3 days with frequent rollbacks. No automated testing. Bugs were caught in production. Infrastructure was provisioned via ClickOps in the AWS console with no version control or reproducibility.

Architecture decision

Designed and implemented a complete CI/CD pipeline using GitHub Actions with reusable composite workflows. Migrated all infrastructure to Terraform with remote state in S3 + DynamoDB locking. Implemented blue-green deployments on ECS with automatic rollback on health check failures. Set up multi-stage environments (dev/staging/prod) with promotion gates. Added automated testing (unit, integration, E2E) with 95%+ coverage requirements enforced in CI.

awsAWS Account / shared CI/CDRequestResponseSOURCE + TRIGGERBUILD + DEPLOYREGISTRY + STATE12345678GitHubPR + webhookCodePipelinemulti-team flowCodeBuildtest matrixECRscanned imagesEKSArgo CD GitOpsLambdapost-deploy verifyTerraform Cloudremote stateParameter Storeenv configCloudWatchdeploy eventsCROSS-CUTTING: Blue/green w/ alias · <30s rollback target · Canary 5% → 50% → 100% · Test gate per stage
What Rahul owned

The useful proof is the decision surface, not only the result number.

These are the parts of the work that show production judgment: ownership, constraints, rollback, cost, and observability.

Owned scope

  • CI/CD, deployment safety, and rollback improvements for teams moving beyond manual releases
  • Release health signals and ownership boundaries for production changes
  • IaC and automation paths that reduced risky human coordination

Evidence artifacts

CI/CD transformationRollback processIaC standardizationRelease health checks
Constraints

What would fail first?

Every project has constraints. The useful work is naming them early enough that rollback, cost, and ownership are designed before an incident.

Manual releases

Release confidence was limited by handoffs, manual checks, and unclear rollback.

Service ownership

Deployment automation needed owners who understood how to respond when a change failed.

Environment drift

CI/CD reliability depended on consistent environments and predictable configuration.

Decision table

Trade-offs accepted on purpose.

Option
Decision
Reason
GitHub Actions vs Jenkins
GitHub Actions for native repo integration, lower maintenance, and reusable composite workflows across 12 repos
GitHub Actions vs Jenkins: GitHub Actions for native repo integration, lower maintenance, and reusable composite workflows across 12 repos.
Blue-green vs canary
Blue-green for instant rollback capability, critical for the team's early adoption of automated deployments
Blue-green vs canary: Blue-green for instant rollback capability, critical for the team's early adoption of automated deployments.
Terraform vs AWS CDK
Terraform for multi-team consistency and HCL readability for junior engineers
Terraform vs AWS CDK: Terraform for multi-team consistency and HCL readability for junior engineers. CDK considered but deferred.
Monorepo vs polyrepo CI
Polyrepo with shared composite actions
Monorepo vs polyrepo CI: Polyrepo with shared composite actions. Each team owns their pipeline config while sharing common patterns.
Risk table

Production risks and how they were controlled.

Risk
Mitigation
Owner
Automated bad deploys
Added gates, health checks, and rollback behavior before increasing deployment frequency.
Release owner
Pipeline became opaque
Kept pipeline stages readable and tied failures to actionable owners.
Platform team
Rollback was only theoretical
Documented and tested rollback for stateful and stateless release paths.
Service owner
Implementation approach

Small steps, visible changes, fewer surprises.

  1. 01

    Documented existing deployment process: SSH into bastion → pull latest code → restart services → manually verify. Average deploy: 2-3 hours with 1 in 5 requiring rollback.

  2. 02

    Migrated all 12 repositories to GitHub Actions with reusable composite workflows: test → build → push to ECR → deploy to ECS with CodeDeploy blue-green.

  3. 03

    Converted all infrastructure from ClickOps to Terraform with remote state in S3 + DynamoDB locking. Ran `terraform import` on 180+ existing resources over 3 weeks.

  4. 04

    Built multi-stage promotion pipeline: feature branch → dev (auto-deploy) → staging (auto-deploy + E2E tests) → prod (manual approval + blue-green + Slack notification).

  5. 05

    Added test coverage enforcement in CI. PRs below 95% coverage automatically blocked. Wrote 400+ integration tests as bootstrap to get the team past the initial hurdle.

Result

Before and after.

Deploy Time
2-3 hours
<10 minutes
Deploy Frequency
1x/2 weeks
5-8x/day
Rollback Time
30-60 minutes
<30 seconds
Production Incidents (deploy-related)
4-5/month
0-1/month

Rollback path

Rollback was treated as part of architecture: deployment strategy, state changes, owners, and verification.

Cost considerations

The main cost benefit was lower incident/release drag, plus cleaner non-production environment usage.

Observability notes

Signals included deploy frequency, failure rate, rollback time, environment health, and customer-impact alarms.

Related services

Forward Deployed AI EngineeringAWS Production Architecture ReviewGenAI / RAG Production Readiness

Have a similar production problem?

Send the current architecture, bill concern, deployment pain, or GenAI reliability issue. I will help you find the first real bottleneck.