Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
332bc6e
lite implementation of validation infra with placeholders for image n…
theelliotm Jul 31, 2026
03fc97e
aliging with similar projects over naming of prerelease
theelliotm Jul 31, 2026
cc38e54
changing what's enabled for testing
theelliotm Jul 31, 2026
a8040c1
test run with one windows and one linux runner
theelliotm Aug 1, 2026
04a6cf8
removed tests from build workflows
theelliotm Aug 1, 2026
1b88616
lite implementation of validation infra with placeholders for image n…
theelliotm Jul 31, 2026
94cf6d7
aliging with similar projects over naming of prerelease
theelliotm Jul 31, 2026
01996fe
changing what's enabled for testing
theelliotm Jul 31, 2026
5de032e
test run with one windows and one linux runner
theelliotm Aug 1, 2026
39c63f8
removed tests from build workflows
theelliotm Aug 1, 2026
723caa2
Merge branch 'user/emichlin/validation-infra-lite' of https://github.…
theelliotm Aug 3, 2026
c8db517
Fix naming + re-running failed action
theelliotm Aug 3, 2026
d951ef9
ci: add throwaway 1ES connectivity smoke workflow
huzaifa-msft Aug 3, 2026
81fc367
ci: restructure 1ES smoke to push-trigger, drop ImageOverride
huzaifa-msft Aug 3, 2026
c4fbae4
ci: add unique JobId label to 1ES runs-on
huzaifa-msft Aug 3, 2026
c52e17d
migrating APIs
theelliotm Aug 3, 2026
11c7cd7
ci: use scale-set targeting (pool name only) for 1ES pool
huzaifa-msft Aug 3, 2026
157df5f
ci: revert to webhook multi-label format after removing UseScaleSet
huzaifa-msft Aug 3, 2026
b004f5e
changing format of runs-on to match similar projects
theelliotm Aug 3, 2026
2750006
ci: retrigger 1ES smoke after pool re-save (webhook mode)
huzaifa-msft Aug 3, 2026
afd00da
ci: target fresh webhook-mode pool ...-wh (clean experiment)
huzaifa-msft Aug 3, 2026
7d99dc7
ci: target repo-level pool 1es-mxc-test-2 (bypasses org group gate)
huzaifa-msft Aug 4, 2026
e7e0822
ci: fix shell to powershell (client image has no pwsh); repo-level po…
huzaifa-msft Aug 4, 2026
af27bed
updated powershell to use 5.1
theelliotm Aug 4, 2026
1903465
adding bubblewrap install for linux test prereq. for windows, reverti…
theelliotm Aug 4, 2026
0954172
triggering linux test scripts via bash
theelliotm Aug 4, 2026
2c05316
bubblewrap test now owns files it delegates
theelliotm Aug 4, 2026
d932a42
diagnosing interactive desktop issues
theelliotm Aug 4, 2026
6af23d8
diagnostics should continue on error
theelliotm Aug 4, 2026
8a22379
Removing diagnostics - intended behavior.
theelliotm Aug 4, 2026
ba25dba
Testing MacOS runners with sample e2e test script
theelliotm Aug 4, 2026
7fc8290
fix bugs in e2e test for macos
theelliotm Aug 5, 2026
8d3dfb5
better naming conventions
theelliotm Aug 5, 2026
6be9109
Merge branch 'main' into user/emichlin/validation-infra-lite
theelliotm Aug 5, 2026
5ec57a3
fixed naming since github truncates things
theelliotm Aug 5, 2026
03f26ff
test(wslc): add WSLC e2e suite, guards, and 1ES workflow
huzaifa-msft Aug 5, 2026
f3ecca1
Clearer file naming and debloated matrix generator script. Disabled n…
theelliotm Aug 6, 2026
fc95d8f
Added new pools for rest of x64 OS versions.
theelliotm Aug 6, 2026
894a095
Merge remote-tracking branch 'origin/main' into user/emichlin/validat…
theelliotm Aug 6, 2026
05e2cb8
bug fix
theelliotm Aug 6, 2026
d2320d5
Testing additional OS versions
theelliotm Aug 6, 2026
840d361
ci(wslc): target new 1es-mxc-e2e-windows-25h2-wsl2 pool (WSL2 baked i…
huzaifa-msft Aug 6, 2026
ba633ed
ci(wslc): make workflow bash-free for the bare 1ES client image
huzaifa-msft Aug 6, 2026
cf66010
ci(wslc): probe WSL2 feature state before build (image verification)
huzaifa-msft Aug 6, 2026
cbf4264
added additional package manager support for linux prereq installs
theelliotm Aug 6, 2026
0038997
fixing debain package manager issue
theelliotm Aug 6, 2026
bc0e731
Merge remote-tracking branch 'origin/main' into user/emichlin/validat…
theelliotm Aug 6, 2026
8dd44ac
ci(wslc): enable WSL2 on stateful pool VM (enable + reboot if needed)
huzaifa-msft Aug 6, 2026
7cbb52f
ci(wslc): make WSL2 probe non-fatal so prep step runs
huzaifa-msft Aug 6, 2026
28ee1d2
ci(wslc): fix prep step PowerShell parse error (plain ASCII, simpler …
huzaifa-msft Aug 6, 2026
ceef61f
force github to run action after downtime
theelliotm Aug 7, 2026
d40bf3d
added support for more microvm, lxc. and hyperlight. they should fail…
theelliotm Aug 7, 2026
428ac49
testing microvm on 23H2 with additional optional features. also corre…
theelliotm Aug 8, 2026
4ca3db1
Testing process-t1 on unsuitable host. And network test for debian.
theelliotm Aug 8, 2026
7aa0d46
Added additional opt. features to Windows for WSLC and microvm support.
theelliotm Aug 8, 2026
cb51bdd
fix microvm install for windows
theelliotm Aug 8, 2026
c3fcc0a
added a ton of diagnosis and redundancy to microvm tests to determine…
theelliotm Aug 9, 2026
daed2e6
experimenting with cold start for nanvix
theelliotm Aug 9, 2026
957f953
additional nanvix debugging. last effort
theelliotm Aug 9, 2026
e758336
WHP probe
theelliotm Aug 9, 2026
aae46a2
last ditch effort to see why nanvix is failing
theelliotm Aug 10, 2026
b6973d9
Merge remote-tracking branch 'origin/user/modanish/1es-github-runner-…
theelliotm Aug 10, 2026
223fd43
adding limited WSLC support, changing how windows hosts are setup
theelliotm Aug 10, 2026
c30e47b
cold start for microvm on windows, and adding wslc test suite
theelliotm Aug 10, 2026
c8bdb8a
fix incorrect pwsh ver call
theelliotm Aug 10, 2026
de534cf
removed wslc cargo tests
theelliotm Aug 10, 2026
af7134b
installing wsl
theelliotm Aug 10, 2026
5430ce5
disabling support for microvm, for now
theelliotm Aug 10, 2026
3686d6b
prerelease windows tests
theelliotm Aug 10, 2026
57b2f42
added wsl install, modified isolation session test script
theelliotm Aug 11, 2026
23ed9e6
prev. commit, continued
theelliotm Aug 11, 2026
e1c05eb
Merge remote-tracking branch 'origin/main' into user/emichlin/validat…
theelliotm Aug 11, 2026
c3930fa
Adjusting WSLC install
theelliotm Aug 11, 2026
68a96e1
made changes to images for wslc and isolation session
theelliotm Aug 11, 2026
bb27b47
force new test
theelliotm Aug 11, 2026
ccd5bbd
force again
theelliotm Aug 11, 2026
9c95106
force attempt 3
theelliotm Aug 11, 2026
3d002a1
pausing isolation session before getting feedback, and last effort to…
theelliotm Aug 11, 2026
fdbf531
correcting order of wsl commands
theelliotm Aug 11, 2026
49ba4e4
trying with wsl.exe
theelliotm Aug 11, 2026
a8ab3c1
reverted some WSL changes.
theelliotm Aug 11, 2026
6d71a80
quick redattempt with a few options to install WSL
theelliotm Aug 11, 2026
2f708e8
testing pre-release build for WSLC
theelliotm Aug 11, 2026
2d8f16e
getting ready for PR by double-checking lxc and bubblewrap
theelliotm Aug 11, 2026
8de15cb
Removing PR trigger
theelliotm Aug 11, 2026
adec4f1
Removed temp macOS testing suite
theelliotm Aug 11, 2026
990357c
Cleanup unnecessary changes + address feedback
theelliotm Aug 11, 2026
56c4b45
Merge remote-tracking branch 'origin/main' into user/emichlin/validat…
theelliotm Aug 11, 2026
7f0629b
update copilot documentation + fix microvm still causing issues
theelliotm Aug 11, 2026
f6f5936
adding cargo e2e tests back, for now
theelliotm Aug 11, 2026
e9229de
Running full nightly matrix
theelliotm Aug 11, 2026
8a37be4
Fixing action SHAs
theelliotm Aug 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,54 @@ build.bat --with-microvm # Include NanVix micro-VM binaries

Requires Xcode Command Line Tools and Rust. Produces an unsigned `mxc-exec-mac` binary (codesigning + notarization happen at release time). Schema `0.7.0-alpha` or later required for macOS/Seatbelt backend.

### GitHub Actions

`.github/workflows/Build.yml` is the PR/CI entry point. It fans out to the
workflow-call-only `Build.Windows.Job.yml`, `Build.Linux.Job.yml`, and
`Build.MacOS.Job.yml`, which build and upload the per-target artifacts in
parallel, then to the lint / versioning / SDK jobs.

**Validation (E2E) test infrastructure.** Backend E2E tests run from those same
build artifacts β€” never from a fresh build β€” so artifact production and
consumption stay in one workflow run:

- `.github/workflows/Validation.Tests.Scheduled.yml` β€” scheduled entry point.
The `nightly` plan runs Mon–Sat; Sunday runs `nightly` *and* `weekly`.
`workflow_dispatch` takes a `plan` input to run one on demand.
- `.github/workflows/Validation.Infra.Testing.yml` β€” push-triggered entry point
for iterating on the validation infrastructure itself, on a dedicated branch.
- `.github/workflows/Validation.Tests.Matrix.Job.yml` β€” workflow-call-only,
takes a `plan` input. Its `resolve` job expands the plan into per-family
matrices, then the `windows` / `linux` / `macos` jobs each download the
artifact, prepare the host, and run the backend suite.

An entry point must build the artifacts (call the three `Build.*.Job.yml`
workflows) before calling the matrix job.

**The matrix is declarative:**

- `scripts/ci/validation-test-matrix.json` is the catalog: `platforms` (each
with per-architecture target/artifact/1ES pool and the backends that platform
supports), `handlers` (backend id β†’ test-dispatcher command), and `triggers`
(which OS/backend pairs each plan runs).
- `scripts/ci/resolve-validation-test-matrix.mjs` validates that catalog and
expands a plan (`pr`, `nightly`, `weekly`, `enabled`) into GitHub Actions
matrices. It rejects an invalid catalog before any specialized test runner is
allocated, so add a backend to a trigger only where the platform declares it.
- A non-macOS platform architecture with an empty `pool` is never scheduled,
which is how a catalog entry stays declared but dormant. macOS entries use a
GitHub-hosted `runner` instead of a 1ES `pool`.

**Host preparation** happens in the matrix job before the tests, keyed by the
matrix `backend` id: `scripts/ci/prepare-windows-host.ps1` and
`scripts/ci/prepare-linux-host.sh`. A backend with no prerequisites is an
explicit no-op, so the step runs unconditionally for every entry.

**Test dispatch** goes through `tests/scripts/run_ci_backend_tests.ps1`
(Windows) and `tests/scripts/run_ci_backend_tests.sh` (Linux/macOS), which map
the handler command to the repository's existing backend suite. A handler with
no wired suite fails loudly rather than reporting a false success.

### Individual components

```
Expand Down Expand Up @@ -96,6 +144,19 @@ tests\scripts\run_bwrap_all_tests.sh # All Bubblewrap tests (Linux, req
# E2E test crate β€” Rust executor integration tests (from src/)
cargo test -p wxc_e2e_tests # Invokes MXC binaries directly
cargo test -p wxc_e2e_tests -- --ignored # Include stress tests (run_on_repeat)

# WSLC has no cargo E2E suite β€” it is covered by tests\scripts\run_wslc_all_tests.ps1,
# which the validation matrix runs via tests\scripts\run_ci_backend_tests.ps1.

# CI validation entry points β€” run a backend suite against a downloaded artifact
# the way the validation matrix does. Take the handler command (see the
# `handlers` map in scripts/ci/validation-test-matrix.json), not the matrix
# backend id, except where a tier must be pinned.
tests\scripts\run_ci_backend_tests.ps1 -Backend process-container -BinaryDirectory <dir> -Architecture x64 -ExpectedTier T1
tests\scripts\run_ci_backend_tests.sh <bubblewrap|lxc|seatbelt> <binary-directory>

# Resolve a plan locally to see exactly what CI would schedule
node scripts/ci/resolve-validation-test-matrix.mjs --plan nightly
```

## Architecture
Expand Down
56 changes: 52 additions & 4 deletions .github/workflows/Build.Linux.Job.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@ jobs:
- arch: x64
runner: ubuntu-latest
target: x86_64-unknown-linux-gnu
features: hyperlight
Comment thread
theelliotm marked this conversation as resolved.
- arch: arm64
runner: ubuntu-24.04-arm
target: aarch64-unknown-linux-gnu
features: ''
runs-on: ${{ matrix.runner }}
defaults:
run:
Expand Down Expand Up @@ -54,12 +56,30 @@ jobs:
run: sudo apt-get update && sudo apt-get install -y --no-install-recommends gcc-aarch64-linux-gnu

- name: Build lxc
run: cargo build --locked --release --target ${{ matrix.target }}
--no-default-features --features hyperlight
shell: bash
run: |
set -euo pipefail
features=()
if [[ -n "${{ matrix.features }}" ]]; then
features=(--features "${{ matrix.features }}")
fi
cargo build --locked --release --target "${{ matrix.target }}" \
--no-default-features "${features[@]}"

- name: Test lxc
run: cargo test --locked --release --target ${{ matrix.target }}
--no-default-features --features hyperlight
shell: bash
run: |
set -euo pipefail
features=()
if [[ -n "${{ matrix.features }}" ]]; then
features=(--features "${{ matrix.features }}")
fi
cargo test --locked --release --target "${{ matrix.target }}" \
--no-default-features "${features[@]}"

####################
# E2E Tests are being moved to the Test.Matrix.Job.yml workflow, which runs cross-platform validation
###############

# Bubblewrap is required to run the executor characterization tests in
# wxc_e2e_tests (they skip via has_bwrap() when it is absent). lxc-exec
Expand All @@ -82,6 +102,9 @@ jobs:
run: cargo test --locked --release --target ${{ matrix.target }}
-p wxc_e2e_tests

###############
####################

# PLM (Permissive Learning Mode) is functionally Windows-only, but the
# crate builds cross-platform: the lib's helper modules compile on every
# target, and the binary has a no-op stub `fn main()` for non-Windows so
Expand All @@ -103,6 +126,26 @@ jobs:
run: cargo build --locked --release --target ${{ matrix.target }}
-p unix_test_proxy

# MICROVM NOT WORKING CURRENTLY
# - name: Verify artifact payload
# shell: bash
# working-directory: ${{ github.workspace }}
# run: |
# set -euo pipefail
# bin_dir="src/target/${{ matrix.target }}/release"
# required=(lxc-exec unix-test-proxy)
# if [[ "${{ matrix.arch }}" == "x64" ]]; then
# required+=(nanvixd.elf nanvix_rootfs.img python3.initrd bin/kernel.elf)
# fi
# missing=()
# for file in "${required[@]}"; do
# [[ -f "$bin_dir/$file" ]] || missing+=("$file")
# done
# if (( ${#missing[@]} > 0 )); then
# printf 'Missing artifact files: %s\n' "${missing[*]}" >&2
# exit 1
# fi

- name: Upload binaries
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
Expand All @@ -112,3 +155,8 @@ jobs:
src/target/${{ matrix.target }}/release/unix-test-proxy
if-no-files-found: error
retention-days: 1

# src/target/${{ matrix.target }}/release/nanvixd.elf
# src/target/${{ matrix.target }}/release/nanvix_rootfs.img
# src/target/${{ matrix.target }}/release/python3.initrd
# src/target/${{ matrix.target }}/release/bin/kernel.elf
15 changes: 13 additions & 2 deletions .github/workflows/Build.MacOS.Job.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@ on:
jobs:
build:
name: arm64
# macos-14 / macos-latest are Apple Silicon (arm64); older labels are Intel.
runs-on: macos-14
runs-on: macos-26
defaults:
run:
working-directory: src
Expand Down Expand Up @@ -55,6 +54,18 @@ jobs:
run: cargo test --locked --release --target aarch64-apple-darwin
-p mxc_darwin -p seatbelt_common -p wxc_common -p wxc_e2e_tests

- name: Verify artifact payload
shell: bash
run: |
set -euo pipefail
bin_dir="target/aarch64-apple-darwin/release"
for file in mxc-exec-mac unix-test-proxy; do
if [[ ! -f "$bin_dir/$file" ]]; then
echo "Missing artifact file: $file" >&2
exit 1
fi
done

- name: Upload binaries
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
Expand Down
45 changes: 42 additions & 3 deletions .github/workflows/Build.Windows.Job.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ jobs:
- arch: arm64
runner: windows-11-arm
target: aarch64-pc-windows-msvc
# nanvixd.exe is x64-only, so microvm tests can't run on arm64.
features: hyperlight isolation_session wslc
# Hyperlight and MicroVM runtimes are x64-only.
features: isolation_session wslc
runs-on: ${{ matrix.runner }}
defaults:
run:
Expand Down Expand Up @@ -71,6 +71,36 @@ jobs:
--no-default-features
--features "${{ matrix.features }}"

# MICROVM NOT WORKING CURRENTLY
# - name: Verify artifact payload
# shell: pwsh
# run: |
# $binDir = "target\${{ matrix.target }}\release"
# $required = @(
# "wxc-exec.exe",
# "wxc-host-prep.exe",
# "winhttp-proxy-shim.exe",
# "wxc-windows-sandbox-daemon.exe",
# "wxc-windows-sandbox-guest.exe",
# "wxc-test-proxy.exe",
# "wxc-test-driver.exe",
# "wxc-ui-probe.exe",
# "mxc-diagnostic-console.exe",
# "wslcsdk.dll"
# )
# if ("${{ matrix.arch }}" -eq "x64") {
# $required += @(
# "nanvixd.exe",
# "nanvix_rootfs.img",
# "python3.initrd",
# "bin\kernel.elf"
# )
# }
# $missing = $required | Where-Object { -not (Test-Path (Join-Path $binDir $_)) }
# if ($missing) {
# throw "Missing artifact files: $($missing -join ', ')"
# }

- name: Upload binaries
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
Expand All @@ -85,5 +115,14 @@ jobs:
src/target/${{ matrix.target }}/release/wxc-test-proxy.exe
src/target/${{ matrix.target }}/release/mxc-diagnostic-console.exe
src/target/${{ matrix.target }}/release/wslcsdk.dll
if-no-files-found: warn
src/target/${{ matrix.target }}/release/wxc-ui-probe.exe
src/target/${{ matrix.target }}/release/wxc-test-driver.exe
if-no-files-found: error
retention-days: 1

# src/target/${{ matrix.target }}/release/nanvixd.exe
# src/target/${{ matrix.target }}/release/nanvix_rootfs.img
# src/target/${{ matrix.target }}/release/python3.initrd
# src/target/${{ matrix.target }}/release/bin/kernel.elf
# src/target/${{ matrix.target }}/release/snapshots/kernel.vmem
# src/target/${{ matrix.target }}/release/snapshots/kernel.whp.cbor
8 changes: 5 additions & 3 deletions .github/workflows/Build.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
# Entry point for GHA PR/CI validation. Mirrors the 1ES `1ES.Build.yml`
# split: this file orchestrates, each stage lives in its own reusable.

name: Build

on:
push:
paths-ignore:
- 'docs/**'
branches: [main]

pull_request:
paths-ignore:
- 'docs/**'
branches: [main, 'feature/*', 'user/*']

workflow_call:
Expand All @@ -18,6 +19,7 @@ concurrency:
cancel-in-progress: true

permissions:
actions: read
contents: read

jobs:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/Lint.Job.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
clippy-args: --locked --all-targets --all-features --release
- os_label: macos
component: MAC
runner: macos-14
runner: macos-26
target: aarch64-apple-darwin
working-directory: src
# Workspace has Windows-only crates, so --all-features won't build on macOS.
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/SDK.Integration.Test.Job.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
- os_label: linux
runner: ubuntu-latest
- os_label: macos
runner: macos-14
runner: macos-26
runs-on: ${{ matrix.runner }}
defaults:
run:
Expand Down
38 changes: 38 additions & 0 deletions .github/workflows/Validation.Infra.Testing.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: Validation Infrastructure Testing

on:
push:
branches:
- user/emichlin/validation-infra-lite

concurrency:
group: validation-infra-pr-tests-${{ github.ref }}
cancel-in-progress: true

permissions:
actions: read
contents: read

jobs:
dependency-feed-check:
uses: ./.github/workflows/Dependency.Feed.Check.Job.yml

windows:
needs: dependency-feed-check
uses: ./.github/workflows/Build.Windows.Job.yml

linux:
needs: dependency-feed-check
uses: ./.github/workflows/Build.Linux.Job.yml

macos:
needs: dependency-feed-check
uses: ./.github/workflows/Build.MacOS.Job.yml

test:
needs: [windows, linux, macos]
uses: ./.github/workflows/Validation.Tests.Matrix.Job.yml
with:
# Exercise every combination currently rolled out, independent of its
# normal PR/nightly/weekly schedule.
plan: nightly
Loading
Loading