Skip to content

Improve OS support#61

Merged
jayvdb merged 60 commits into
mainfrom
docker
Jun 14, 2026
Merged

Improve OS support#61
jayvdb merged 60 commits into
mainfrom
docker

Conversation

@jayvdb

@jayvdb jayvdb commented Jun 12, 2026

Copy link
Copy Markdown
Member

No description provided.

jayvdb and others added 30 commits June 12, 2026 18:48
… PATH

bash.exe crashes with 0xC0000139 (STATUS_ENTRYPOINT_NOT_FOUND) on Nano
Server -- a loaded DLL is present but missing an export, not a missing
DLL. Replace the now-answered A/B/C/D probe (bare `bash -c echo` already
proven to crash) with data gathering: dump the full conda m2-bash tree
and its DLLs to see whether the msys-* runtime is complete and where it
sits, and retry a bare bash builtin with Library\usr\bin + Library\bin
on PATH in case mise's absolute-path launch left the runtime off the
loader search path.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The tree dump proved msys-2.0.dll (v3.6) sits next to bash.exe and a
PATH-augmented retry still crashed with 0xC0000139, so msys-2.0.dll
imports a Win32 entry point Nano Server doesn't export. Install
llvm-mingw (static native toolchain that runs on Nano) just to dump
msys-2.0.dll's and bash.exe's imported DLLs/symbols, naming the exact
system DLL to backfill from the servercore donor.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
mise's github: backend installs under installs\github-mstorsjo-llvm-mingw\
<ver>\bin, not \llvm-mingw\, so the prior dir match was empty and the
empty for-loop left errorlevel 1 (skipping ver>/dev/null). Point RODIR at the
real versioned bin dir and call llvm-readobj directly, with ver>/dev/null
outside any loop so the diagnostic always exits 0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Root cause of the 0xC0000139 (STATUS_ENTRYPOINT_NOT_FOUND) bash crash on
Nano Server, found by extracting msys-2.0.dll + bash.exe from the conda
packages, pulling Nano's full System32 DLL set + api-set schema from mcr,
and transitively resolving every import: msys-2.0.dll imports exactly two
symbols Nano's stripped kernel32 forwarder doesn't re-export --
KERNEL32.dll!IdnToAscii and !IdnToUnicode -- everything else (incl.
bash.exe's own kernel32/user32 imports) resolves.

The functions exist on Nano (real exports in KernelBase.dll; normaliz.dll
+ the api-ms-win-core-localization contract expose them); only the
kernel32-named door is missing. Server Core's full kernel32.dll exports
both (forwarding to normaliz/kernelbase, present here), same ltsc2022 /
10.0.20348 baseline, so drop it in over Nano's kernel32 forwarder (+ a
System32 root copy). Replace the readobj diagnostics with a bash
smoke-test that confirms the load in the CI log.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
docker COPY can't overwrite Nano's ACL-locked System32\forwarders\
kernel32.dll (Access denied on unlinkat), and kernel32 is a KnownDLL
(*kernel32 in the registry) so a root/app-dir copy is ignored by the
loader. Stage the Server Core donor kernel32.dll to a fresh path, then
overwrite the forwarders copy (the KnownDLLs section source) from inside
a RUN as ContainerAdministrator after an icacls grant.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
jayvdb and others added 12 commits June 13, 2026 16:12
The bash-tasks died with `mise: not found` (127) under busybox: mise,
when it spawns a shell it recognizes (bash/sh/zsh/fish/ksh/dash), rewrites
the task PATH to msys/Cygwin form (/c/mise/bin:...). busybox-w32 is native
Win32 and can't resolve those, so command lookup failed -- while the same
busybox launched from cmd (Windows-form PATH) found mise fine.

`ash` is not in mise's POSIX-shell list, so naming the busybox binary
`ash.exe` skips that PATH conversion; busybox still selects its `ash`
applet from argv[0], and gets the Windows-form PATH it understands.
Update the http:busybox bin, the winsh var, and MISE_BASH_PATH/WINSH
accordingly; collapse the diagnostics into one smoke that checks busybox
can find mise.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
With bash now working (busybox ash), the build reached the final
`mise install`, where the cargo: tools (taplo-cli, wasm-pack, ...) failed:
`rustup could not choose a version of cargo ... no default is configured`.
mise's rust tool uses RUSTUP_HOME=C:\.rustup (where setup-windows set the
1.96.0-gnu default), but mise's cargo backend spawns `cargo install`
without rust's exec_env, so rustup fell back to the empty
%USERPROFILE%\.rustup. Pin CARGO_HOME/RUSTUP_HOME globally so every
cargo/rustup invocation sees the .rustup that has the gnu default.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
With RUSTUP_HOME pinned, the cargo: tools compile but fail:
`error calling dlltool 'x86_64-w64-mingw32-dlltool': program not found`
-- mise's cargo backend doesn't activate llvm-mingw onto the build
subprocess's PATH, so rustc can't find dlltool or the gnu linker. Pin
llvm-mingw to a fixed version and prepend its <install>\bin to PATH in
Dockerfile.windows.

Also skip taplo on Windows: cargo:taplo-cli pulls `ring` (needs a C/asm
toolchain the gnu Nano build lacks), and TOML linting runs in the Linux
check job -- so exclude the tool on windows and short-circuit taplo-check
there (POSIX guard, runs on busybox ash).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
setup-all is the shared internal base the per-OS setup tasks depend on;
it shouldn't be invoked outside the mise config. Switch the workflows'
Windows arm from `mise run setup-all` to `mise run setup-windows` (which
also installs the gnu toolchain + flips rustup to gnu). README already
uses setup-windows.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
taiki-e/install-action installs mise 2026.6.1, below the new
min_version = "2026.6.5" floor, so every mise invocation aborts and
check/test/dependencies fail at the first step. Pin the install to
2026.6.5 (the release with auto_env) so CI satisfies the floor.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Two regressions surfaced once the gnullvm link fix let the Windows build
run far enough to reach tooling, and once setup-linux moved out of
config.toml:

- Dockerfile.windows: pipx:semgrep shells out to `pipx`, but the full
  `mise install` ran before pipx was pip-installed. Install python +
  pipx (Scripts dir on PATH) first, then the full install.
- Dockerfile (linux): build-minimal copied only config.toml, so the
  relocated setup-linux task (now in config.linux.toml) and auto_env
  (.miserc.toml) were missing. Copy both into the minimal stage.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Both docker jobs got further after the prior fixes and surfaced new
failures:

- Dockerfile (linux): the `rust` tool is a two-version list (latest +
  nightly); installed in parallel they run two rustup-inits at once and
  race on the shared rustup binary's self-update, so the second exits 1.
  MISE_JOBS=1 serializes the install. Validated with a local
  `docker build --target build-minimal`.
- Dockerfile.windows: pip dropped pipx.exe outside the prefix Scripts dir
  that was on PATH, so the full `mise install` couldn't find pipx for
  pipx:semgrep. Add the per-user AppData Scripts dir to PATH too and log
  the resolved location.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
pip installs pipx.exe into python's versioned Scripts dir
(...\python\3.13.14\Scripts), whose patch component isn't stable, so the
hardcoded ...\python\3.13\Scripts on PATH never matched and pipx:semgrep
still failed with "program not found". Locate pipx.exe with `dir /s` and
copy it into C:\mise\bin (already on PATH); the pip launcher .exe embeds
the python path so it runs from there. Confirmed the real location via
the prior build's diagnostic output.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
pipx crashes at import on Nano Server: platformdirs.user_data_path()
calls SHGetFolderPathW, a shell known-folder API Nano lacks, and it runs
at module import so no pipx env var avoids it. semgrep is only ever run
by `mise run check` on Linux, so disable just pipx:semgrep via
MISE_DISABLE_TOOLS rather than excluding it on all Windows (real Windows
dev boxes run pipx fine). Drops the now-pointless python+pipx install/copy
dance; python installs with the rest via the main `mise install`.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The guest-language stage failed because Nano Server can't run dotnet's
PowerShell installer or pipx (python's tools). Restrict MISE_ENV to the
guests that install cleanly on Nano -- dart, java, rust, zig -- and use
`mise install` instead of install-all (which forces $ALL_LANGS and would
re-add dotnet + python). semgrep stays skipped via MISE_DISABLE_TOOLS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@jayvdb jayvdb changed the title Dockers Improve OS support Jun 13, 2026
jayvdb and others added 10 commits June 14, 2026 08:28
- Switch ast-grep/cargo-deny/taplo/wasm-pack/watchexec from `cargo:` source
  builds to prebuilt aqua binaries. cargo-expand has no prebuilt (crates.io
  only), so it stays source-built and is disabled in both Docker images via
  MISE_DISABLE_TOOLS.
- Prefix the Linux config vars (a_/b_/c_ tiers) so taplo's reorder_keys keeps
  every definition before its use; alphabetising had moved a value after the var
  that reads it and broke `mise install` tera rendering.
- Provision the Windows gnullvm stable+nightly toolchains with their components
  and wasm targets in preinstall (rustup had installed them against the pre-flip
  host). Fixes the wasm-agent `-Z build-std` "rust-src missing" failure and stops
  wasm-pack downloading rust-std mid-build.
- Build the wasm-agent with `wasm-pack --mode no-install` so it uses the
  mise-pinned wasm-bindgen rather than fetching its own.
- Move clippy config to config/clippy.toml, add config/lychee.toml + link-check,
  refresh the .miserc.toml auto_env note, and reclaim Docker CI disk via
  easimon/maximize-build-space.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Revert `wasm-pack --mode no-install` on build-ws-wasm-agent: it stopped
  wasm-pack downloading wasm-bindgen but also couldn't use the mise-provided
  one, failing every rust/build job with "Not able to find or install a local
  wasm-bindgen".
- Bump github:wasm-bindgen 0.2.114 -> 0.2.122 to match Cargo.lock, so wasm-pack
  finds the matching binary on PATH and downloads nothing (what --mode
  no-install was meant to do).
- Add the mise-no-source-backends taplo schema: ban `cargo:`/`ubi:` tool
  backends in .mise/config*.toml, allowlisting cargo-expand + dart-typegen.
- Trim the exec_auto_install / task.run_auto_install comment.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
build-modules failed on the Nano image at build-ws-audio1-module: wasm-opt
(binaryen) can't execute there (os error 3). The earlier --no-opt fix only
covered build-ws-wasm-agent; the standard module builds still ran wasm-opt.

Gate it via a shared {{ vars.no_opt }} (empty default, --no-opt on Windows) used
by all 12 wasm-pack module builds and the wasm-agent. wasm-opt still runs on
Linux/macOS, where the shipped browser artifacts are built.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@jayvdb jayvdb requested a review from pierre-tenedero June 14, 2026 07:28
@jayvdb jayvdb marked this pull request as ready for review June 14, 2026 10:59
@jayvdb jayvdb merged commit eba3428 into main Jun 14, 2026
7 checks passed
@jayvdb jayvdb deleted the docker branch June 14, 2026 17:38
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