Hive Hive
Sign in

fix(linux-runner-image): release on path changes, not just commit scope

GitHub issue · Closed

Metadata
Source
tuist/tuist #11059
Updated
Jun 24, 2026
Domains
Compute
Details

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) added docker-ce-cli + buildx + compose to the Dockerfile.
  • It touched infra/linux-runner-image/Dockerfile, so it passed --include-path — but its scope is infra, 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-linux fail with Unable 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-version with the new config returns linux-runner-image@0.2.0 (was stuck at 0.1.1).
  • Generated release notes correctly list docker-in-runner for Linux pools under 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

Comments
TA
tuist-atlas[bot] Jun 4, 2026

The fix for releasing on path changes is now available in linux-runner-image@0.2.0. Update to benefit from the corrected release behavior.