Skip to content
Notifications
Clear all

What CI/CD platform actually works for a 200-user shop on AWS?

2 Posts
2 Users
0 Reactions
5 Views
(@data_diver_dan)
Estimable Member
Joined: 3 months ago
Posts: 126
Topic starter   [#19681]

Having recently led the migration of our analytics CI/CD pipeline for a 190-person product team on AWS, I can assert that the primary determinant of success is not the platform itself, but its integration into your existing data ecosystem and its ability to enforce data quality gates. We evaluated GitLab CI, GitHub Actions, and a custom Jenkins setup, with a critical requirement: the pipeline must orchestrate dbt, data quality checks, and Looker semantic layer deployments, not just application code.

Our benchmark numbers, based on a 4-month average for a monorepo with 12 dbt projects, 3 LookML projects, and ~800 models:
* **Average pipeline duration:** GitLab CI (22 mins), GitHub Actions (18 mins), Jenkins (35+ mins, highly variable).
* **Cost for 3,000 monthly pipeline minutes:** GitLab CI (shared runner SaaS ~$0), GitHub Actions (~$180 on AWS runners), Jenkins (~$220 EC2+management overhead).
* **Critical failure:** The Jenkins setup had a 12% failure rate due to environmental flakiness, versus <3% for the others.

The decisive factor was AWS integration and state management. GitHub Actions, with self-hosted runners on our EKS cluster, won. It allows us to assume IAM roles natively, cache dbt artifacts to S3, and securely inject warehouse credentials. Here's the core of our `dbt build` job that runs on every merge request:

```yaml
- name: Run dbt models and tests
uses: ./.github/actions/dbt-aws
with:
dbt-command: |
dbt deps
dbt build --select state:modified+ --defer --state s3://our-artifact-bucket/pr-${{ github.event.number }}
aws-role: arn:aws:iam::1234567890:role/github-action-dbt
env:
DBT_PROFILES_DIR: ./profiles
DBT_CLOUD_PROJECT_ID: ${{ secrets.DBT_PROJECT_ID }}
```

The architecture hinges on two patterns:
1. **State-aware incremental runs:** Using `state:modified+` with deferral to a production artifact, we only test changed models and their downstream dependencies, slashing runtime.
2. **Quality as a gate:** We run `dbt test` on all staging models, and a subset of critical `dbt test` on modified models, before any Looker deployment. The pipeline fails hard on data test breaches.

The platform must facilitate this rigor. GitLab CI was close, but its secret management for AWS was more cumbersome. Jenkins required unsustainable scripting. For a ~200-user shop where data reliability is business-critical, my recommendation is **GitHub Actions with self-hosted AWS runners**, provided you containerize your analytics environment. The native AWS integrations, manageable cost, and growing ecosystem for data tooling make it the most maintainable choice.

- dan


Garbage in, garbage out.


   
Quote
(@annak8)
Eminent Member
Joined: 2 days ago
Posts: 17
 

Great point about integration being the key, not just the platform. Your numbers for GitHub Actions with self-hosted runners are really compelling, especially that cost comparison.

I've seen similar patterns with marketing automation deployments, where the ability to assume IAM roles from a runner is a game-changer for accessing S3 buckets or DynamoDB tables securely. That environmental flakiness you mentioned with Jenkins - we hit the same wall with some legacy Cron jobs, it just eats into team morale.

One thing I'm curious about, since you mentioned data quality gates - how are you handling the rollback or notification strategy when those checks fail in the pipeline? Is it a hard stop or more of a staged warning?



   
ReplyQuote