Skip to content

test(e2e): run test-tool targets in parallel#9564

Merged
jdx merged 4 commits intomainfrom
codex/parallel-test-tool
May 3, 2026
Merged

test(e2e): run test-tool targets in parallel#9564
jdx merged 4 commits intomainfrom
codex/parallel-test-tool

Conversation

@jdx
Copy link
Copy Markdown
Owner

@jdx jdx commented May 3, 2026

Summary

  • Run multi-target mise test-tool invocations through a bounded child-process pool using --jobs.
  • Wire registry CI to compute TEST_TOOL_JOBS from the runner processor count and pass it to mise test-tool --jobs for both initial runs and retries.
  • Use dedicated MISE_TEST_TOOL_JOBS env control for test-tool parallelism instead of sharing broad MISE_JOBS behavior.
  • Keep single-target and --jobs=1/--raw runs in-process so existing behavior and raw output stay simple.
  • Remove GITHUB_STEP_SUMMARY and tranche env from child runs so the parent emits one ordered summary.
  • Add e2e coverage for parallel test-tool summary output.

Validation

  • cargo fmt --all -- --check
  • cargo check --all-features
  • cargo build --all-features
  • actionlint .github/workflows/registry.yml
  • e2e/run_test cli/test_test_tool_clean
  • e2e/run_test cli/test_test_tool_parallel
  • bash -n e2e/cli/test_test_tool_parallel
  • shellcheck -x e2e/cli/test_test_tool_parallel
  • git diff --check
  • target/debug/mise test-tool amazon-ecr-credential-helper

This PR was generated by an AI coding assistant.


Note

Medium Risk
Introduces concurrent execution via child processes and changes CI invocation, which can surface new flakiness/race conditions or different logging/summary behavior, but is confined to tooling/test paths.

Overview
Enables parallel mise test-tool execution for multi-target runs by spawning a bounded pool of child mise test-tool --jobs=1 processes and collecting results in-order for a single GitHub summary.

Updates registry CI (.github/workflows/registry.yml) to compute TEST_TOOL_JOBS from runner CPU count and pass it to both the initial and retry mise test-tool runs.

Adds an e2e test (e2e/cli/test_test_tool_parallel) validating that parallel runs still emit a single well-formed summary table with entries for each tool.

Reviewed by Cursor Bugbot for commit dc40041. Bugbot is set up for automated code reviews on this repo. Configure here.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces parallel execution support for the test-tool command. The implementation refactors the TestTool logic to collect test targets and execute them concurrently using tokio tasks, with a semaphore to manage the number of concurrent jobs. It also adds supporting structures for test targets and results, and includes a new end-to-end test script to verify the parallel functionality. I have no feedback to provide as there were no review comments.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 3, 2026

Greptile Summary

Adds parallel execution to mise test-tool by spawning a bounded pool of child mise test-tool --jobs=1 processes, collecting results in index order so the parent emits one ordered GitHub summary. Single-target and --jobs=1/--raw invocations stay in-process, preserving prior behavior. CI is updated to compute TEST_TOOL_JOBS from the runner's CPU count and pass it explicitly on both the initial and retry docker run invocations.

Confidence Score: 5/5

Safe to merge; all parallel execution paths are correctly guarded and previously flagged issues have been resolved.

No P0 or P1 findings. The spawn_blocking wrapping of the sync child-process call (previously flagged) is already present in this revision. The TMPDIR fallback in the e2e script is also in place. The result-ordering mechanism (pre-allocated indexed slots), clean-step delegation to child processes, and GITHUB_STEP_SUMMARY stripping all look correct.

No files require special attention.

Important Files Changed

Filename Overview
src/cli/test_tool.rs Core parallelism implementation: adds a bounded JoinSet-based child-process pool, separates clean/test/collect steps, uses spawn_blocking for sync I/O, and preserves in-order result collection via indexed slots.
.github/workflows/registry.yml Adds a 'Set test-tool jobs' step to compute CPU count via nproc/getconf with a fallback, then passes --jobs to both initial and retry docker invocations.
e2e/cli/test_test_tool_parallel New e2e test that validates parallel test-tool emits a single well-formed summary table; uses ${TMPDIR:-/tmp} guard and correct grep-count assertions.
docs/cli/test-tool.md Doc-only wording update: 'Number of jobs to run in parallel' → 'Number of tool tests to run in parallel'.
mise.usage.kdl Usage definition updated to match the new --jobs help text.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[mise test-tool --jobs N tools...] --> B{run_in_process?\njobs==1 OR target_count<=1}
    B -- Yes --> C[Clean all tools\nConfig::reset if needed]
    C --> D[test_targets: in-process loop]
    D --> E[self.test each target\nsequentially]
    B -- No --> F[test_targets: parallel pool]
    F --> G[JoinSet with jobs concurrency\nvia spawn_blocking]
    G --> H[test_child spawns child\nmise test-tool --jobs=1 tool\nremoves GITHUB_STEP_SUMMARY / tranche env]
    H --> I[Child runs in-process path\ncleans + tests single tool]
    I --> J[Capture stdout+stderr\nreturn TestToolResult with index]
    E --> K[Collect Vec of TestToolResult]
    J --> K
    K --> L[Print output in order\nEmit github_summary rows\nBail if any errored]
Loading

Reviews (4): Last reviewed commit: "[autofix.ci] apply automated fixes" | Re-trigger Greptile

Comment thread src/cli/test_tool.rs
Comment thread e2e/cli/test_test_tool_parallel Outdated
@jdx jdx force-pushed the codex/parallel-test-tool branch 2 times, most recently from 6099c6d to dc40041 Compare May 3, 2026 13:50
@jdx jdx force-pushed the codex/parallel-test-tool branch from dc40041 to e919166 Compare May 3, 2026 13:57
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 3, 2026

Hyperfine Performance

mise x -- echo

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 x -- echo 23.5 ± 0.5 22.3 27.2 1.00
mise x -- echo 23.9 ± 0.6 22.8 30.1 1.02 ± 0.03

mise env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 env 22.1 ± 0.7 20.9 27.2 1.00
mise env 22.8 ± 0.3 22.2 26.3 1.03 ± 0.04

mise hook-env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 hook-env 23.0 ± 0.5 22.2 25.0 1.00
mise hook-env 23.4 ± 0.7 21.9 26.9 1.01 ± 0.04

mise ls

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 ls 20.0 ± 0.5 18.8 22.2 1.00
mise ls 20.6 ± 0.4 19.7 24.8 1.03 ± 0.03

xtasks/test/perf

Command mise-2026.4.28 mise Variance
install (cached) 152ms 157ms -3%
ls (cached) 77ms 79ms -2%
bin-paths (cached) 81ms 84ms -3%
task-ls (cached) 806ms 818ms -1%

@jdx jdx merged commit bbf6386 into main May 3, 2026
42 checks passed
@jdx jdx deleted the codex/parallel-test-tool branch May 3, 2026 14:46
mise-en-dev added a commit that referenced this pull request May 3, 2026
### 🚀 Features

- **(conda)** graduate conda backend out of experimental by @jdx in
[#9544](#9544)
- **(deps)** Add dart and flutter providers by @tjarvstrand in
[#9505](#9505)
- **(registry)** add neo4j by @mnm364 in
[#9525](#9525)
- **(registry)** add rustfs by @mnm364 in
[#9530](#9530)
- **(task)** support exclusion patterns in task sources by
@jlarmstrongiv in [#9496](#9496)
- **(vfox)** add stat function to lua file module by @esteve in
[#9497](#9497)

### 🐛 Bug Fixes

- **(backend)** flag regex prerelease versions by @jdx in
[#9500](#9500)
- **(backend)** mark -nightly/-canary/-experimental as prereleases by
@jdx in [#9523](#9523)
- **(backend)** suppress no-versions warning for unresolved-latest
backends by @jdx in [#9548](#9548)
- **(backend)** include dotnet prereleases from package flags by @jdx in
[#9551](#9551)
- **(backend)** scope PEP 440 prerelease detection to Python backends by
@jdx in [#9558](#9558)
- **(cargo)** Apply install_env during cargo install by @c22 in
[#9502](#9502)
- **(copr)** drop epel-9 chroots since rust >= 1.91 is unavailable by
@jdx in [#9484](#9484)
- **(github)** skip attestations on non-default api_url by @jdx in
[#9486](#9486)
- **(github)** retry ip allow list errors without auth by @risu729 in
[#9506](#9506)
- **(http)** update versions host tracking endpoint by @jdx in
[#9527](#9527)
- **(install)** don't warn for configured tools when version is passed
via CLI by @jdx in [#9522](#9522)
- **(install)** refresh latest before installing missing tools by @jdx
in [#9545](#9545)
- **(install)** don't cache nonexistent install paths by @jdx in
[#9553](#9553)
- **(lockfile)** don't propagate ad-hoc CLI overrides into the project
lockfile by @jdx in [#9562](#9562)
- **(plugin)** detect plugin types after cloning by @risu729 in
[#9540](#9540)
- **(release)** pass --no-git-checks to aube publish by @jdx in
[#9483](#9483)
- **(task)** convert PATH to MSYS Unix form when spawning POSIX shells
on Windows by @JamBalaya56562 in
[#9547](#9547)

### 📚 Documentation

- **(contributing)** require popularity check for registry PRs by @jdx
in
[7bbeebe](7bbeebe)
- **(watch)** update pitchfork domain to en.dev by @risu729 in
[#9536](#9536)
- document ghtkn GitHub token setup by @jdx in
[#9546](#9546)
- clarify registry backend acceptance policy by @jdx in
[#9543](#9543)
- Change exec command to use bash for variable echo by @kuboon in
[#9567](#9567)

### 🧪 Testing

- **(e2e)** run test-tool targets in parallel by @jdx in
[#9564](#9564)
- **(e2e)** run tests in parallel by @jdx in
[#9563](#9563)
- **(e2e)** bind-mount /tmp on disk and surface failed tests in CI
summary by @jdx in [#9570](#9570)
- **(tasks)** migrate test_task_help atask to usage field by @jdx in
[#9549](#9549)

### 📦️ Dependency Updates

- update fedora:45 docker digest to 8b838b3 by @renovate[bot] in
[#9507](#9507)
- update ghcr.io/jdx/mise:deb docker digest to f02194c by @renovate[bot]
in [#9509](#9509)
- update taiki-e/install-action digest to 7769b73 by @renovate[bot] in
[#9512](#9512)
- update ghcr.io/jdx/mise:alpine docker digest to 581f8a8 by
@renovate[bot] in [#9508](#9508)
- update rust crate ctor to v0.10.1 by @renovate[bot] in
[#9515](#9515)
- update ghcr.io/jdx/mise:rpm docker digest to a5c9655 by @renovate[bot]
in [#9510](#9510)
- update rust docker digest to a9cfb75 by @renovate[bot] in
[#9511](#9511)
- update rust crate age to v0.11.3 by @renovate[bot] in
[#9514](#9514)
- update rust crate jiff to v0.2.24 by @renovate[bot] in
[#9516](#9516)
- update dependency vitepress-plugin-tabs to ^0.9.0 by @renovate[bot] in
[#9518](#9518)
- update autofix-ci/action action to v1.3.4 by @renovate[bot] in
[#9513](#9513)
- update rust crate usage-lib to v3.2.1 by @renovate[bot] in
[#9517](#9517)
- update apple-actions/import-codesign-certs action to v7 by
@renovate[bot] in [#9519](#9519)
- update taiki-e/install-action digest to 51cd0b8 by @renovate[bot] in
[#9531](#9531)
- exclude taiki-e/install-action from renovate by @jdx in
[#9532](#9532)
- update rust crate blake3 to v1.8.5 by @renovate[bot] in
[#9533](#9533)

### 📦 Registry

- enable shellcheck on windows by @zeitlinger in
[#9487](#9487)
- add google-java-format by @zeitlinger in
[#9488](#9488)
- add expert
([aqua:expert-lsp/expert](https://github.com/expert-lsp/expert)) by
@AlternateRT in [#9498](#9498)
- update entry for checkmake by @eread in
[#9504](#9504)
- add systemctl-tui
([aqua:rgwood/systemctl-tui](https://github.com/rgwood/systemctl-tui))
by @2xdevv in [#9521](#9521)
- add codon by @3w36zj6 in
[#9538](#9538)
- add tool yr (backend:github:VirusTotal/yara-x) by @adam-moss in
[#9542](#9542)
- add tool betterleaks (backend:aqua/betterleaks/betterleaks) by
@adam-moss in [#9541](#9541)
- add `git-filter-repo` by @garysassano in
[#9550](#9550)
- add umoci
([aqua:opencontainers/umoci](https://github.com/opencontainers/umoci))
by @2xdevv in [#9555](#9555)
- add aqua backend for elixir-ls by @AlternateRT in
[#9557](#9557)
- deny inline backend options by @risu729 in
[#9565](#9565)

### Chore

- **(ci)** fail registry tests without summary by @jdx in
[#9559](#9559)
- **(ci)** use !cancelled() instead of always() for test-ci aggregator
by @jdx in [#9569](#9569)
- **(ci)** use namespace runners for ci jobs by @jdx in
[#9561](#9561)
- **(config)** deprecate shorthands_file setting by @risu729 in
[#9534](#9534)
- **(docs)** remove shrill.en.dev analytics script by @jdx in
[#9539](#9539)
- **(release)** replace bc with awk in release-plz star formatting by
@jdx in
[d7f177f](d7f177f)
- bump hk to 1.44.3 by @jdx in
[#9493](#9493)
- invert CLAUDE.md/AGENTS.md so AGENTS.md is canonical by @jdx in
[#9560](#9560)
- set dev profile debug to 1 by @jdx in
[#9572](#9572)

### New Contributors

- @kuboon made their first contribution in
[#9567](#9567)
- @AlternateRT made their first contribution in
[#9557](#9557)
- @2xdevv made their first contribution in
[#9555](#9555)
- @adam-moss made their first contribution in
[#9541](#9541)
- @jlarmstrongiv made their first contribution in
[#9496](#9496)
- @tjarvstrand made their first contribution in
[#9505](#9505)
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