Carl Myers published this on the Indeed Engineering blog on 6 August 2024. It is first-party. The Jenkins → GitLab playbook is jobs, runners, and secrets. His post is how a platform team of about 11 people turned Jenkins off on a date the license had already chosen.
Indeed’s CI started on Hudson in 2007, when the company had fewer than 20 engineers. After Oracle bought Sun and the 2011 fork, they moved to Jenkins. Later, most workloads went to dynamic EC2 workers. The page says Indeed now has thousands of engineers, over 580 million job seeker profiles, and tens of thousands of repositories. They do not use a monorepo. The CI team also runs the artifact server, shared build code, and other custom pieces, and they cover follow-the-sun support.
A controller is a scaling axis you do by hand
Jenkins runs the critical part of a pipeline on a controller and farms steps out to workers. The controller is a single point of failure, and it is how you scale. Too many jobs for one controller means you partition by hand. CloudBees Operations Center can manage the set. Each controller is still one fragile process. A node rollout or a dead machine is downtime, and Kubernetes does not remove that.
Their own design made upgrades worse. Jobs were Groovy DSL in each repo, which is the sane baseline. The shared code was a library, not a template. Each project copied a skeleton at creation and then rarely updated it. Hundreds of versions of the same pipeline called into the same modules. Shipping a platform change meant asking teams to edit their copy. Indeed’s culture prefers that flexibility. It also meant a large share of team time went to “platform asks”, his term for the maintenance tickets that showed up whenever CI, cloud, or infra moved.
GitLab CI was already their source host. It is built to run in the cloud, and a template can extend a template. That last point is the golden path. A project can stay on the shared include, or override the one job it actually needs, and still pick up the next central change. By the time they called the platform generally available, 23 percent of builds were already on GitLab CI, from grassroots use and from teams who wanted to switch immediately. The long tail was the problem. Custom Jenkinsfiles would not survive a mechanical translator. The hardware and the CloudBees fee only go away at 0 percent.
A small fork, then a six-line include
GitLab being open source was a deliberate bet. As a proof they fixed a Geo issue and a template parsing bug, and GitLab helped land them. The next year an unexpected runner behavior became an internal security issue because of how Indeed grants access. They compiled a fork of the runner, mitigated it, and sent the fork up as a merge request. They ran that fork for a few months. He treats those months as the reason the open-source choice paid off.
The three common languages are Java, Python, and JavaScript, each used for libraries, deployables, and cron-style jobs. Every cell in that matrix had a Jenkins skeleton, so each needed a GitLab CI golden path. Most users could take the path unchanged. The surprise was the teams with heavy custom jobs. He expected them to defend the customizations. Most of the customizations no longer mattered. Dropping in a file of about six lines of includes was enough, and they could add a job back later if they missed it.
They also took outside patches first. Tests and docs existed so another team could put a customization on the golden path behind a flag, instead of keeping a private fork. A team blocked on a feature the platform group had scheduled for a few weeks out was told they could send the patch sooner. He says several parity features arrived that way, faster than his team could have written them. Office hours ran on a regular cadence, and migration questions jumped the support queue.
The license date, the scream test, and 54 exceptions
The CloudBees license expired on 1 April 2024. They announced the shutdown for that day, about eight months out. At the moment of the aggressive plan, 80 percent of builds and 60 percent of projects were still on Jenkins. That was over 2,000 Jenkinsfiles. The consensus he reports is that the date was too soon, and that a smaller license for the leftovers would be needed. They aimed at the date anyway.
Automated migration worked for a subset where customization was rare. A Sourcegraph batch change opened merge requests on hundreds of projects, and they pushed people to merge them. Features that arrived only on the golden path got advertised as free on arrival. Security and compliance scans, Slack notifications, and hooks into other internal systems.
Idle jobs got a scream test. If a job had not run, or had not succeeded, they disabled it and told the owner to turn it back on. That was self-service. Thousands of jobs had not run once since the previous CI migration, which was Jenkins to Jenkins. Those could be ignored.
In January 2024 they made controllers read-only unless someone requested an exception. Controllers matched the org chart better than jobs did, and the list was shorter. The ask was a name in a spreadsheet next to the controller. Peak was about 400 controllers. By January, 220. Only 54 needed an exception, and several of those were the platform team’s own tests and canaries. January and February were conversations with about 50 teams. Some would finish alone before 28 February. Some would delete the project. A few were sure they would miss. For that last set, someone from the CI team paired with someone who knew the repo. Sometimes the platform team wrote and the product team reviewed. Sometimes the reverse. They turned Jenkins off on the announced day.
What the graphs are counting
At peak, Jenkins ran over 14,000 pipelines a day. GitLab CI has done over 40,000 in a single day and regularly does over 25,000. Per-job cost is similar. The controller hardware is gone, and with it the artificial split across controllers. He says a straight comparison is hard, and that CI hardware cost is 10 to 20 percent lower. Support is lower because the app scales in the cloud, survives an availability-zone loss, and the template language has public docs.
Golden-path adoption passed 70 percent, which is over 5,000 projects that take a central change with no local edit. That is how they moved some jobs to cheaper ARM64 instances and kept build images current. He says users are happier. The post ends on two graphs it does not transcribe, so I am not going to invent what the axes say.
The people he names besides himself are Tron Nedelea, Eddie Huang, Vivek Nynaru, Carlos Gonzalez, Lane Van Elderen, and the rest of the CI platform team, plus Deepak Bitragunta and Irina Tyree for the buy-in. The part I would copy is the controller spreadsheet. A license date is a blunt instrument. A list of 54 named exceptions is what made the last two months a set of pairing sessions instead of a guess about who still needed Jenkins.