
Background
A fintech startup needed to streamline their manual deployment pipeline and improve release frequency without compromising quality. Their core product stack included:
- Frontend: React (Next.js)
- Backend: Node.js (NestJS)
- Database: PostgreSQL (hosted on AWS RDS)
Objective
- Replace manual FTP deployments with CI/CD
- Introduce environment-based builds (dev, staging, prod)
- Enable rollback functionality in case of deployment failure
Tools Used
- ⚙️ GitHub Actions (CI/CD workflows)
- 🐳 Docker & Docker Compose
- ☁️ AWS EC2 & S3
- 🔐 AWS Secrets Manager
Pipeline Architecture
- CI Phase:
        - Run tests (Jest + ESLint)
- Build Docker image tagged by branch and SHA
 
- CD Phase:
        - Push to AWS ECR
- Deploy on EC2 with SSH trigger
 
Sample GitHub Actions Snippet
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v3
      - name: Build Docker Image
        run: docker build -t app:GITHUB_SHA .
      - name: Push to AWS ECR
        run: docker push :GITHUB_SHA
      - name: Deploy to EC2
        uses: appleboy/ssh-action@v0.1.5
        with:
          host:  secrets.EC2_HOST 
          username: ec2-user
          key:secrets.EC2_SSH_KEY 
          script: |
            docker pull :
            docker stop app || true
            docker rm app || true
            docker run -d --name app -p 80:3000 :GITHUB_SHA   Challenges
- Managing secrets across multiple environments
- Handling rollbacks and failed builds gracefully
- Ensuring Docker images didn't bloat over time
Optimizations
- Used multi-stage Docker builds to reduce image size by 60%
- Added Slack notifications for build status via webhooks
- Integrated Git tags to trigger production releases only
Results
| Metric | Before | After | Improvement | 
|---|---|---|---|
| Deployment Time | 45 mins | 3.5 mins | 92% | 
| Release Frequency | 1/month | 3/week | 12x | 
| Rollback Time | 1 day | 30 sec | ~99% | 
Conclusion
This transformation allowed the team to ship features faster, ensure higher quality builds, and minimize production downtime. Their entire release pipeline now runs with zero manual intervention.
Next Steps
- Set up blue-green deployments with load balancer switching
- Add SonarQube for code quality reports
- Extend CI pipeline to include end-to-end tests with Playwright
