Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
32b923f
Run the test orchestrator on Windows
hujc7 Oct 13, 2026
bad4d19
Mark the Windows-safe isaaclab.utils tests for Windows CI
hujc7 Oct 13, 2026
efda6eb
Test ovrtx coexistence and Kit RTX camera rendering on Windows
hujc7 Oct 13, 2026
9af768a
Add Windows CI and Windows installation tests
hujc7 Oct 13, 2026
05cef35
Keep the Windows installation venvs under a short path
hujc7 Oct 13, 2026
378000b
Share the Cartpole camera check across renderers
hujc7 Oct 22, 2026
9ac7828
Merge remote-tracking branch 'upstream/main' into jichuanh/windows-sp…
hujc7 Oct 22, 2026
73bf0ea
Drop the ovrtx coexistence test
hujc7 Oct 22, 2026
ddbb985
Run Windows CI on the base install
hujc7 Oct 22, 2026
64bf152
Keep the Windows CI environment on the runner
hujc7 Oct 22, 2026
f870540
TEMP: mask jobs with no signal while iterating Windows CI
hujc7 Oct 22, 2026
61e8745
TEMP: print the Windows runner's cache state
hujc7 Oct 22, 2026
22e5dfc
Merge remote-tracking branch 'upstream/main' into jichuanh/windows-sp…
hujc7 Oct 22, 2026
234820c
TEMP: time Cartpole camera training for every combination
hujc7 Oct 23, 2026
2fbb480
Merge remote-tracking branch 'upstream/main' into jichuanh/windows-sp…
hujc7 Oct 23, 2026
2798664
Restore the Warp kernel cache in Windows CI
hujc7 Oct 23, 2026
31bd022
TEMP: measure Windows CI fresh and warm with the caches restored
hujc7 Oct 23, 2026
0522fc8
Revert the TEMP Windows CI measurement commits
hujc7 Oct 23, 2026
599f575
Keep the Windows Warp cache beside the environment
hujc7 Oct 23, 2026
eb6c024
TEMP: mask Installation Tests (Windows) while iterating Windows CI
hujc7 Oct 23, 2026
e76ce89
Check the Windows Warp cache path inline
hujc7 Oct 23, 2026
9cb2a7e
Train camera Cartpole on every backend pairing in Windows CI
hujc7 Oct 23, 2026
b050bfd
Ignore hdf5 test cleanup errors only on Windows
hujc7 Oct 24, 2026
23a67be
Rebuild the Windows CI environment on runs that save caches
hujc7 Oct 24, 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
117 changes: 117 additions & 0 deletions .github/scripts/windows_ci_caches.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause

# The Warp kernel and OVRTX shader caches of the Linux test jobs (.github/actions/warp-cache-key,
# .github/actions/ovrtx-shader-cache), each in its own Windows collection. Those actions run bash,
# which resolves to WSL on these runners.
#
# Usage: windows_ci_caches.ps1 keys|restored|growth
#
# keys resolves each cache's key and directory and exports the paths the tests read
# restored reports each restore and checks the paths took effect; a save also fingerprints them
# growth reports each cache's size; a save also reports whether the run changed it
#
# The directories survive on a reused runner, so a pull request keeps what earlier jobs compiled.
# CACHE_MODE=save clears them before the restore, so a save publishes only the restored snapshot
# and what that run compiled.

param([Parameter(Mandatory)][ValidateSet('keys', 'restored', 'growth')][string]$Mode)

$saving = $env:CACHE_MODE -eq 'save'
# warp: Warp kernels. kit: driver shaders Kit's RTX renderer compiles into its default directory.
# kitless: driver shaders the OVRTX renderer compiles, redirected by OVRTX_SHADER_CACHE_PATH.
$caches = [ordered]@{
warp = "$env:RUNNER_TOOL_CACHE\isaaclab-warp-cache"
kit = "$env:UV_PROJECT_ENVIRONMENT\Lib\site-packages\isaacsim\kit\cache\nv_shadercache"
kitless = "$env:RUNNER_TOOL_CACHE\isaaclab-ovrtx-shader-cache"
}

function Write-StepOutput([string[]]$Lines) {
$Lines | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append
}

function Get-Fingerprint([string]$Dir) {
uv run --frozen --no-sync python .github/actions/run-package-tests/warp_cache_inventory.py $Dir --fingerprint
}

function Get-Megabytes([string]$Dir) {
[int]((Get-ChildItem -Recurse -File -Force $Dir | Measure-Object Length -Sum).Sum / 1MB)
}

function ConvertTo-KeyPart([string]$Value) {
$Value -replace '[^A-Za-z0-9._-]', '_'
}

switch ($Mode) {
'keys' {
$warpVersions = uv run --frozen --no-sync python .github/actions/warp-cache-key/collection_id.py
if ($LASTEXITCODE -ne 0) { exit 1 }
$driver = (nvidia-smi --query-gpu=driver_version --format=csv,noheader | Select-Object -First 1).Trim()
$arch = (nvidia-smi --query-gpu=compute_cap --format=csv,noheader | Select-Object -First 1).Trim().Replace('.', '')
# The installed versions stand in for the image tag and the ovrtx pin the Linux keys use.
$isaacsim, $ovrtx = (uv run --frozen --no-sync python -c "from importlib.metadata import version; print(version('isaacsim'), version('ovrtx'))") -split ' '
if (-not $driver -or -not $arch -or -not $ovrtx) {
"::error::Could not read the GPU driver, compute capability, or Isaac Sim and ovrtx versions"
exit 1
}
$gpu = "v1-$env:RUNNER_OS-$env:RUNNER_ARCH-sm$arch-drv$(ConvertTo-KeyPart $driver)"
$collections = @{
warp = "warp-v2-$env:RUNNER_OS-$env:RUNNER_ARCH-$warpVersions"
kit = "ovrtx-kit-$gpu-isaacsim$(ConvertTo-KeyPart $isaacsim)"
kitless = "ovrtx-kitless-$gpu-ovrtx$(ConvertTo-KeyPart $ovrtx)"
}
foreach ($name in $caches.Keys) {
$dir = $caches[$name]
if ($saving -and (Test-Path $dir)) { Remove-Item -Recurse -Force $dir }
New-Item -ItemType Directory -Force $dir | Out-Null
$collection = $collections[$name]
"${name}: $collection"
Write-StepOutput @(
"$name-collection=$collection"
"$name-key=$collection-$env:GITHUB_SHA-$env:GITHUB_RUN_ID-$env:GITHUB_RUN_ATTEMPT"
"$name-restore-keys=$collection-"
"$name-dir=$dir"
)
}
@(
"WARP_CACHE_PATH=$($caches.warp)"
"OVRTX_SHADER_CACHE_PATH=$($caches.kitless)"
"OVRTX_KIT_SHADER_CACHE_PATH=$($caches.kit)"
) | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
}
'restored' {
foreach ($name in $caches.Keys) {
$hit = [Environment]::GetEnvironmentVariable("$($name.ToUpper())_HIT")
if ($hit) { "$name cache hit: $hit" } else { "::warning::$name cache miss" }
"$name cache: $(Get-Megabytes $caches[$name]) MB"
}
# tools/verify_warp_cache.py's path check, which fails on the \\?\ prefix Warp reports on
# Windows; its version check always passes on an environment synced from uv.lock.
$reported = uv run --frozen --no-sync python -c "import warp as wp; wp.config.log_level = wp.LOG_WARNING; wp.init(); print(wp.config.kernel_cache_dir)" | Select-Object -Last 1
if (-not "$reported".Replace('\\?\', '').StartsWith($caches.warp, [StringComparison]::OrdinalIgnoreCase)) {
"::error::Warp resolved its kernel cache to $reported, not $($caches.warp)"
exit 1
}
uv run --frozen --no-sync python tools/verify_ovrtx_shader_cache.py
if ($LASTEXITCODE -ne 0) { exit 1 }
if ($saving) {
foreach ($name in $caches.Keys) { Write-StepOutput "$name-fingerprint=$(Get-Fingerprint $caches[$name])" }
}
}
'growth' {
foreach ($name in $caches.Keys) {
$dir = $caches[$name]
# Every snapshot is a new immutable cache entry, so a save that only read back what it
# restored, or found nothing, publishes nothing.
$changed = 'false'
if ($saving -and (Get-ChildItem -Recurse -File $dir | Select-Object -First 1)) {
$before = [Environment]::GetEnvironmentVariable("$($name.ToUpper())_BEFORE")
if ((Get-Fingerprint $dir) -ne $before) { $changed = 'true' }
}
"$name cache: $(Get-Megabytes $dir) MB, changed=$changed"
Write-StepOutput "$name-changed=$changed"
}
}
}
3 changes: 2 additions & 1 deletion .github/workflows/arm-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ jobs:
contents: read
pull-requests: read
outputs:
should_run: ${{ steps.detect.outputs.should_run }}
# TEMP (revert before review): masked while iterating Windows CI on PR 5700.
should_run: 'false'
steps:
- uses: actions/checkout@v6
with:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/docs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ jobs:
name: Build Latest Docs
runs-on: ubuntu-latest
needs: [doc-build-type]
# run on non-deploy branches to build current version docs only
if: needs.doc-build-type.outputs.trigger-deploy != 'true'
# TEMP (revert before review): masked while iterating Windows CI on PR 5700.
if: false

steps:
- name: Checkout code
Expand Down
58 changes: 56 additions & 2 deletions .github/workflows/install-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,8 @@ jobs:
install-tests-x86:
name: Installation Tests (x86)
needs: [changes]
if: needs.changes.outputs.run_install_tests == 'true'
# TEMP (revert before review): masked while iterating Windows CI on PR 5700.
if: false
runs-on: [self-hosted, gpu]
timeout-minutes: 90
steps:
Expand All @@ -146,7 +147,8 @@ jobs:
install-tests-arm:
name: Installation Tests (ARM)
needs: [changes]
if: needs.changes.outputs.run_install_tests == 'true'
# TEMP (revert before review): masked while iterating Windows CI on PR 5700.
if: false
runs-on: [self-hosted, aarch64]
timeout-minutes: 90
steps:
Expand All @@ -172,3 +174,55 @@ jobs:
continue-on-error: true
run: |
.github/scripts/runner_health.sh post-test

# Windows has no Docker, so the suite runs natively. The composite actions above are
# bash and pin setup-uv v6, which crashes on exit on these runners
# (astral-sh/setup-uv#686).
install-tests-windows:
name: Installation Tests (Windows)
needs: [changes]
# TEMP (revert before review): no signal for the Windows CI Warp cache change.
if: false
runs-on: [self-hosted, gpu-windows]
timeout-minutes: 90
defaults:
run:
shell: powershell
env:
PYTHONUTF8: "1"
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Set up uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
with:
version: "0.12.9"

# By name, Windows resolves bash to WSL's launcher in System32 ahead of PATH.
- name: Build wheel
run: |
& "C:\Program Files\Git\bin\bash.exe" tools/wheel_builder/build.sh
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }

- name: Run Tests
env:
TEST_FILTER: ${{ inputs.test_filter }}
run: |
$wheel = @(Get-ChildItem tools/wheel_builder/build/dist -Filter "isaaclab-*.whl")
if ($wheel.Count -ne 1) { throw "expected one wheel, found $($wheel.Count)" }
# pytest's default base sits under the NetworkService profile, deep enough that
# Kit's DLLs in a venv there pass the 260-character path limit.
$pytestArgs = @("--run-gpu", "--tb=short", "-sv", "--basetemp=$env:RUNNER_TEMP\i", "--junitxml=${{ github.workspace }}\results\results.xml")
if ($env:TEST_FILTER) { $pytestArgs += @("-k", $env:TEST_FILTER) }
uv run --no-project --python 3.12 --with pytest python tools/run_install_ci.py native --wheel $wheel[0].FullName -- @pytestArgs
exit $LASTEXITCODE

- name: Upload JUnit XML report
if: always()
uses: actions/upload-artifact@v7
with:
name: install-ci-junit-windows
path: ${{ github.workspace }}/results/results.xml
if-no-files-found: ignore
retention-days: 7
4 changes: 4 additions & 0 deletions .github/workflows/license-check.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ concurrency:

jobs:
license-check:
# TEMP (revert before review): masked while iterating Windows CI on PR 5700.
if: false
runs-on: ubuntu-24.04

steps:
Expand Down Expand Up @@ -158,6 +160,8 @@ jobs:
fi
docker-license-check:
name: Docker Dependency Licenses Check
# TEMP (revert before review): masked while iterating Windows CI on PR 5700.
if: false
runs-on: [self-hosted, gpu]
timeout-minutes: 90

Expand Down
5 changes: 3 additions & 2 deletions .github/workflows/test-multi-gpu-pytest.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,9 @@ jobs:
name: Detect Changes
runs-on: ubuntu-latest
outputs:
unit: ${{ steps.unit.outputs.should_run }}
smoke: ${{ steps.smoke.outputs.should_run }}
# TEMP (revert before review): masked while iterating Windows CI on PR 5700.
unit: 'false'
smoke: 'false'
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
Expand Down
Loading
Loading