Back to Blog
2 min read

Keeping Deployments Simple

Every team wants sophisticated deployment pipelines. Most need simpler than they think.

The Over-Engineered Pipeline

I’ve seen teams spend months building:

  • Multi-environment Kubernetes clusters
  • Complex GitOps workflows
  • Feature flag systems
  • Canary deployments
  • Blue-green switching

For an app with 100 users.

What Actually Mattered

For most projects, this is enough:

# .github/workflows/deploy.yml
name: Deploy

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Build
        run: |
          docker build -t myapp .
      
      - name: Push to registry
        run: |
          docker push ${{ secrets.REGISTRY }}/myapp:latest
      
      - name: Deploy
        run: |
          az webapp update \
            --resource-group myrg \
            --name myapp \
            --docker-image ${{ secrets.REGISTRY }}/myapp:latest

Push to main. App deploys. Done.

When to Add Complexity

Add staging when:

  • You have multiple developers
  • Breaking production hurts

Add canary when:

  • You have significant traffic
  • Rollback needs automation

Add feature flags when:

  • You need gradual rollouts
  • You want to separate deploy from release

Don’t add any of this on day one.

The Principle

Start simple. Add complexity when pain points emerge.

Your deployment process should match your team size and user base.

Questions to Ask

Do we need this? Probably not yet.

What problem does this solve? If you can’t articulate it, you don’t need it.

What’s the simplest solution? Start there.

The Reality

Most apps don’t need sophisticated deployment pipelines.

They need reliable, repeatable deployments that the team understands.

Simple beats sophisticated. Every time.

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.