Skip to content

test(e2e): wait for docker env cleanup#9631

Merged
jdx merged 1 commit intojdx:mainfrom
risu729:fix/e2e-docker-temp-cleanup
May 6, 2026
Merged

test(e2e): wait for docker env cleanup#9631
jdx merged 1 commit intojdx:mainfrom
risu729:fix/e2e-docker-temp-cleanup

Conversation

@risu729
Copy link
Copy Markdown
Contributor

@risu729 risu729 commented May 5, 2026

Summary

  • wait for successful e2e test environment cleanup when the test is running inside Docker
  • keep asynchronous cleanup outside Docker so local/non-Docker runs keep the existing fast path
  • remove the need for a second cleanup container that chmods the Docker bind mounts

Context

#9570 changed Docker e2e runs to bind-mount host-backed directories for /tmp and /root instead of using tmpfs. Inside the container, mktemp -d creates root-owned 0700 per-test directories under the bind-mounted /tmp.

For successful tests, e2e/run_test previously started rm -rf "$TEST_ISOLATED_DIR" in the background. When the Docker container exits before that background cleanup reliably finishes, root-owned 0700 test directories can be left behind on the host mount. The outer host-side cleanup then emits permission noise such as rm: cannot remove.

Waiting for rm -rf only when MISE_E2E_INSIDE_DOCKER=1 fixes the source of that host-side cleanup noise without running a second container or broadly chmodding both mounts.

Failed tests keep the existing behavior: the isolated test environment is left in place and reported for inspection, and the returned test status remains unchanged.

Tests

  • git diff --check
  • bash -n e2e/run_test
  • mise x shellcheck -- shellcheck -x e2e/run_test
  • mise x shfmt -- shfmt -d e2e/run_test
  • MISE_E2E_DOCKER=1 E2E_WAIT_FOR_GH_RATE_LIMIT=0 mise run test:e2e e2e/cli/test_version
    • verified captured output had no rm: cannot remove lines

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 a cleanup_docker_mounts function within the run_in_docker routine to resolve permission issues when deleting Docker-mounted directories. The reviewer suggests implementing a trap to ensure that cleanup is performed even if the script is interrupted by signals like SIGINT, preventing leftover root-owned directories.

Comment thread e2e/run_test Outdated
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 5, 2026

Greptile Summary

This PR fixes a race condition in Docker-based e2e tests where root-owned files created inside the container could not be removed by the host runner after the container exited, causing cleanup errors to mask a passing test status under set -euo pipefail.

  • Changes remove_isolated_env to perform a synchronous rm -rf (dropping the trailing &) when running inside Docker, so all test-created files are removed by the container's root process before Docker exits — leaving the host-side bind-mount directories empty and reliably removable.
  • The non-Docker path retains the background cleanup (&) for performance, preserving existing behavior on local and non-namespaced runners.

Confidence Score: 5/5

Safe to merge — the change is a one-function, two-branch fix to a shell cleanup helper with no risk to test logic or production code.

The change is minimal and targeted: a single conditional added to remove_isolated_env that switches between synchronous and background cleanup based on a well-scoped environment variable. The fix correctly addresses the root cause — files created inside Docker as root need to be cleaned up from within the container before it exits, otherwise the host runner cannot remove them under set -e. All other code paths are unaffected.

No files require special attention.

Reviews (2): Last reviewed commit: "test(e2e): wait for docker env cleanup" | Re-trigger Greptile

@risu729 risu729 force-pushed the fix/e2e-docker-temp-cleanup branch from 9bf372b to 40221f8 Compare May 6, 2026 13:01
@risu729 risu729 changed the title test(e2e): clean docker temp mounts as host test(e2e): wait for docker env cleanup May 6, 2026
@risu729
Copy link
Copy Markdown
Contributor Author

risu729 commented May 6, 2026

CI note: windows-e2e failed in zig.executes zig 2024.11.0-mach because both attempts timed out fetching https://pkg.hexops.org/zig/zig-windows-x86_64-0.14.0-dev.2577+271452d22.zip on the Windows runner. This is unrelated to the Docker e2e cleanup change in e2e/run_test; the Linux Docker e2e shards all passed, and the local Docker smoke output had no rm: cannot remove lines.

The aggregate test-ci check is red only because windows-e2e is red. I attempted to rerun the failed job, but GitHub rejected it because this account does not have repository admin rights.

This comment was generated by an AI coding assistant.

@risu729 risu729 marked this pull request as ready for review May 6, 2026 13:29
@jdx jdx merged commit c2791ed into jdx:main May 6, 2026
33 of 35 checks passed
@risu729 risu729 deleted the fix/e2e-docker-temp-cleanup branch May 6, 2026 20:43
mise-en-dev added a commit that referenced this pull request May 7, 2026
### 🚀 Features

- **(aqua)** support registry libc variants by @jdx in
[#9652](#9652)
- **(bin-paths)** add executable names output by @risu729 in
[#9617](#9617)

### 🐛 Bug Fixes

- **(aqua)** preserve configured file extensions by @risu729 in
[#9611](#9611)
- **(aqua)** support registry file links by @risu729 in
[#9610](#9610)
- **(backend)** reject bare package backend names by @risu729 in
[#9608](#9608)
- **(backend)** apply inline tool option overrides by @risu729 in
[#9306](#9306)
- **(backend)** skip versions host for local tool opts by @risu729 in
[#9568](#9568)
- **(github)** chmod explicit archive bin by @risu729 in
[#9609](#9609)
- **(install)** skip remote-versions refresh in prefer-offline mode by
@jdx in [#9627](#9627)
- **(lock)** scope targets to active project root by @risu729 in
[#9319](#9319)
- **(lockfile)** respect existing platforms during auto-lock by @jdx in
[#9621](#9621)
- **(pipx)** filter yanked pypi releases by @risu729 in
[#9607](#9607)
- **(pipx)** declare python as a backend dependency by @jdx in
[#9678](#9678)
- **(schema)** update refs to $defs in mise-registry-tool.json by
@risu729 in [#9671](#9671)
- **(task)** terminate parallel siblings on failure via process groups
by @jdx in [#9655](#9655)
- **(task)** stable MISE_PROJECT_ROOT for monorepo tasks, add
MISE_MONOREPO_ROOT by @jdx in
[#9657](#9657)
- **(trust)** run enter hooks after trusting config by @risu729 in
[#9634](#9634)
- **(ui)** stop clearing screen for prompts by @jdx in
[#9619](#9619)
- use /bin/cp on macos by @pdehlke in
[#9656](#9656)

### 🚜 Refactor

- **(aqua)** store aqua var defaults as strings by @risu729 in
[#9645](#9645)
- **(config)** support structured TOML values in registry backend
options by @risu729 in [#9584](#9584)
- **(deps)** remove serde_derive dependency by @risu729 in
[#9670](#9670)
- **(deps)** remove anyhow dependency by @risu729 in
[#9661](#9661)
- **(deps)** use std::sync::LazyLock instead of once_cell::Lazy by
@risu729 in [#9668](#9668)
- **(schema)** generate task schema from mise schema by @risu729 in
[#9581](#9581)
- **(schema)** reuse task props with unevaluatedProperties by @risu729
in [#9582](#9582)
- **(schema)** reuse registry common types by @risu729 in
[#9648](#9648)
- **(schema)** reuse plugin script config by @risu729 in
[#9647](#9647)
- **(schema)** use $defs in schema files by @risu729 in
[#9646](#9646)

### 📚 Documentation

- **(node)** add tips for enabling node idiomatic by @fu050409 in
[#9675](#9675)

### 🧪 Testing

- **(cli)** remove nondeterministic tool depends assertion by @risu729
in [#9633](#9633)
- **(e2e)** pin uv to 0.11.8 around astral-sh/uv#19278 by @jdx in
[#9618](#9618)
- **(e2e)** wait for docker env cleanup by @risu729 in
[#9631](#9631)
- **(zig)** use official zig instead of mach mirror by @jdx in
[#9659](#9659)

### 📦️ Dependency Updates

- fall through to hash check when providers have no outputs by @jdx in
[#9622](#9622)
- bump Cargo.lock by @jdx in
[#9625](#9625)

### 📦 Registry

- remove registry depends by @risu729 in
[#9571](#9571)
- add code-review-graph (pipx:code-review-graph) by @chautruonglong in
[#9673](#9673)

### Chore

- **(ci)** split large registry test-tool changes by @risu729 in
[#9628](#9628)
- **(ci)** make perf script robust to runner noise by @jdx in
[#9635](#9635)
- **(ci)** skip hyperfine comments without permission by @risu729 in
[#9629](#9629)

### New Contributors

- @chautruonglong made their first contribution in
[#9673](#9673)
- @pdehlke made their first contribution in
[#9656](#9656)

## 📦 Aqua Registry Updates

### New Packages (5)

-
[`anthropics/anthropic-cli`](https://github.com/anthropics/anthropic-cli)
- [`crates.io/wasmi_cli`](https://github.com/wasmi-labs/wasmi)
- [`openclaw/gogcli`](https://github.com/openclaw/gogcli)
- `racket-lang.org/racket-minimal`
- [`runs-on/cli`](https://github.com/runs-on/cli)

### Updated Packages (13)

- [`UpCloudLtd/upcloud-cli`](https://github.com/UpCloudLtd/upcloud-cli)
- [`aristocratos/btop`](https://github.com/aristocratos/btop)
- [`dprint/dprint`](https://github.com/dprint/dprint)
- [`j178/prek`](https://github.com/j178/prek)
- [`jdx/hk`](https://github.com/jdx/hk)
- [`jdx/mise`](https://github.com/jdx/mise)
- [`jdx/usage`](https://github.com/jdx/usage)
- [`jreleaser/jreleaser`](https://github.com/jreleaser/jreleaser)
-
[`jreleaser/jreleaser/standalone`](https://github.com/jreleaser/jreleaser)
- [`pnpm/pnpm`](https://github.com/pnpm/pnpm)
- [`suzuki-shunsuke/cmdx`](https://github.com/suzuki-shunsuke/cmdx)
- [`suzuki-shunsuke/ghir`](https://github.com/suzuki-shunsuke/ghir)
- [`twpayne/chezmoi`](https://github.com/twpayne/chezmoi)
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