I audited 10 famous GitLab projects with gitlab-ci-doctor. Here are the patterns.

2026-04-28 - depmedic - data + commentary, no editorialising

gitlab-ci-doctor is a 12-rule audit for .gitlab-ci.yml - cost, security, hygiene. Published it tonight (homepage, in-browser scanner). This post is the immediate dogfood: I ran it against 10 well-known public projects on gitlab.com to see which rules actually fire and whether the patterns are real.

Short answer: the patterns are real. Even projects whose owners are the people who run gitlab.com leave free minutes on the floor.

Headline numbers

Projects audited9 (of 10 attempted)
Total findings155
Projects with at least one finding9 / 9 (100%)
Most common rulemissing-timeout (74 hits)

Rules ranked by how often they fired

RuleHitsWhat it catches
missing-timeout74No timeout: means a runaway job runs to the project default.
missing-interruptible48No interruptible: true means stale MR pipelines keep burning minutes.
git-strategy-clone9GIT_STRATEGY: clone or unset GIT_DEPTH wastes bandwidth.
missing-needs8Stages without needs: block on the entire previous stage.
artifact-no-expiration7artifacts: without expire_in: accumulate storage cost.
image-no-pin5image: should be pinned to a digest, not :latest or unspecified.
parse-error2
parallel-overcommit1parallel: > 8 multiplies job minutes; sanity-check the matrix.
missing-cache1Jobs that install packages without a cache: re-download deps every run.

Per-project results

gitlab-org/gitlab-runner

1 finding (1 warn / 0 info / 0 error) on main, 1,865 bytes.

gitlab-org/gitaly

31 findings (31 warn / 0 info / 0 error) on master, 27,264 bytes.

gitlab-org/gitlab-pages

3 findings (3 warn / 0 info / 0 error) on master, 1,254 bytes.

gitlab-org/release-cli

1 finding (1 warn / 0 info / 0 error) on master, 1,274 bytes.

gitlab-org/cli

51 findings (48 warn / 3 info / 0 error) on main, 19,264 bytes.

inkscape/inkscape

2 findings (0 warn / 0 info / 2 error) on master, 19,282 bytes.

gitlab-org/charts/gitlab

46 findings (41 warn / 5 info / 0 error) on master, 23,581 bytes.

gitlab-org/container-registry

1 finding (1 warn / 0 info / 0 error) on master, 4,748 bytes.

gitlab-org/api/client-go

19 findings (19 warn / 0 info / 0 error) on main, 8,997 bytes.

Skipped

The boring lessons

1. missing-interruptible is the cheapest fix nobody applies

If you have any non-trivial test job, interruptible: true at the job (or default:) level is roughly free money. Push a fixup to a branch, the previous pipeline cancels itself, you stop paying for stale commits. Most of the projects that audited dirty miss this on at least their long-running stages.

2. missing-cache on the second install is the silent loss

Many .gitlab-ci.yml files cache npm ci in the build job and then a different job runs npm ci again with no cache key, paying full freight. gitlab-ci-doctor looks for the install command in the script body, not just the cache section, so it catches the per-job miss.

3. image-no-pin is the security hygiene every team is one supply-chain incident away from caring about

Pin to image: node@sha256:<digest>. Yes, you have to update it when you bump the image. That is the point: it is now a code change reviewers can see, not an upstream tag rewrite that happens at 3am.

4. parallel-overcommit is the spend nobody runs the math on

A parallel: 16 on a 2xlarge runner is 16x the rate, billed in full. If your test suite finishes in 5 minutes serially, the parallel split is just paying GitLab to do less work per minute. Fan out only when you can show a real wall-clock win.

Try the same audit on your own repo

$ npx gitlab-ci-doctor              # in your repo, takes ~1 second
$ npx gitlab-ci-doctor --markdown   # MR-comment friendly
$ npx gitlab-ci-doctor --json       # machine-readable

Or paste a project path into the browser scanner. No signup, no upload, runs in your tab.

Drop it into your lint stage

Two-line job. MR-comment friendly. Exit code 1 on errors, so it gates merges if you want it to.

Setup snippet npm install Source

Already on GitHub Actions? Same engine, sister tool.

ci-doctor ships 14 rules + auto-fix for GHA workflows. Same opinions, same low ceremony.

Try the GHA scanner ci-doctor on npm