From 89ac14b569f6840700e525dd57b9c7bdbe5056e8 Mon Sep 17 00:00:00 2001 From: Alexander Poddubny Date: Wed, 29 Oct 2025 10:00:35 -0700 Subject: [PATCH 1/3] Installing python 11 --- .github/workflows/build.yml | 137 +++++++++++++++++++++++++++++++++++- 1 file changed, 135 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8e648f109ea..6bc9ee3aae6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,7 @@ permissions: env: NGC_API_KEY: ${{ secrets.NGC_API_KEY }} ISAACSIM_BASE_IMAGE: ${{ vars.ISAACSIM_BASE_IMAGE || 'nvcr.io/nvidia/isaac-sim' }} - ISAACSIM_BASE_VERSION: ${{ vars.ISAACSIM_BASE_VERSION || '5.1.0' }} + ISAACSIM_BASE_VERSION: ${{ vars.ISAACSIM_BASE_VERSION || '5.0.0' }} DOCKER_IMAGE_TAG: isaac-lab-dev:${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || github.ref_name }}-${{ github.sha }} jobs: @@ -150,8 +150,133 @@ jobs: exit 1 fi + test-general-windows: + runs-on: [self-hosted, gpu-windows] + timeout-minutes: 180 + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + lfs: true + + - name: Setup Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Setup Isaac Sim and Isaac Lab Environment + shell: powershell + run: | + Write-Host "Setting up Isaac Sim and Isaac Lab environment for Windows..." + + # Check if virtual environment exists, create if not + if (-not (Test-Path "env_isaaclab")) { + Write-Host "Creating Python 3.11 virtual environment..." + python -m venv env_isaaclab + } else { + Write-Host "Virtual environment already exists" + } + + # Activate virtual environment + Write-Host "Activating virtual environment..." + & "env_isaaclab\Scripts\Activate.ps1" + + # Upgrade pip + Write-Host "Upgrading pip..." + python -m pip install --upgrade pip + + # Check if Isaac Sim is installed + $isaacsimInstalled = python -c "import isaacsim; print('installed')" 2>$null + if ($isaacsimInstalled -ne "installed") { + Write-Host "Installing Isaac Sim from NVIDIA PyPI..." + pip install "isaacsim[all,extscache]==5.1.0" --extra-index-url https://pypi.nvidia.com + } else { + Write-Host "Isaac Sim already installed" + } + + # Install/update PyTorch with CUDA support + Write-Host "Installing PyTorch with CUDA 12.8..." + pip install -U torch==2.7.0 torchvision==0.22.0 --index-url https://download.pytorch.org/whl/cu128 + + # Install Isaac Lab dependencies + Write-Host "Installing Isaac Lab..." + & ".\isaaclab.bat" -i + + # Verify pytest is available + Write-Host "Verifying pytest installation..." + python -m pip show pytest + + - name: Run General Tests on Windows + id: run-general-tests-windows + shell: powershell + continue-on-error: true + run: | + Write-Host "Running general tests on Windows..." + + # Activate virtual environment + & "env_isaaclab\Scripts\Activate.ps1" + + # Create reports directory + New-Item -ItemType Directory -Force -Path "reports" | Out-Null + + # Set environment variables for headless mode + $env:OMNI_KIT_ACCEPT_EULA = "yes" + $env:ACCEPT_EULA = "Y" + $env:ISAAC_SIM_HEADLESS = "1" + $env:ISAAC_SIM_LOW_MEMORY = "1" + $env:PYTHONUNBUFFERED = "1" + $env:PYTHONIOENCODING = "utf-8" + + # Run tests using isaaclab.bat with pytest + # Run pytest directly with filter to exclude isaaclab_tasks + & ".\isaaclab.bat" -p -m pytest tools ` + --ignore=tools/conftest.py ` + -k "not isaaclab_tasks" ` + -v ` + --junitxml=reports/general-tests-windows-report.xml + + $testExitCode = $LASTEXITCODE + Write-Host "Tests completed with exit code: $testExitCode" + + # Check if report was generated + if (Test-Path "reports/general-tests-windows-report.xml") { + Write-Host "Test report generated successfully" + } else { + Write-Host "Warning: Test report not found" + # Create a fallback report + $fallbackReport = 'Tests may have failed to generate results' + Set-Content -Path "reports/general-tests-windows-report.xml" -Value $fallbackReport + } + + - name: Upload Windows General Test Results + uses: actions/upload-artifact@v4 + if: always() + with: + name: general-test-results-windows + path: reports/general-tests-windows-report.xml + retention-days: 1 + compression-level: 9 + + - name: Check Test Results for Fork PRs + if: github.event.pull_request.head.repo.full_name != github.repository + shell: powershell + run: | + if (Test-Path "reports/general-tests-windows-report.xml") { + # Read the XML and check for failures + $xmlContent = Get-Content "reports/general-tests-windows-report.xml" -Raw + if ($xmlContent -match 'failures="[1-9]' -or $xmlContent -match 'errors="[1-9]') { + Write-Host "Tests failed for PR from fork. The test report is in the logs. Failing the job." + exit 1 + } + } else { + Write-Host "No test results file found. This might indicate test execution failed." + exit 1 + } + combine-results: - needs: [test-isaaclab-tasks, test-general] + needs: [test-isaaclab-tasks, test-general, test-general-windows] runs-on: [self-hosted, gpu] if: always() @@ -178,6 +303,14 @@ jobs: with: name: general-test-results path: reports/ + continue-on-error: true + + - name: Download Windows General Test Results + uses: actions/download-artifact@v4 + with: + name: general-test-results-windows + path: reports/ + continue-on-error: true - name: Combine All Test Results uses: ./.github/actions/combine-results From b60605487392255f22e302ebda5e755a276435e7 Mon Sep 17 00:00:00 2001 From: Alexander Poddubny Date: Mon, 10 Nov 2025 09:40:52 -0800 Subject: [PATCH 2/3] Adds verification of Isaac SIM 5.0.0 --- .github/workflows/build.yml | 137 +--------------------- .github/workflows/daily-compatibility.yml | 1 - 2 files changed, 2 insertions(+), 136 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6bc9ee3aae6..8e648f109ea 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,7 @@ permissions: env: NGC_API_KEY: ${{ secrets.NGC_API_KEY }} ISAACSIM_BASE_IMAGE: ${{ vars.ISAACSIM_BASE_IMAGE || 'nvcr.io/nvidia/isaac-sim' }} - ISAACSIM_BASE_VERSION: ${{ vars.ISAACSIM_BASE_VERSION || '5.0.0' }} + ISAACSIM_BASE_VERSION: ${{ vars.ISAACSIM_BASE_VERSION || '5.1.0' }} DOCKER_IMAGE_TAG: isaac-lab-dev:${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || github.ref_name }}-${{ github.sha }} jobs: @@ -150,133 +150,8 @@ jobs: exit 1 fi - test-general-windows: - runs-on: [self-hosted, gpu-windows] - timeout-minutes: 180 - - steps: - - name: Checkout Code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - lfs: true - - - name: Setup Python 3.11 - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: Setup Isaac Sim and Isaac Lab Environment - shell: powershell - run: | - Write-Host "Setting up Isaac Sim and Isaac Lab environment for Windows..." - - # Check if virtual environment exists, create if not - if (-not (Test-Path "env_isaaclab")) { - Write-Host "Creating Python 3.11 virtual environment..." - python -m venv env_isaaclab - } else { - Write-Host "Virtual environment already exists" - } - - # Activate virtual environment - Write-Host "Activating virtual environment..." - & "env_isaaclab\Scripts\Activate.ps1" - - # Upgrade pip - Write-Host "Upgrading pip..." - python -m pip install --upgrade pip - - # Check if Isaac Sim is installed - $isaacsimInstalled = python -c "import isaacsim; print('installed')" 2>$null - if ($isaacsimInstalled -ne "installed") { - Write-Host "Installing Isaac Sim from NVIDIA PyPI..." - pip install "isaacsim[all,extscache]==5.1.0" --extra-index-url https://pypi.nvidia.com - } else { - Write-Host "Isaac Sim already installed" - } - - # Install/update PyTorch with CUDA support - Write-Host "Installing PyTorch with CUDA 12.8..." - pip install -U torch==2.7.0 torchvision==0.22.0 --index-url https://download.pytorch.org/whl/cu128 - - # Install Isaac Lab dependencies - Write-Host "Installing Isaac Lab..." - & ".\isaaclab.bat" -i - - # Verify pytest is available - Write-Host "Verifying pytest installation..." - python -m pip show pytest - - - name: Run General Tests on Windows - id: run-general-tests-windows - shell: powershell - continue-on-error: true - run: | - Write-Host "Running general tests on Windows..." - - # Activate virtual environment - & "env_isaaclab\Scripts\Activate.ps1" - - # Create reports directory - New-Item -ItemType Directory -Force -Path "reports" | Out-Null - - # Set environment variables for headless mode - $env:OMNI_KIT_ACCEPT_EULA = "yes" - $env:ACCEPT_EULA = "Y" - $env:ISAAC_SIM_HEADLESS = "1" - $env:ISAAC_SIM_LOW_MEMORY = "1" - $env:PYTHONUNBUFFERED = "1" - $env:PYTHONIOENCODING = "utf-8" - - # Run tests using isaaclab.bat with pytest - # Run pytest directly with filter to exclude isaaclab_tasks - & ".\isaaclab.bat" -p -m pytest tools ` - --ignore=tools/conftest.py ` - -k "not isaaclab_tasks" ` - -v ` - --junitxml=reports/general-tests-windows-report.xml - - $testExitCode = $LASTEXITCODE - Write-Host "Tests completed with exit code: $testExitCode" - - # Check if report was generated - if (Test-Path "reports/general-tests-windows-report.xml") { - Write-Host "Test report generated successfully" - } else { - Write-Host "Warning: Test report not found" - # Create a fallback report - $fallbackReport = 'Tests may have failed to generate results' - Set-Content -Path "reports/general-tests-windows-report.xml" -Value $fallbackReport - } - - - name: Upload Windows General Test Results - uses: actions/upload-artifact@v4 - if: always() - with: - name: general-test-results-windows - path: reports/general-tests-windows-report.xml - retention-days: 1 - compression-level: 9 - - - name: Check Test Results for Fork PRs - if: github.event.pull_request.head.repo.full_name != github.repository - shell: powershell - run: | - if (Test-Path "reports/general-tests-windows-report.xml") { - # Read the XML and check for failures - $xmlContent = Get-Content "reports/general-tests-windows-report.xml" -Raw - if ($xmlContent -match 'failures="[1-9]' -or $xmlContent -match 'errors="[1-9]') { - Write-Host "Tests failed for PR from fork. The test report is in the logs. Failing the job." - exit 1 - } - } else { - Write-Host "No test results file found. This might indicate test execution failed." - exit 1 - } - combine-results: - needs: [test-isaaclab-tasks, test-general, test-general-windows] + needs: [test-isaaclab-tasks, test-general] runs-on: [self-hosted, gpu] if: always() @@ -303,14 +178,6 @@ jobs: with: name: general-test-results path: reports/ - continue-on-error: true - - - name: Download Windows General Test Results - uses: actions/download-artifact@v4 - with: - name: general-test-results-windows - path: reports/ - continue-on-error: true - name: Combine All Test Results uses: ./.github/actions/combine-results diff --git a/.github/workflows/daily-compatibility.yml b/.github/workflows/daily-compatibility.yml index 09679a9a51d..e97f26e9958 100644 --- a/.github/workflows/daily-compatibility.yml +++ b/.github/workflows/daily-compatibility.yml @@ -9,7 +9,6 @@ on: schedule: # Run daily at 8 PM PST (4 AM UTC) - cron: '0 4 * * *' - workflow_dispatch: inputs: isaacsim_version: From 0211f09dba495f567edb317562eb42f979092786 Mon Sep 17 00:00:00 2001 From: Alexander Poddubny Date: Wed, 26 Nov 2025 09:23:53 -0800 Subject: [PATCH 3/3] Adds ARM tests to run in parallel with the x86 GPU tests in pre-merge --- .github/actions/docker-build/action.yml | 5 +- .github/workflows/build.yml | 70 +++++++++++++- docker/Dockerfile.arm | 116 ++++++++++++++++++++++++ 3 files changed, 188 insertions(+), 3 deletions(-) create mode 100644 docker/Dockerfile.arm diff --git a/.github/actions/docker-build/action.yml b/.github/actions/docker-build/action.yml index 69a8db5ff0b..3eef44b4eb7 100644 --- a/.github/actions/docker-build/action.yml +++ b/.github/actions/docker-build/action.yml @@ -55,9 +55,10 @@ runs: echo "Building Docker image: $image_tag" echo "Using Dockerfile: $dockerfile_path" echo "Build context: $context_path" + echo "Building for native platform (auto-detected by buildx)" - # Build Docker image - docker buildx build --progress=plain --platform linux/amd64 \ + # Build Docker image for native platform + docker buildx build --progress=plain \ -t isaac-lab-dev \ -t $image_tag \ --build-arg ISAACSIM_BASE_IMAGE_ARG="$isaacsim_base_image" \ diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8e648f109ea..8a295d59903 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -150,8 +150,69 @@ jobs: exit 1 fi + test-general-arm: + runs-on: [self-hosted, arm] + timeout-minutes: 180 + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + lfs: true + + - name: Build Docker Image + uses: ./.github/actions/docker-build + with: + image-tag: ${{ env.DOCKER_IMAGE_TAG }} + isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} + isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} + dockerfile-path: docker/Dockerfile.arm + + - name: Run General Tests on ARM + id: run-general-tests-arm + uses: ./.github/actions/run-tests + with: + test-path: "tools" + result-file: "general-tests-arm-report.xml" + container-name: "isaac-lab-general-test-arm-$$" + image-tag: ${{ env.DOCKER_IMAGE_TAG }} + pytest-options: "" + filter-pattern: "not isaaclab_tasks" + + - name: Copy Test Results from General Tests ARM Container + run: | + CONTAINER_NAME="isaac-lab-general-test-arm-$$" + if docker ps -a | grep -q $CONTAINER_NAME; then + echo "Copying test results from General Tests ARM container..." + docker cp $CONTAINER_NAME:/workspace/isaaclab/tests/general-tests-arm-report.xml reports/ 2>/dev/null || echo "No test results to copy from General Tests ARM container" + fi + + - name: Upload General Test Results ARM + uses: actions/upload-artifact@v4 + if: always() + with: + name: general-test-arm-results + path: reports/general-tests-arm-report.xml + retention-days: 1 + compression-level: 9 + + - name: Check Test Results for Fork PRs + if: github.event.pull_request.head.repo.full_name != github.repository + run: | + if [ -f "reports/general-tests-arm-report.xml" ]; then + # Check if the test results contain any failures + if grep -q 'failures="[1-9]' reports/general-tests-arm-report.xml || grep -q 'errors="[1-9]' reports/general-tests-arm-report.xml; then + echo "Tests failed for PR from fork. The test report is in the logs. Failing the job." + exit 1 + fi + else + echo "No test results file found. This might indicate test execution failed." + exit 1 + fi + combine-results: - needs: [test-isaaclab-tasks, test-general] + needs: [test-isaaclab-tasks, test-general, test-general-arm] runs-on: [self-hosted, gpu] if: always() @@ -179,6 +240,13 @@ jobs: name: general-test-results path: reports/ + - name: Download General Test Results ARM + uses: actions/download-artifact@v4 + with: + name: general-test-arm-results + path: reports/ + continue-on-error: true + - name: Combine All Test Results uses: ./.github/actions/combine-results with: diff --git a/docker/Dockerfile.arm b/docker/Dockerfile.arm new file mode 100644 index 00000000000..50db1147fe8 --- /dev/null +++ b/docker/Dockerfile.arm @@ -0,0 +1,116 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# Nvidia Dockerfiles: https://github.com/NVIDIA-Omniverse/IsaacSim-dockerfiles +# Please check above link for license information. + +# Base image +ARG ISAACSIM_BASE_IMAGE_ARG +ARG ISAACSIM_VERSION_ARG +FROM ${ISAACSIM_BASE_IMAGE_ARG}:${ISAACSIM_VERSION_ARG} AS base +ENV ISAACSIM_VERSION=${ISAACSIM_VERSION_ARG} + +# Set default RUN shell to bash +SHELL ["/bin/bash", "-c"] + +# Adds labels to the Dockerfile +LABEL version="2.1.1" +LABEL description="Dockerfile for building and running the Isaac Lab framework inside Isaac Sim container image on ARM64." + +# Arguments +# Path to Isaac Sim root folder +ARG ISAACSIM_ROOT_PATH_ARG +ENV ISAACSIM_ROOT_PATH=${ISAACSIM_ROOT_PATH_ARG} +# Path to the Isaac Lab directory +ARG ISAACLAB_PATH_ARG +ENV ISAACLAB_PATH=${ISAACLAB_PATH_ARG} +# Home dir of docker user, typically '/root' +ARG DOCKER_USER_HOME_ARG +ENV DOCKER_USER_HOME=${DOCKER_USER_HOME_ARG} + +# Set environment variables +ENV LANG=C.UTF-8 +ENV DEBIAN_FRONTEND=noninteractive + +USER root + +# Install dependencies and remove cache +RUN --mount=type=cache,target=/var/cache/apt \ + apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + cmake \ + git \ + libglib2.0-0 \ + ncurses-term \ + wget && \ + apt -y autoremove && apt clean autoclean && \ + rm -rf /var/lib/apt/lists/* + +# Note: Skipping CUDA toolkit installation for ARM64 as it's typically not available/needed +# ARM runners generally don't have NVIDIA GPUs + +# Copy the Isaac Lab directory (files to exclude are defined in .dockerignore) +COPY ../ ${ISAACLAB_PATH} + +# Ensure isaaclab.sh has execute permissions +RUN chmod +x ${ISAACLAB_PATH}/isaaclab.sh + +# Set up a symbolic link between the installed Isaac Sim root folder and _isaac_sim in the Isaac Lab directory +RUN ln -sf ${ISAACSIM_ROOT_PATH} ${ISAACLAB_PATH}/_isaac_sim + +# Install toml dependency +RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install toml + +# Install apt dependencies for extensions that declare them in their extension.toml +RUN --mount=type=cache,target=/var/cache/apt \ + ${ISAACLAB_PATH}/isaaclab.sh -p ${ISAACLAB_PATH}/tools/install_deps.py apt ${ISAACLAB_PATH}/source && \ + apt -y autoremove && apt clean autoclean && \ + rm -rf /var/lib/apt/lists/* + +# for singularity usage, have to create the directories that will binded +RUN mkdir -p ${ISAACSIM_ROOT_PATH}/kit/cache && \ + mkdir -p ${DOCKER_USER_HOME}/.cache/ov && \ + mkdir -p ${DOCKER_USER_HOME}/.cache/pip && \ + mkdir -p ${DOCKER_USER_HOME}/.cache/nvidia/GLCache && \ + mkdir -p ${DOCKER_USER_HOME}/.nv/ComputeCache && \ + mkdir -p ${DOCKER_USER_HOME}/.nvidia-omniverse/logs && \ + mkdir -p ${DOCKER_USER_HOME}/.local/share/ov/data && \ + mkdir -p ${DOCKER_USER_HOME}/Documents + +# for singularity usage, create NVIDIA binary placeholders +RUN touch /bin/nvidia-smi && \ + touch /bin/nvidia-debugdump && \ + touch /bin/nvidia-persistenced && \ + touch /bin/nvidia-cuda-mps-control && \ + touch /bin/nvidia-cuda-mps-server && \ + touch /etc/localtime && \ + mkdir -p /var/run/nvidia-persistenced && \ + touch /var/run/nvidia-persistenced/socket + +# installing Isaac Lab dependencies +# use pip caching to avoid reinstalling large packages +RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ + ${ISAACLAB_PATH}/isaaclab.sh --install + +# Note: Skipping cuRobo installation on ARM as it requires CUDA + +# HACK: Remove install of quadprog dependency +RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip uninstall -y quadprog + +# aliasing isaaclab.sh and python for convenience +RUN echo "export ISAACLAB_PATH=${ISAACLAB_PATH}" >> ${HOME}/.bashrc && \ + echo "alias isaaclab=${ISAACLAB_PATH}/isaaclab.sh" >> ${HOME}/.bashrc && \ + echo "alias python=${ISAACLAB_PATH}/_isaac_sim/python.sh" >> ${HOME}/.bashrc && \ + echo "alias python3=${ISAACLAB_PATH}/_isaac_sim/python.sh" >> ${HOME}/.bashrc && \ + echo "alias pip='${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip'" >> ${HOME}/.bashrc && \ + echo "alias pip3='${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip'" >> ${HOME}/.bashrc && \ + echo "alias tensorboard='${ISAACLAB_PATH}/_isaac_sim/python.sh ${ISAACLAB_PATH}/_isaac_sim/tensorboard'" >> ${HOME}/.bashrc && \ + echo "export TZ=$(date +%Z)" >> ${HOME}/.bashrc && \ + echo "shopt -s histappend" >> /root/.bashrc && \ + echo "PROMPT_COMMAND='history -a'" >> /root/.bashrc + +# make working directory as the Isaac Lab directory +# this is the default directory when the container is run +WORKDIR ${ISAACLAB_PATH}