diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fe2b191d0..c73285bb5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -98,143 +98,6 @@ jobs: # fresh directory owned by the current process instead. PRE_COMMIT_HOME: /tmp/pre-commit-cache - uv_changes: - name: Detect uv-related changes - runs-on: [self-hosted, gpu-arena] - timeout-minutes: 5 - # Only meaningful on PRs; other events always run the uv tests. - if: github.event_name == 'pull_request' - outputs: - uv: ${{ steps.filter.outputs.uv }} - steps: - # Queries the PR's changed files via the GitHub API; no checkout needed. - - uses: dorny/paths-filter@v3 - id: filter - with: - filters: | - uv: - - 'pyproject.toml' - - 'uv.lock' - - 'submodules/IsaacLab' - - 'submodules/IsaacLab/**' - - uv_test: - name: Run tests (native uv, ${{ matrix.variant }}) - runs-on: [self-hosted, gpu-arena] - timeout-minutes: 120 - needs: [pre_commit, uv_changes] - # Runs nightly, on push to main, and on manual dispatch; on pull requests - # only when the PR touches the uv-managed dependency files - # (pyproject.toml, uv.lock, or the IsaacLab submodule). The !cancelled() - # guard keeps the job alive when uv_changes is skipped on non-PR events. - if: >- - !cancelled() && - needs.pre_commit.result == 'success' && - (github.event_name != 'pull_request' || - needs.uv_changes.outputs.uv == 'true') - strategy: - # Keep running the other variant when one fails. - fail-fast: false - # Test matrix: - # - wheel: uv-based installation that consumes isaaclab through its published wheel - # - source: uv-based installation that consumes isaaclab through source code. - matrix: - include: - - variant: wheel - uv_flags: "--no-default-groups --group isaaclab-from-wheel" - - variant: source - uv_flags: "" - env: - # NV_API_KEY is consumed by the live-endpoint tests for agentic env gen. - NV_API_KEY: ${{ secrets.ARENA_NV_API_KEY }} - # Accept the Isaac Sim EULA so the first launch is non-interactive. - OMNI_KIT_ACCEPT_EULA: "YES" - ACCEPT_EULA: "Y" - # Large CUDA wheels (e.g. nvidia-cublas-cu12) can exceed uv's 30s default. - UV_HTTP_TIMEOUT: "300" - - # Validates the native workflow in a clean ubuntu:24.04 container. - container: - image: nvidia/cuda:12.8.2-base-ubuntu24.04 - env: - # Needed to give the container access to the driver's graphics libraries. - NVIDIA_DRIVER_CAPABILITIES: all - - steps: - - name: nvidia-smi - run: nvidia-smi - - - *install_git_step - - *cleanup_step - - *mark_repo_safe_step - - *checkout_step - - *git_lfs_step - - - name: Install graphics loader and build tools - run: | - apt-get update - apt-get install -y --no-install-recommends \ - libegl1 libgl1 libglu1-mesa libglx0 libxi6 libxrandr2 libxt6 libsm6 libvulkan1 \ - cmake build-essential bash - - - name: Install uv - run: | - apt-get update - apt-get install -y --no-install-recommends curl ca-certificates - curl -LsSf https://astral.sh/uv/0.9.27/install.sh | sh - echo "$HOME/.local/bin" >> "$GITHUB_PATH" - - - name: Validate uv lock - run: | - uv python install 3.12 - uv lock --check --no-python-downloads - - # Out-of-source packaging check: validates the lockfile via the - # packaging tests, run in an out of source directory. - - name: Validate editable package - run: | - uv venv --python 3.12 /tmp/arena-package-venv - uv pip install --python /tmp/arena-package-venv/bin/python --no-deps --editable . - uv pip install --python /tmp/arena-package-venv/bin/python pytest - REPO_DIR="$PWD" - cd /tmp - /tmp/arena-package-venv/bin/python -m pytest -v "${REPO_DIR}/isaaclab_arena/tests/test_packaging.py" - - # In-source full environment: sync the locked deps and run the sim suite. - - name: Sync the locked environment - run: | - # Fix dubious ownership issues in cache - git config --global --add safe.directory '*' - uv sync ${{ matrix.uv_flags }} - - - name: Run in-process Newton tests - shell: bash - run: | - source .venv/bin/activate - pytest -sv --durations=0 -m with_newton \ - isaaclab_arena/tests/ - - - name: Run in-process PhysX tests without cameras - shell: bash - run: | - source .venv/bin/activate - pytest -sv --durations=0 -m "not with_cameras and not with_subprocess and not with_newton" \ - isaaclab_arena/tests/ - - - name: Run in-process PhysX tests with cameras - shell: bash - run: | - source .venv/bin/activate - pytest -sv --durations=0 -m "with_cameras and not with_subprocess" \ - isaaclab_arena/tests/ - - - name: Run subprocess-spawning PhysX tests - shell: bash - run: | - source .venv/bin/activate - ISAACLAB_ARENA_SUBPROCESS_TIMEOUT=900 \ - pytest -sv --durations=0 -m with_subprocess \ - isaaclab_arena/tests/ test: name: Run tests @@ -303,6 +166,11 @@ jobs: /isaac-sim/python.sh -m pytest -sv --durations=0 -m "not with_cameras and not with_subprocess and not with_newton" \ isaaclab_arena/tests/ + - name: Run in-process PhysX tests with cameras + run: | + /isaac-sim/python.sh -m pytest -sv --durations=0 -m "with_cameras and not with_subprocess and not with_newton" \ + isaaclab_arena/tests/ + - name: Run GR00T policy/data tests (lightweight gr00t deps only) run: | /isaac-sim/python.sh -m pytest -sv --durations=0 -m gr00t_policy \ @@ -464,6 +332,145 @@ jobs: make SPHINXOPTS=-W html + uv_changes: + name: Detect uv-related changes + runs-on: [self-hosted, gpu-arena] + timeout-minutes: 5 + # Only meaningful on PRs; other events always run the uv tests. + if: github.event_name == 'pull_request' + outputs: + uv: ${{ steps.filter.outputs.uv }} + steps: + # Queries the PR's changed files via the GitHub API; no checkout needed. + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + uv: + - 'pyproject.toml' + - 'uv.lock' + - 'submodules/IsaacLab' + - 'submodules/IsaacLab/**' + + uv_test: + name: Run tests (native uv, ${{ matrix.variant }}) + runs-on: [self-hosted, gpu-arena] + timeout-minutes: 120 + needs: [pre_commit, uv_changes] + # Runs nightly, on push to main, and on manual dispatch; on pull requests + # only when the PR touches the uv-managed dependency files + # (pyproject.toml, uv.lock, or the IsaacLab submodule). The !cancelled() + # guard keeps the job alive when uv_changes is skipped on non-PR events. + if: >- + !cancelled() && + needs.pre_commit.result == 'success' && + (github.event_name != 'pull_request' || + needs.uv_changes.outputs.uv == 'true') + strategy: + # Keep running the other variant when one fails. + fail-fast: false + # Test matrix: + # - wheel: uv-based installation that consumes isaaclab through its published wheel + # - source: uv-based installation that consumes isaaclab through source code. + matrix: + include: + - variant: wheel + uv_flags: "--no-default-groups --group isaaclab-from-wheel" + - variant: source + uv_flags: "" + env: + # NV_API_KEY is consumed by the live-endpoint tests for agentic env gen. + NV_API_KEY: ${{ secrets.ARENA_NV_API_KEY }} + # Accept the Isaac Sim EULA so the first launch is non-interactive. + OMNI_KIT_ACCEPT_EULA: "YES" + ACCEPT_EULA: "Y" + # Large CUDA wheels (e.g. nvidia-cublas-cu12) can exceed uv's 30s default. + UV_HTTP_TIMEOUT: "300" + + # Validates the native workflow in a clean ubuntu:24.04 container. + container: + image: nvidia/cuda:12.8.2-base-ubuntu24.04 + env: + # Needed to give the container access to the driver's graphics libraries. + NVIDIA_DRIVER_CAPABILITIES: all + + steps: + - name: nvidia-smi + run: nvidia-smi + + - *install_git_step + - *cleanup_step + - *mark_repo_safe_step + - *checkout_step + - *git_lfs_step + + - name: Install graphics loader and build tools + run: | + apt-get update + apt-get install -y --no-install-recommends \ + libegl1 libgl1 libglu1-mesa libglx0 libxi6 libxrandr2 libxt6 libsm6 libvulkan1 \ + cmake build-essential bash + + - name: Install uv + run: | + apt-get update + apt-get install -y --no-install-recommends curl ca-certificates + curl -LsSf https://astral.sh/uv/0.9.27/install.sh | sh + echo "$HOME/.local/bin" >> "$GITHUB_PATH" + + - name: Validate uv lock + run: | + uv python install 3.12 + uv lock --check --no-python-downloads + + # Out-of-source packaging check: validates the lockfile via the + # packaging tests, run in an out of source directory. + - name: Validate editable package + run: | + uv venv --python 3.12 /tmp/arena-package-venv + uv pip install --python /tmp/arena-package-venv/bin/python --no-deps --editable . + uv pip install --python /tmp/arena-package-venv/bin/python pytest + REPO_DIR="$PWD" + cd /tmp + /tmp/arena-package-venv/bin/python -m pytest -v "${REPO_DIR}/isaaclab_arena/tests/test_packaging.py" + + # In-source full environment: sync the locked deps and run the sim suite. + - name: Sync the locked environment + run: | + # Fix dubious ownership issues in cache + git config --global --add safe.directory '*' + uv sync ${{ matrix.uv_flags }} + + - name: Run in-process Newton tests + shell: bash + run: | + source .venv/bin/activate + pytest -sv --durations=0 -m with_newton \ + isaaclab_arena/tests/ + + - name: Run in-process PhysX tests without cameras + shell: bash + run: | + source .venv/bin/activate + pytest -sv --durations=0 -m "not with_cameras and not with_subprocess and not with_newton" \ + isaaclab_arena/tests/ + + - name: Run in-process PhysX tests with cameras + shell: bash + run: | + source .venv/bin/activate + pytest -sv --durations=0 -m "with_cameras and not with_subprocess" \ + isaaclab_arena/tests/ + + - name: Run subprocess-spawning PhysX tests + shell: bash + run: | + source .venv/bin/activate + ISAACLAB_ARENA_SUBPROCESS_TIMEOUT=900 \ + pytest -sv --durations=0 -m with_subprocess \ + isaaclab_arena/tests/ + + build_and_push_image_post_merge: name: Build & push NGC image (post-merge) runs-on: [self-hosted, gpu-arena]