Paypal got it from eBay, which in 2000's was rolling out 20M LOC worldwide every week or two on "release trains". There, a small team of kernel engineers rotated doing the merging -- two weeks of clearcase hell when it was your turn.
And, since eBay wrote their own developer tools, you'd have to deploy different tooling depending on the branch you were on. But because of their custom tooling, if there was a problem in the UI, in debug mode you could select an element in the browser UI and navigate to the java class in a particular component and branch that produced that element.
The angle we took in the blog post focused on what was widely documented and accessible to the community (open-source tools like Bors, Homu, Bulldozer, Zuul, etc.), because those left a public footprint that other teams could adopt or build on.
It's a great reminder that many companies were solving the "keep main green" problem in parallel (some with pretty sophisticated tooling), even if it didn't make it into OSS or blog posts at the time.
You'd join the queue, and then you'd have to wait for like 12 other people in front of you who would each spend up to a couple hours trying to get their merge branch to go green so it could go out. You couldn't really look away because it could be your turn out of nowhere - and you had to react to it like being on call, because the whole deployment process was frozen until your turn ended. Often that meant just clicking "retry" on parts of the CI process, but it was complicated, there were dependencies between sections of tests.
Another user suggested that the OP article may be AI-generated or AI-assisted; I'm not confident one way or another, but it does have me questioning whether HN has any AI detection mechanisms (though I'm not sure how effective these will be as AI keeps evolving)
If you read between the lines, the underlying problem in most of the discussion is GitHub's dominance of the code hosting space coupled with it's less than ideal CI integration - which while getting better is stuck with baggage from all their past missteps and general API frailty.
That's why the OpenStack community built Zuul on top of Gerrit: it added a real gating system that could speculatively test multiple commits in a queue and only merge them if CI passed together. In other words, Zuul was Gerrit's version of a merge queue.
One trickier problem is when you don't know until later that a past change was bad: perhaps slow-running performance tests show a regression, or flaky tests turn out to have been showing a real problem, or you just want the additional velocity of pipelined landings that don't wait for all the tests to finish. Or perhaps you don't want to test every change, but then when things break you need to go back and figure out which change(s) caused the issue. (My experience is at Mozilla where all these things are true, and often.) Then you have to deal with backouts: do you keep an always-green chain of commits by backing up and re-landing good commits to splice out the bad, and only fast-forwarding when everything is green? Or do you keep the backouts in the tree, which is more "accurate" in a way but unfortunate for bisecting and code archaeology?
This blog post about choosing which commit to test is also relevant and may be of interest: https://sluongng.hashnode.dev/bazel-in-ci-part-1-commit-unde...
I Gitlab and Azure DevOps (also owned by MS) supports it, and even talked to an employee now working at Github, that implemented this in Azure DevOps.
More background: https://github.com/orgs/community/discussions/14863
With a semi-linear merge strategy, you rebase (without --fast-forward) before merging, so the history ends up looking like this:
* c8be0c632 Merge pull request #1538 from my-org/api-error-logging
|\
| * 80ecc4985 Fix security warning, bump nokogiri
| * 750613638 Log and respond with more detailed validation errors in the API
| * 0165d6812 Log code and details when rendering an API error response.
| * 1d4daab48 Refactor email validation result to include a descriptive message
| * 635214092 Move media_type logging into context_logging
|/
* 1cccd4412 Merge pull request #1539 from my-org/profile-clarify
|\
| * 87b342a32 Rename profile default to migration target
| * 2515c1e59 Fix disallow removing last profile in company
|/
* b8f3f1658 Merge pull request #1540 from my-org/customer
|\
| * 064b31232 Add customer-specific taxed allowance reduction
|/
* 3cf449f94 Merge pull request #1528 from my-org/console-logging
|\
| * 99657f212 Don't log to rails console in production
|/
* 8c72e7f19 Merge pull request #1527 from my-org/gemfile
It makes it easy to look at the Git history both at the 'PR level' kind of like a change log (`git log --merges --decorate --oneline`) or dig down into each PR to see all commits.Mainly I'm confused what this check is gating. Based on the article it's hard to tell what they mean.
1. Code changes that may conflict with each other in the repo, in the sense of a merge conflict.
2. Regressions (test failure, build breakage) caused by recently checked-in code.
3. Preparing and verifying a new release prior to deployment.
4. Monitoring/canary a release candidate with real users.
In my mind, these are all very different things, but the article seems to mix them up.