Skip to content

chore(ci): use namespace runners for ci jobs#9561

Merged
jdx merged 6 commits intomainfrom
codex/namespace-macos-ci
May 3, 2026
Merged

chore(ci): use namespace runners for ci jobs#9561
jdx merged 6 commits intomainfrom
codex/namespace-macos-ci

Conversation

@jdx
Copy link
Copy Markdown
Owner

@jdx jdx commented May 3, 2026

Summary

  • Run Linux and macOS CI jobs on Namespace runner profiles with quieter job names
  • Move release-plz and Rust-heavy release builds to Namespace with separate cache tags
  • Use endev large Namespace profiles for Linux/macOS release tarballs and the hyperfine serious build
  • Split Namespace Rust caches between PR, release, nightly, and release-plz paths
  • Use explicit Namespace cache paths for Cargo registry/git plus ~/.cache/sccache where sccache runs directly on the runner
  • Configure sccache with SCCACHE_DIR and a 20G cap before the daemon starts, including macOS jobs
  • Add the Namespace logo/acknowledgement to the README and remove the old Cloudflare thanks

CI fixes

  • Replace the benchmark workflow's bc arithmetic with integer shell parsing so boundary regressions such as 1.11 are still detected
  • Keep Linux release tarball dependency caches explicit, but remove ineffective sccache setup from the cross build path
  • Run sccache --show-stats with if: always() on sccache jobs so diagnostics are kept after failures
  • Run registry tool tests in read-only Docker containers with temporary writable paths for tool install/extract work
  • Run Linux e2e tests on Namespace through the Docker e2e wrapper with read-only host mounts, a read-only container root filesystem, and tmpfs-backed writable /tmp and /root
  • Remove the sandbox-specific e2e assertion tests from CI; Linux e2e safety now comes from the Docker container boundary instead of per-test Landlock assertions

Notes

  • Release tarball caches are separate from PR cache tags: mise-release-rust-linux and mise-release-rust-macos.
  • release-plz has its own cache tag: mise-release-plz-rust-linux.
  • The Linux release tarball job uses cross, so it caches Cargo dependencies on the Namespace volume but does not configure runner-local sccache.
  • The e2e Docker wrapper still passes the pooled GITHUB_TOKEN used by tests; it does not expose the GitHub Actions token unless the job environment is changed to provide that token.

Validation

  • actionlint .github/workflows/test.yml .github/workflows/autofix.yml .github/workflows/hyperfine.yml .github/workflows/registry.yml .github/workflows/test-vfox.yml .github/workflows/release-plz.yml .github/workflows/release.yml
  • shellcheck -x e2e/run_all_tests e2e/run_test
  • git diff --check
  • mise x npm:prettier -- prettier --check README.md .github/workflows/test.yml .github/workflows/autofix.yml .github/workflows/hyperfine.yml .github/workflows/registry.yml .github/workflows/test-vfox.yml .github/workflows/release-plz.yml .github/workflows/release.yml
  • cargo check --all-features
  • cargo build
  • E2E_WAIT_FOR_GH_RATE_LIMIT=0 MISE_E2E_DOCKER=1 ./e2e/run_test cli/test_alias
  • E2E_WAIT_FOR_GH_RATE_LIMIT=0 MISE_E2E_DOCKER=1 TEST_TRANCHE=0 TEST_TRANCHE_COUNT=8 ./e2e/run_all_tests
  • hk pre-commit checks during commit

This PR description was generated by an AI coding assistant.


Note

Medium Risk
Medium risk because it substantially changes CI execution environments (runner labels, caching, Docker flags) and tightens Linux Landlock enforcement, which could cause new CI failures or sandboxed commands to error on unsupported kernels.

Overview
CI now runs primarily on Namespace runner profiles (Linux/macOS) with separate cache tags for PR, nightly, release, and release-plz, replacing ubuntu-latest and most Swatinem/rust-cache usage.

Adds namespacelabs/nscloud-cache-action plus runner-local sccache setup across Rust-heavy workflows, and captures sccache --show-stats even on failure.

Hardens containerized test execution: registry test-tool and e2e Docker runs are switched to read-only containers with explicit writable tmp/home mounts, and the hyperfine workflow replaces bc math with integer-safe parsing for variance checks.

Sandboxing behavior is tightened on Linux by failing when Landlock restrictions are not enforced (and docs updated accordingly), and sandbox-specific e2e tests are removed. README now thanks Namespace and includes a new namespace-logo.svg asset.

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

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 3, 2026

Greptile Summary

This PR migrates most GitHub Actions workflows from ubuntu-latest/macos-latest to Namespace runner profiles, replacing Swatinem/rust-cache with namespacelabs/nscloud-cache-action + sccache (with separate cache tags for PR, nightly, release, and release-plz). It also tightens Linux Landlock sandbox enforcement (now hard-fails when RulesetStatus::NotEnforced or no_new_privs is absent), hardens registry test-tool Docker runs with --read-only + explicit volume mounts, and replaces bc-based hyperfine variance math with pure integer shell arithmetic.

Confidence Score: 5/5

Safe to merge; all findings are P2 suggestions about test coverage, no runtime or security defects introduced.

Only P2 findings present (sandbox test coverage reduction). The Landlock logic change is correct and consistent with the updated docs. CI infrastructure changes are well-structured with proper cache tag separation.

src/sandbox/landlock.rs — behavior change (hard-fail on NotEnforced) now has no dedicated e2e test in CI.

Important Files Changed

Filename Overview
src/sandbox/landlock.rs Stricter enforcement: now bails on NotEnforced/missing no_new_privs; PartiallyEnforced still allowed (intentional). Logic looks correct but all sandbox e2e tests were removed in this PR.
.github/workflows/test.yml Migrates all Linux/macOS jobs to Namespace runner profiles with nscloud-cache-action + sccache; removes sandbox test loop from unit job; sccache --show-stats added with if:always().
.github/workflows/registry.yml test-tool Docker containers hardened with --read-only, explicit tmp/var-tmp/home volume mounts, and HOME/MISE_* env exports inside the shell; persist-credentials:false added to checkout.
.github/workflows/hyperfine.yml Replaces bc-based variance arithmetic with pure integer shell parsing; threshold comparison now uses variance_scaled correctly (>1100 for >10%). Logic is sound.
.github/workflows/release.yml Linux tarball job moves to Namespace large runner with nscloud-cache-action (no sccache for cross); macOS tarball adds sccache; cargo-cache autoclean removed in favour of Namespace volume caching.
.github/workflows/release-plz.yml Migrated to Namespace runner with separate release-plz cache tag; sccache configured; sccache --show-stats added with if:always().
e2e/run_test Docker mode gains --read-only with --tmpfs /root and /tmp; entrypoint changed from direct script exec to explicit bash invocation.
e2e/sandbox/test_sandbox_deny_write Deleted — was the primary test for --deny-write and --allow-write; no direct replacement is visible in the diff.
.github/actionlint.yaml Adds all new Namespace runner label variants to the actionlint allowlist so workflow linting passes.
docs/sandboxing.md Docs updated to reflect the new hard-fail behavior when Landlock cannot enforce filesystem restrictions, consistent with the landlock.rs change.
README.md Replaces Cloudflare Project Alexandria acknowledgement with Namespace logo and link.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[apply_landlock called] --> B{deny_read or deny_write?}
    B -- neither --> C[return Ok early]
    B -- yes --> D[Build Ruleset with BestEffort compat]
    D --> E{deny_read + deny_write?}
    E -- both --> F[add system read rules + /tmp+/dev full + installs + allow_read + allow_write]
    E -- read only --> G[add system read rules + allow_read + allow_write as read]
    E -- write only --> H[allow read everywhere + /tmp+/dev full + allow_write paths]
    F & G & H --> I[ruleset.restrict_self]
    I --> J{status check}
    J -- NotEnforced OR !no_new_privs --> K[bail! error]
    J -- FullyEnforced OR PartiallyEnforced --> L[return Ok]
Loading

Fix All in Claude Code

Reviews (19): Last reviewed commit: "Merge branch 'main' into codex/namespace..." | Re-trigger Greptile

Comment thread .github/workflows/test.yml Outdated
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 adds a new macOS ARM64 runner label to the actionlint configuration and includes a Namespace logo and acknowledgement in the README. Feedback highlights that the new runner label is not yet utilized in the workflow files and suggests improvements to the README's HTML structure and the SVG's scaling properties.

Comment thread .github/actionlint.yaml
# Labels of self-hosted runner in array of strings.
labels:
- macos-14
- namespace-profile-endev-macos-arm64
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

high

The PR description indicates that macOS jobs should now run on the namespace-profile-endev-macos-arm64 runner and use a specific cache volume. However, the necessary updates to the workflow files (.github/workflows/test.yml and .github/workflows/release.yml) are not included in this pull request. This label will not be utilized until those workflows are updated.

Comment thread README.md Outdated
Comment on lines +205 to +211
<p>
<a href="https://namespace.so">
<img src="docs/public/namespace-logo.svg" alt="Namespace" width="64">
</a>
</p>

Thanks to [Namespace](https://namespace.so) for providing CI services for mise.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The Namespace acknowledgement is currently split into separate blocks with excessive vertical spacing. Grouping the logo and text within a single paragraph improves cohesion. Additionally, adding a height attribute to the img tag helps prevent layout shifts.

Suggested change
<p>
<a href="https://namespace.so">
<img src="docs/public/namespace-logo.svg" alt="Namespace" width="64">
</a>
</p>
Thanks to [Namespace](https://namespace.so) for providing CI services for mise.
<p>
<a href="https://namespace.so">
<img src="docs/public/namespace-logo.svg" alt="Namespace" width="64" height="64">
</a>
<br>
Thanks to <a href="https://namespace.so">Namespace</a> for providing CI services for mise.
</p>

Comment thread docs/public/namespace-logo.svg Outdated
@@ -0,0 +1,5 @@
<svg width="160" height="160" xmlns="http://www.w3.org/2000/svg">
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The SVG is missing a viewBox attribute. Adding viewBox="0 0 160 160" ensures the logo scales correctly when its dimensions are specified in HTML or CSS, maintaining the intended aspect ratio and clarity.

<svg width="160" height="160" viewBox="0 0 160 160" xmlns="http://www.w3.org/2000/svg">

@jdx jdx force-pushed the codex/namespace-macos-ci branch from 74d6efe to a4887d1 Compare May 3, 2026 12:34
@jdx jdx changed the title chore(ci): use namespace for macos jobs chore(ci): use namespace runners for pr jobs May 3, 2026
@jdx jdx force-pushed the codex/namespace-macos-ci branch 4 times, most recently from 42984fb to fe71151 Compare May 3, 2026 12:55
@jdx jdx changed the title chore(ci): use namespace runners for pr jobs chore(ci): use namespace runners for ci jobs May 3, 2026
@jdx jdx force-pushed the codex/namespace-macos-ci branch from fe71151 to 17620eb Compare May 3, 2026 12:57
Comment thread .github/workflows/test.yml
@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 18.0 ± 0.7 16.4 21.3 1.00
mise x -- echo 18.3 ± 1.1 16.6 34.5 1.02 ± 0.07

mise env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 env 18.0 ± 0.9 16.1 25.6 1.00
mise env 18.1 ± 0.8 16.5 22.0 1.01 ± 0.07

mise hook-env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 hook-env 18.6 ± 0.8 16.8 22.4 1.00
mise hook-env 18.9 ± 0.8 17.3 22.5 1.02 ± 0.06

mise ls

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 ls 15.4 ± 0.8 13.8 18.7 1.00
mise ls 15.7 ± 0.8 14.0 20.7 1.02 ± 0.07

xtasks/test/perf

Command mise-2026.4.28 mise Variance
install (cached) 120ms 123ms -2%
ls (cached) 57ms 59ms -3%
bin-paths (cached) 62ms 63ms -1%
task-ls (cached) 530ms 529ms +0%

@jdx jdx force-pushed the codex/namespace-macos-ci branch from 17620eb to 14343a1 Compare May 3, 2026 13:18
Comment thread .github/workflows/hyperfine.yml Outdated
Comment thread .github/workflows/release.yml Outdated
@jdx jdx force-pushed the codex/namespace-macos-ci branch 8 times, most recently from 2354a9a to d2c6c61 Compare May 3, 2026 14:38
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit d2c6c61. Configure here.

Comment thread e2e/run_test Outdated
@jdx jdx force-pushed the codex/namespace-macos-ci branch from d2c6c61 to c3b2772 Compare May 3, 2026 14:48
@jdx jdx force-pushed the codex/namespace-macos-ci branch from c3b2772 to 2a7d513 Compare May 3, 2026 14:52
@jdx jdx enabled auto-merge (squash) May 3, 2026 15:44
@jdx jdx merged commit f4bab80 into main May 3, 2026
44 checks passed
@jdx jdx deleted the codex/namespace-macos-ci branch May 3, 2026 15:44
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