Skip to content

feature(mise): add mise dev container feature - #41

Draft
nozaq wants to merge 1 commit into
mainfrom
claude/features-proposal-s0vbyc
Draft

nozaq wants to merge 1 commit into
mainfrom
claude/features-proposal-s0vbyc

Conversation

@nozaq

@nozaq nozaq commented Sep 17, 2026

Copy link
Copy Markdown
Member

Summary

Adds ghcr.io/bare-devcontainer/features/mise, a Feature that installs mise on any Debian or Ubuntu based image, for the toolchains and CLIs a project pins itself (linters, terragrunt, a second language runtime) that the images deliberately leave out.

  • Install and verification — the release binary comes from https://github.com/jdx/mise/releases/. Its checksum is verified against SHASUMS256.txt, whose minisign signature is checked with src/mise/mise-minisign.pub, the same key and method the mise image uses. The key is registered in scripts/update-material.sh so the weekly workflow refreshes it. No other Feature is required; minisign, sha256sum, a downloader and a CA bundle are installed with apt-get only when the image lacks them.
  • glibc / musl — the glibc build is installed where it runs. When a release requires a newer glibc than the image provides (mise ≥ 2026.7.0 on bookworm), the statically linked musl build is installed instead, verified against the same signed checksums.
  • Volumes — tool installs and the download cache go to /var/lib/mise and /var/cache/mise, which the Feature mounts named volumes on and points MISE_DATA_DIR / MISE_CACHE_DIR at, with the shims directory on PATH. Both are owned by a mise system group with the setgid bit, following the claude-code Feature, so they stay writable after updateRemoteUserUID renumbers the remote user.
  • Optionversion: latest (resolved through the redirect of releases/latest) or an exact version such as 2026.9.10.
  • README.md is generated with devcontainer features generate-docs; the existing READMEs regenerate unchanged.

Test plan

  • shellcheck -S warning on install.sh and smoke_test.sh
  • install.sh run against a local mock release server with a self-generated minisign key: latest via redirect (wget and curl paths), exact version, unrecognised version, tampered SHASUMS256.txt (signature verification fails, exit 1), glibc build failing to run (musl fallback), temporary directory removed on exit
  • Offline checks of smoke_test.sh as a non-root user against that install (PATH, env, group, setgid, ownership)
  • CI smoke-test job on mcr/base:debian and bare/debian:trixie, which covers the real download and mise exec python@3

🤖 Generated with Claude Code

https://claude.ai/code/session_01Ti123BqzFGF4RaFf4qM5XJ


Generated by Claude Code

Installs mise from its GitHub release into /usr/local/bin, verifying the
release checksums against their minisign signature with the mise public key
vendored in the feature, the same key and method the mise image uses. The
glibc build is installed where it runs and the statically linked musl build
otherwise, so releases that outgrew an older Debian's glibc still work there.

Tool installs and the download cache go to /var/lib/mise and /var/cache/mise,
which the feature mounts volumes on and points MISE_DATA_DIR and
MISE_CACHE_DIR at, with the shims directory on PATH. Both directories are
owned by a mise system group with the setgid bit, following the claude-code
feature, so they stay writable after updateRemoteUserUID renumbers the
remote user.

The minisign key is registered with update-material.sh so the weekly
workflow refreshes it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ti123BqzFGF4RaFf4qM5XJ
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.

2 participants