Picture this: You push a change, tests pass, you merge. Five minutes later, main is broken. Sound familiar? That's because traditional CI tests your change in isolation, pretending the other 47 changes that merged while you were coding don't exist.
The Problem Every Multi-Repo Team Faces
Here's what actually happens in traditional CI:
- Developer A pushes a change that breaks when combined with Developer B's pending change
- Both changes pass CI individually because they're tested against old main
- Both merge in quick succession
- Main branch is now fucked
- Everyone spends the next 2 hours figuring out whose fault it is
Project gating fixes this by testing what your change looks like AFTER all the pending changes merge. It's like testing the actual future state instead of some fantasy version where your change exists in isolation.
OpenStack learned this the hard way managing 300+ interconnected repositories. Their solution was Zuul, because when you have that many moving pieces, traditional CI becomes a daily exercise in frustration. During the recent Epoxy release cycle, Zuul ran over 1.1 million jobs - that's the scale where this complexity becomes justified.
What Makes Zuul Different (And Why Setup Sucks)
Cross-Project Testing: Unlike Jenkins or GitHub Actions, Zuul can test changes across multiple repositories simultaneously. When your library change affects 12 downstream projects, Zuul tests all of them together. Try doing that with traditional CI - you'll end up with a mess of triggers and dependencies.
Ansible Everything: Every job is an Ansible playbook. This means the same code that tests your application can deploy it. Sounds great until you realize you now need to become an Ansible expert whether you wanted to or not.
Dynamic Infrastructure: Nodepool spins up fresh VMs for every job. No more "works on my machine" because every test runs in a clean environment. Also no more permanent build agents eating resources 24/7. The downside? You now have to manage a cloud infrastructure orchestration layer.
Microservices Hell: Zuul consists of separate services for scheduling (zuul-scheduler), execution (zuul-executor), merging (zuul-merger), and web UI (zuul-web). Plus ZooKeeper for coordination and Nodepool for infrastructure. That's a lot of moving parts that can break at 3 AM.
Zuul 13.0.0 supports Ansible 11 and includes performance improvements, but don't expect the setup complexity to magically disappear. The latest release focused on stability fixes and better error handling, which you'll need when things break at 3 AM.
The Real Cost of Traditional CI Failure
The numbers are brutal. OpenStack's research shows that traditional CI systems create a cascade of failures that can cost teams days of productivity. When a broken change merges, it blocks everyone else's work until someone figures out what broke and rolls it back.
Jenkins comparison studies demonstrate why project gating beats traditional CI for multi-repository projects. Jenkins might work fine for single repos, but try coordinating changes across dozens of interdependent projects and you'll quickly understand why OpenStack moved away from Jenkins to Zuul.
Companies like LeBonCoin use Zuul for testing at scale precisely because traditional CI tools fail when you need to coordinate changes across multiple teams and repositories. The Zuul community FAQ specifically addresses why generic automation tools like Jenkins can't handle the complexity of proper project gating.