GitHub Actions is fine for toy projects and weekend hacks. The second you have a real team with real deadlines, it falls apart. I started tracking our build times because my manager kept asking why deployments were taking so long. Turns out our "quick" afternoon pushes were sitting in queue for 15-20 minutes before they even started.
Last Tuesday we had users screaming about 500 errors. One fucking line in a config file was wrong. I fixed it, pushed, and then watched GitHub's queue for 18 minutes while customers churned. Eighteen minutes for a build that takes 3 minutes to run.
Queue Times and Resource Limitations
GitHub says they handle thousands of concurrent jobs, but that's bullshit marketing speak. Reality hits different. I started keeping a spreadsheet because I got tired of guessing:
What actually happens:
- 7 AM: Builds usually start in under 3 minutes (nobody's awake yet)
- 10 AM - 4 PM: You're fucked. 10-25 minute waits are normal
- Large runners: Still sit in the same damn queue, you just pay 4x more
- CircleCI: Starts immediately or within 30 seconds, every single time
My "fuck this shit" moment was during a production fire. Database connection was failing because I typo'd POSTGRES_DB=myapp-prod
as POSTGRES_DB=myapp-prd
. One character. I fixed it, pushed, and then watched GitHub's queue for 19 minutes while customers got 503 errors and started tweeting angry shit at us.
Performance Beyond Queue Times
Even when your build finally starts, GitHub Actions runs like ass. I ran the exact same Jest test suite on both platforms. CircleCI: 9 minutes. GitHub Actions: 14 minutes. Same fucking container, same tests, same everything.
iOS builds are where GitHub really shits the bed. Their macOS runners are still using Intel chips from 2019 while everyone else moved to Apple Silicon years ago. My Xcode builds went from 45 minutes on GitHub to 18 minutes on Blaze. That's not optimization, that's just having hardware that wasn't obsolete when Obama was president.
Architectural Limitations
Why GitHub Actions is Fundamentally Broken
Their resource options are stupid: 2-core or 8-core, nothing else. My build needs 4 cores but I have to pay for 8. That's like buying a fucking truck because they don't sell sedans.
The scheduler is drunk: I've seen builds sit in queue while other runners are completely idle. It's like the scheduler randomly decided to take a coffee break.
Docker caching is a joke: GitHub's cache misses constantly. CircleCI's Docker Layer Caching actually works - layers get reused instead of rebuilt every goddamn time.
Matrix builds are broken: Set up a 3x3 matrix and watch half the jobs sit there doing nothing. I've seen Error: This job was not started because a job with the same key already exists
when the scheduler gets confused. It's supposed to run in parallel but GitHub's scheduler apparently can't count to 9.
Impact on Development Flow
Slow CI affects more than just deployment times - it changes how you work. When builds take unpredictably long, you start adapting your workflow in ways that aren't always healthy:
Common adaptations I've noticed:
- Context switching increases: Start other work while waiting, then lose track of the original task
- Deployment hesitancy: Teams deploy less frequently when CI is unreliable
- Larger batch changes: Developers combine multiple changes to avoid multiple queue waits
- Local testing emphasis: "It works locally" becomes more important when CI feedback is delayed
How Teams Actually Adapt
Most teams follow a similar pattern: start with GitHub Actions for convenience, then gradually move critical workflows elsewhere as they hit performance limits.
Enterprise patterns I've observed: Companies often keep GitHub Actions for basic checks but move deployment pipelines to faster platforms. Stripe's written about their infrastructure choices (they don't use GitHub Actions for the important stuff).
iOS development teams: GitHub's Intel-based macOS runners are particularly challenging for iOS development. Many teams have moved to Blaze for Apple Silicon performance or invested in dedicated hardware. Even Apple's Xcode Cloud often provides better iOS build performance than GitHub's shared runners.
Scaling challenges: Teams with many active developers (50+) often find GitHub Actions becomes a bottleneck during peak development hours. Netflix uses GitHub Actions for open source shit but runs their real infrastructure on something that actually works.
The common theme is using GitHub Actions where convenience matters, but migrating performance-critical builds elsewhere. Buildkite's case studies demonstrate how teams handle CI/CD at scale when GitHub Actions doesn't meet their performance requirements.