Hive
fix(linux-runner-image): release on path changes, not just commit scope
GitHub issue · Closed
What changed
Rewrites the infra/linux-runner-image/cliff.toml commit parsers to match by conventional-commit type (feat/fix/…) instead of requiring a linux-runner-image scope. The release check already passes --include-path infra/linux-runner-image/** to git-cliff, so the directory becomes the actual release gate.
Why (root cause)
mise/tasks/release/check.sh decides whether to release a component by running:
git cliff --include-path "infra/linux-runner-image/**/*" --config <cliff.toml> --bumped-version -- <last-tag>..HEAD
The --include-path correctly restricts git-cliff to commits that touched the image directory. But the cliff.toml parsers then required the commit’s conventional scope to contain linux-runner-image, and skipped everything else via the ^[a-z]+\(...\) catch-all. With filter_commits = true, a path-touching commit under any other scope was discarded, so it produced no version bump and no release. The --include-path was doing nothing; the scope was the real (and wrong) gate.
That is exactly how the runner image ended up without a Docker client:
- #10905 (
feat(infra): docker-in-runner) addeddocker-ce-cli+ buildx + compose to the Dockerfile. - It touched
infra/linux-runner-image/Dockerfile, so it passed--include-path— but its scope isinfra, so the parser skipped it. No release. - Production stayed pinned to
linux-runner-image@0.1.1(cut 2026-05-27, six days before the CLI was added). - So even after the dind sidecar was enabled (#11055), Docker workflows on
tuist-linuxfail withUnable to locate executable file: docker— the daemon is there, the client isn’t.
The fix
Match by type, let --include-path gate by path. Any feat/fix/docs/perf/refactor/style/test touching infra/linux-runner-image/** now triggers a release, whatever the commit’s scope. chore/ci stay skipped. The release-notes and CHANGELOG steps already pass the same --include-path, so the changelog is not polluted by unrelated commits.
Impact
On merge, the release check re-evaluates linux-runner-image@0.1.1..HEAD, now counts #10905’s feat, and cuts the overdue linux-runner-image@0.2.0 — built from the current Dockerfile (with the Docker CLI), on the external runner it still uses on main. The release pipeline pins the new digest into the managed values; the next server deploy rolls it out, and Docker finally works on the in-house fleet. This is the prerequisite that unblocks #11057.
Validation
git cliff --bumped-versionwith the new config returnslinux-runner-image@0.2.0(was stuck at0.1.1).- Generated release notes correctly list
docker-in-runner for Linux poolsunder Features and nothing unrelated.
Note: this pattern is systemic
The same scope-gated catch-all (^[a-z]+\(...\) skip) exists in 14 other component cliff.toml files (server, cli, cache, kura, runners-controller, app, noora, gradle, skills, and the other infra images). Each has the same latent failure: a path-touching change under a mismatched scope silently skips its release. Worth a follow-up to convert them all to path-gated, but doing it in one shot risks triggering a wave of catch-up releases, so it’s intentionally out of scope here.
🤖 Generated with Claude Code