Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
f267f96
CI: reliable pipeline cancellation (per-PR concurrency + interruptibl…
nvsekkin Apr 30, 2026
103ae68
Add PhysX joint wrench sensor
AntoineRichard Apr 30, 2026
7d83171
Resolve PhysX joint wrench articulation roots
AntoineRichard Apr 30, 2026
a7f68ee
Enable classic Newton wrench observations
AntoineRichard Apr 30, 2026
da5ff06
Honor PhysX joint wrench frame convention
AntoineRichard Apr 30, 2026
e57269f
Performance optimization on asset writes (#5329)
AntoineRichard Apr 30, 2026
951978b
Gate isaacteleop dependency on Linux to fix Windows install (#5441)
rwiltz Apr 30, 2026
9817fce
Fix required CI checks for docs-only PRs (#5454)
AntoineRichard Apr 30, 2026
88d2407
OVRTX Correctness (#5401)
huidongc Apr 30, 2026
41908c0
Makes ovphysx an optional install of isaaclab_ovphysx (#5428)
ooctipus Apr 30, 2026
5037857
Avoids force push for doc deploy job (#5460)
kellyguo11 Apr 30, 2026
082e488
Fixes more installation issues for ARM and Windows (#5431)
myurasov-nv Apr 30, 2026
8fdb110
Remove colors of deformable cube tutorial docs (#5456)
mmichelis Apr 30, 2026
61c8a94
Fixes multi-GPU device resolution in AppLauncher (#5215)
kellyguo11 May 1, 2026
3827956
[Rough Locomotion] Part 2: H1/Cassie bipeds on Newton (#5298)
hujc7 May 1, 2026
11b8c64
Suspends Fabric USD notice listener during cloning for faster startup…
ooctipus May 1, 2026
a6e7577
Document Kamino solver presets (#5457)
AntoineRichard May 1, 2026
6dfa5fa
OMPE-90534: Add json nsys trace definitions (#5397)
jmart-nv May 1, 2026
2b49dac
Updates wheel versioning (#5467)
myurasov-nv May 1, 2026
3303bef
Adds compatibility note regarding Isaac Sim (#5465)
kellyguo11 May 1, 2026
8bb6eff
Adds retry logic for timeout tests (#5448)
kellyguo11 May 1, 2026
7166229
Skip cloner perf test and fix ray caster intrinsics camera pose (#5470)
ooctipus May 1, 2026
261d077
Patch newton model reqs (#5398)
matthewtrepte May 1, 2026
779a0fc
Adds support for gear insertion with Flexiv Rizon 4s (#5175)
shauryadNv May 2, 2026
9bf2920
Add fragment-based changelog system to eliminate per-PR merge conflic…
hujc7 May 2, 2026
26c253c
CI: trigger build.yaml workflow on scripts/ changes (#5442)
jmart-nv May 3, 2026
d3ce0b3
OMPE-85851: Added success metric tracking to benchmark scripts. (#5335)
jmart-nv May 3, 2026
8394807
[Newton] Adds joint wrench sensor (#5412)
camevor May 3, 2026
d48075a
Adds LEAPP export integration (#5105)
frlai May 3, 2026
26cfdda
Decouple Renderer from Camera (#5297)
r-schmitt May 4, 2026
add60a1
Simplifies CI change detection and concurrency groups (#5466)
myurasov-nv May 4, 2026
9da0c2f
Refactors visualizer cloning around ClonePlan (#5484)
ooctipus May 4, 2026
347ce94
[Rough Locomotion] Part 3: G1 on Newton (max_iterations 3000→5000, no…
hujc7 May 4, 2026
08dbf1f
add RenderContext to docs (#5489)
r-schmitt May 4, 2026
744e371
omniverseclient pin (#5487)
huidongc May 5, 2026
33f5f71
Update a set of small documentation inconsistencies (#5490)
Alex-Omar-Nvidia May 5, 2026
5afbca4
Reduce rendering test flakiness (#5475)
huidongc May 5, 2026
4758900
Restores GR1T2 legacy teleop pipeline for teleop CI (#5254)
rwiltz May 5, 2026
9ffafbb
Replace add_usd with open_usd (#5491)
pbarejko May 5, 2026
2644c1e
Sync video recorder's (--video) renderer backend with the active visu…
matthewtrepte May 5, 2026
e0812b8
Merge remote-tracking branch 'origin/develop' into pr-5458-merge-develop
AntoineRichard May 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .github/actions/run-package-tests/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ inputs:
description: 'Additional pytest options'
default: ''
required: false
extra-pip-packages:
description: 'Space-separated pip packages to install inside the Docker container before pytest starts'
default: ''
required: false
container-name:
description: 'Docker container name prefix (run-id is appended automatically)'
required: true
Expand Down Expand Up @@ -134,6 +138,7 @@ runs:
quarantined-only: ${{ inputs.quarantined-only }}
include-files: ${{ inputs.include-files }}
volume-mount-source: ${{ github.workspace }}
extra-pip-packages: ${{ inputs.extra-pip-packages }}

- name: Check Test Results
if: always()
Expand Down
71 changes: 63 additions & 8 deletions .github/actions/run-tests/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ inputs:
description: 'Host path to bind-mount at /workspace/isaaclab (for deps-cache-hit mode)'
default: ''
required: false
extra-pip-packages:
description: 'Space-separated pip packages to install inside the Docker container before pytest starts'
default: ''
required: false

runs:
using: composite
Expand All @@ -77,11 +81,30 @@ runs:
local shard_index="${11}"
local shard_count="${12}"
local volume_mount_source="${13}"
local extra_pip_packages="${14}"
local logs_pid=""
local wait_pid=""
local docker_wait_file="/tmp/.docker_exit_${container_name}"

# Kill the container immediately if the runner is cancelled.
# The GitHub Actions runner can deliver HUP, INT, or TERM on cancellation
# (see actions/runner#1309). Trap all three so the cleanup always fires.
# shellcheck disable=SC2064
trap "echo '::warning::Cancellation signal - killing container ${container_name}'; \
docker kill '${container_name}' 2>/dev/null || true; \
docker rm -f '${container_name}' 2>/dev/null || true; \
rm -f '${docker_wait_file}'; \
if [ -n \"\$logs_pid\" ]; then kill \"\$logs_pid\" 2>/dev/null || true; fi; \
if [ -n \"\$wait_pid\" ]; then kill \"\$wait_pid\" 2>/dev/null || true; fi; \
exit 130" HUP INT TERM

echo "Running tests in: $test_path"
if [ -n "$pytest_options" ]; then
echo "With pytest options: $pytest_options"
fi
if [ -n "$extra_pip_packages" ]; then
echo "With extra pip packages: $extra_pip_packages"
fi
if [ -n "$filter_pattern" ]; then
echo "With filter pattern: $filter_pattern"
fi
Expand Down Expand Up @@ -110,6 +133,7 @@ runs:
-e ISAAC_SIM_LOW_MEMORY=1 \
-e PYTHONUNBUFFERED=1 \
-e PYTHONIOENCODING=utf-8 \
-e GITHUB_ACTIONS=${GITHUB_ACTIONS:-} \
-e TEST_RESULT_FILE=$result_file"

if [ "$curobo_only" = "true" ]; then
Expand Down Expand Up @@ -151,6 +175,11 @@ runs:
echo "No filter pattern provided"
fi

if [ -n "$extra_pip_packages" ]; then
export TEST_EXTRA_PIP_PACKAGES="$extra_pip_packages"
docker_env_vars="$docker_env_vars -e TEST_EXTRA_PIP_PACKAGES"
fi

echo "Docker environment variables: '$docker_env_vars'"

# Volume mount for deps-cache-hit mode: bind-mount the checked-out
Expand Down Expand Up @@ -185,20 +214,38 @@ runs:
mkdir -p tests
rm _isaac_sim || true
ln -s /isaac-sim _isaac_sim
if [ -n \"\${TEST_EXTRA_PIP_PACKAGES:-}\" ]; then
echo \"Installing extra pip packages: \${TEST_EXTRA_PIP_PACKAGES}\"
./isaaclab.sh -p -m pip install \${TEST_EXTRA_PIP_PACKAGES}
fi
echo 'Starting pytest with path: $test_path'
./isaaclab.sh -p -m pytest --ignore=tools/conftest.py --ignore=source/isaaclab/test/install_ci $test_path $pytest_options -v --junitxml=tests/$result_file
"

# Stream container logs to CI output (this is the killable foreground process).
docker logs -f $container_name &
local logs_pid=$!
# Stream container logs in background.
docker logs -f "$container_name" &
logs_pid=$!

# Background `docker wait` + bash `wait` (interruptible by signals).
docker wait "$container_name" > "$docker_wait_file" &
wait_pid=$!
wait $wait_pid 2>/dev/null
local wait_status=$?
wait_pid=""

# Wait for the container to exit and capture its exit code.
DOCKER_EXIT=$(docker wait $container_name) || DOCKER_EXIT=1
# If interrupted by signal, trap already handled cleanup.
if [ $wait_status -gt 128 ]; then
kill $logs_pid 2>/dev/null || true
exit 130
fi

DOCKER_EXIT=$(cat "$docker_wait_file" 2>/dev/null) || DOCKER_EXIT=1
rm -f "$docker_wait_file"

# Stop following logs.
kill $logs_pid 2>/dev/null || true
wait $logs_pid 2>/dev/null || true
logs_pid=""

if [ $DOCKER_EXIT -eq 0 ]; then
echo "🟢 Docker container completed successfully"
Expand Down Expand Up @@ -249,7 +296,7 @@ runs:
fi
fi

# Copy comparison images (saved by test_rendering_correctness.py).
# Copy comparison images (saved by source/isaaclab_tasks/test/test_rendering_*.py).
local img_dir="$reports_dir/comparison-images"
if [ -n "$volume_mount_source" ] && [ -d "${volume_mount_source}/tests/comparison-images" ]; then
cp -r "${volume_mount_source}/tests/comparison-images" "$img_dir"
Expand All @@ -266,7 +313,15 @@ runs:
}

# Call the function with provided parameters
run_tests "${{ inputs.test-path }}" "${{ inputs.result-file }}" "${{ inputs.container-name }}" "${{ inputs.image-tag }}" "${{ inputs.reports-dir }}" "${{ inputs.pytest-options }}" "${{ inputs.filter-pattern }}" "${{ inputs.curobo-only }}" "${{ inputs.include-files }}" "${{ inputs.quarantined-only }}" "${{ inputs.shard-index }}" "${{ inputs.shard-count }}" "${{ inputs.volume-mount-source }}"
run_tests "${{ inputs.test-path }}" "${{ inputs.result-file }}" "${{ inputs.container-name }}" "${{ inputs.image-tag }}" "${{ inputs.reports-dir }}" "${{ inputs.pytest-options }}" "${{ inputs.filter-pattern }}" "${{ inputs.curobo-only }}" "${{ inputs.include-files }}" "${{ inputs.quarantined-only }}" "${{ inputs.shard-index }}" "${{ inputs.shard-count }}" "${{ inputs.volume-mount-source }}" "${{ inputs.extra-pip-packages }}"

- name: Kill container on cancellation
if: cancelled()
shell: bash
run: |
echo "::warning::Job cancelled - force-killing container"
docker kill "${{ inputs.container-name }}" 2>/dev/null || true
docker rm -f "${{ inputs.container-name }}" 2>/dev/null || true

- name: Write job summary
if: always()
Expand Down Expand Up @@ -295,7 +350,7 @@ runs:
retention-days: 7

- name: Clean up Docker container
if: always()
if: always() && !cancelled()
shell: bash
run: |
echo "🔵 Cleaning up Docker container..."
Expand Down
Loading