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

Flights

Investigate, reproduce, or fix this item in an isolated repository. Each Flight preserves its outcome and agent session.

New Flights are paused Configure model inference, GitHub, and a sandbox provider to start another Flight. Existing results remain available below.
No Flights yet

Start a Flight and preserve its objective, outcome, and session here.

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.