Skip to content

feat(actions-runner): add a mise-managed CLI toolchain - #5

Merged
swibrow merged 1 commit into
mainfrom
feat/actions-runner-mise-toolchain
Jul 30, 2026
Merged

feat(actions-runner): add a mise-managed CLI toolchain#5
swibrow merged 1 commit into
mainfrom
feat/actions-runner-mise-toolchain

Conversation

@swibrow

@swibrow swibrow commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds gh, yq, hadolint and shellcheck to the actions-runner image via a new mise.toml, one line per tool.
  • gh and yq are standard workflow tooling GitHub's hosted images ship and Ubuntu does not usefully package — there is no gh in the archive at all, and its yq is the unrelated Python jq-wrapper with different syntax. Without them, every workflow that opens a PR or patches a manifest curls its own copy into RUNNER_TEMP; swibrow/garrison was about to do exactly that in its deploy-pitower job.
  • The list lives in mise.toml so growing it costs no Dockerfile change. Renovate's native mise manager matches that filename by default, hence no # renovate: annotations on the entries; mise itself is a pinned release binary, not the unpinned mise.run installer.
  • Data dir stays root-owned and read-only to the runner user; only the cache points somewhere writable.
  • version2.336.0-3.

Test plan

gh and yq are standard workflow tooling that GitHub's hosted images ship
and Ubuntu does not usefully package: there is no gh in the archive at
all, and its `yq` is the unrelated Python jq-wrapper with different
syntax. Without them, every workflow that opens a PR or patches a
manifest curls its own copy into RUNNER_TEMP — exactly the per-repo
drift this image exists to absorb. hadolint and shellcheck join them so
lint jobs stop reaching for third-party setup actions.

The list lives in mise.toml, one line per tool, so growing it costs no
Dockerfile change. Renovate's native mise manager matches that filename
by default, which is why the entries carry no `# renovate:` annotation;
mise itself is a pinned release binary rather than the unpinned mise.run
installer. Only static, version-insensitive binaries belong there —
anything a workflow pins against stays with the setup-* actions and
their RUNNER_TOOL_CACHE.

The data dir stays root-owned and read-only to the runner user, with
only the cache pointed somewhere writable. metadata.yaml's test is
generic over mise.toml: it asserts the installed count matches the
manifest and that every tool resolves through the shims and runs as the
runner user, so adding a tool needs no edit there either.

Signed-off-by: swibrow <15628653+swibrow@users.noreply.github.com>
@swibrow
swibrow merged commit 6187c92 into main Jul 30, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant