Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
34 changes: 31 additions & 3 deletions .github/workflows/install-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -132,24 +132,52 @@ jobs:
fi

install-tests:
name: Installation Tests
name: Installation Tests (uv)
needs: [changes]
if: needs.changes.outputs.run_install_tests == 'true'
runs-on: [self-hosted, gpu]
timeout-minutes: 90
steps:
- name: Checkout
uses: actions/checkout@v6 # v6
- name: Run installation tests
- name: Run installation tests (uv)
env:
BASE_IMAGE: ${{ github.event_name == 'workflow_dispatch' && inputs.base_image || 'ubuntu:24.04' }}
TEST_FILTER: ${{ github.event_name == 'workflow_dispatch' && inputs.test_filter || '' }}
run: |
RUNNER_ARGS="--base-image $BASE_IMAGE"
RUNNER_ARGS="$RUNNER_ARGS --results-dir ${{ github.workspace }}/results"
RUNNER_ARGS="$RUNNER_ARGS --gpu"
RUNNER_ARGS="$RUNNER_ARGS --no-cache"

PYTEST_EXTRA_ARGS=(-sv)
PYTEST_EXTRA_ARGS=(-sv -m uv)
if [ -n "$TEST_FILTER" ]; then
PYTEST_EXTRA_ARGS+=(-k "$TEST_FILTER")
fi

tools/run_install_ci.py docker $RUNNER_ARGS -- --tb=short "${PYTEST_EXTRA_ARGS[@]}"

install-tests-conda:
name: Installation Tests (conda)
needs: [changes]
if: needs.changes.outputs.run_install_tests == 'true'
runs-on: [self-hosted, gpu]
timeout-minutes: 150
steps:
- name: Checkout
uses: actions/checkout@v6 # v6
- name: Run installation tests (conda)
env:
BASE_IMAGE: ${{ github.event_name == 'workflow_dispatch' && inputs.base_image || 'ubuntu:24.04' }}
TEST_FILTER: ${{ github.event_name == 'workflow_dispatch' && inputs.test_filter || '' }}
run: |
RUNNER_ARGS="--base-image $BASE_IMAGE"
RUNNER_ARGS="$RUNNER_ARGS --results-dir ${{ github.workspace }}/results-conda"
RUNNER_ARGS="$RUNNER_ARGS --gpu"
RUNNER_ARGS="$RUNNER_ARGS --conda"
RUNNER_ARGS="$RUNNER_ARGS --no-cache"

PYTEST_EXTRA_ARGS=(-sv -m conda)
if [ -n "$TEST_FILTER" ]; then
PYTEST_EXTRA_ARGS+=(-k "$TEST_FILTER")
fi
Expand Down
29 changes: 24 additions & 5 deletions docker/test/test_dockerfile_nonroot.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,31 @@

import pytest

DOCKER_DIR = Path(__file__).resolve().parent.parent
DOCKERFILES = sorted(DOCKER_DIR.glob("Dockerfile.*"))
REPO_ROOT = Path(__file__).resolve().parents[2]
DOCKER_DIR = REPO_ROOT / "docker"

# Collect every Dockerfile.* from the entire repository tree.
DOCKERFILES = sorted(REPO_ROOT.glob("**/Dockerfile.*"))

ROOT_USERS = {"root", "0"}

# Keep every Dockerfile in this map so new containers must make an explicit
# runtime-user decision instead of silently escaping this regression test.
# Keys are Dockerfile *names* (unique across the repo); values are the
# expected final USER directive (None = not yet migrated, test skipped).
DOCKERFILE_RUNTIME_USERS = {
"Dockerfile.base": "isaaclab",
"Dockerfile.curobo": "isaaclab",
"Dockerfile.installci": None,
"Dockerfile.installci": "isaaclab",
"Dockerfile.installci-conda": "isaaclab",
"Dockerfile.ros2": "isaaclab",
}
DOCKERFILES_CREATING_RUNTIME_USER = {"Dockerfile.base", "Dockerfile.curobo"}

# Dockerfiles that are expected to *create* the non-root runtime user
# (i.e. contain groupadd/useradd/USER isaaclab). Inherited-user images
# (like Dockerfile.installci-conda which builds on top of Dockerfile.installci)
# are excluded here.
DOCKERFILES_CREATING_RUNTIME_USER = {"Dockerfile.base", "Dockerfile.curobo", "Dockerfile.installci"}

USER_DIRECTIVE_RE = re.compile(r"^USER\s+(\S+)\s*$")

Expand All @@ -42,6 +54,13 @@ def _final_user(dockerfile_path: Path) -> str | None:
return users[-1] if users else None


def _find_dockerfile(name: str) -> Path:
"""Return the path of the unique Dockerfile with the given name."""
matches = [p for p in DOCKERFILES if p.name == name]
assert len(matches) == 1, f"Expected exactly one {name}, found: {matches}"
return matches[0]


def test_all_dockerfiles_have_runtime_user_expectations():
expected_dockerfiles = set(DOCKERFILE_RUNTIME_USERS)
actual_dockerfiles = {dockerfile.name for dockerfile in DOCKERFILES}
Expand All @@ -63,7 +82,7 @@ def test_non_root_runtime_dockerfiles(dockerfile: Path):

@pytest.mark.parametrize("dockerfile_name", sorted(DOCKERFILES_CREATING_RUNTIME_USER))
def test_dockerfile_creates_non_root_runtime_user(dockerfile_name: str):
dockerfile_text = (DOCKER_DIR / dockerfile_name).read_text(encoding="utf-8")
dockerfile_text = _find_dockerfile(dockerfile_name).read_text(encoding="utf-8")

assert re.search(r"\bgroupadd\b.*--gid\s+1000\b.*\bisaaclab\b", dockerfile_text, re.DOTALL)
assert re.search(r"\buseradd\b.*--uid\s+1000\b.*--gid\s+1000\b.*\bisaaclab\b", dockerfile_text, re.DOTALL)
Expand Down
97 changes: 74 additions & 23 deletions docs/source/setup/installation/include/src_build_isaaclab.rst
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ Installation

sudo apt install python3.12-dev libgl1-mesa-dev libx11-dev libxcursor-dev libxi-dev libxinerama-dev libxrandr-dev

- Run the install command that iterates over all the extensions in ``source`` directory and installs them
using pip (with ``--editable`` flag):
- Run the install command, which installs all core Isaac Lab packages and, by default,
the standard optional submodules and auto-selected extras:

.. tab-set::
:sync-group: os
Expand All @@ -37,33 +37,55 @@ Installation
isaaclab.bat --install :: or "isaaclab.bat -i"


By default, the above will install **all** Isaac Lab submodules (under ``source/isaaclab``).
To install only specific Isaac Lab submodules, pass a comma-separated list of submodule names. The available
Isaac Lab submodules are: ``assets``, ``contrib``, ``mimic``, ``newton``, ``ov``, ``physx``, ``rl``, ``tasks``,
``teleop``, ``visualizers``. Available RL frameworks are: ``rl_games``, ``rsl_rl``, ``sb3``, ``skrl``, ``robomimic``.
All core submodules are **always** installed regardless of what is passed to ``-i``.
The argument controls which optional submodules and extra feature dependencies to add on top.
The contrib and OV source packages (``isaaclab_contrib``, ``isaaclab_ov``, and
``isaaclab_ovphysx``) are part of the core set so core modules and task configs can
import their config and preset classes without installing their heavy runtime dependencies.

For example, to install a small subset of submodules:
**Optional submodules**:

.. tab-set::
:sync-group: os
.. list-table::
:header-rows: 1

.. tab-item:: :icon:`fa-brands fa-linux` Linux
:sync: linux
* - Token
- What it installs
* - ``mimic``
- ``isaaclab_mimic`` (ipywidgets, h5py, imitation-learning tools)
* - ``teleop``
- ``isaaclab_teleop`` (isaacteleop SDK, dex-retargeting — Linux x86 only)

.. code:: bash
**Optional extra feature sets** (heavy optional deps on top of core packages):

./isaaclab.sh --install physx,newton,assets,rl[rsl_rl],tasks,ov # or "./isaaclab.sh -i physx,newton,assets,rl[rsl_rl],tasks,ov"
.. list-table::
:header-rows: 1

.. tab-item:: :icon:`fa-brands fa-windows` Windows
:sync: windows
* - Token
- What it installs
* - ``contrib[<feature>]``
- Contrib runtime extras. Selector: ``rlinf``.
* - ``newton``
- Newton physics library (``newton[sim]`` git dep) across ``isaaclab_newton``, ``isaaclab_physx``, ``isaaclab_visualizers``
* - ``ov[<runtime>]``
- OV runtime wheels. Selectors: ``ovrtx``, ``ovphysx``. Use ``ov[all]`` for both.
* - ``rl[<framework>]``
- RL framework extras on ``isaaclab_rl``. Selectors: ``rsl-rl``, ``skrl``, ``sb3``, ``rl-games``. Omit selector for all.
* - ``visualizer[<backend>]``
- Visualizer backend extras. Selectors: ``rerun``, ``viser``, ``newton``, ``kit``. Omit selector for all.

.. code:: batch
**Special values**:

- ``all`` — core + optional submodules (mimic, teleop) + auto extra features (newton, rl, visualizer) — default when ``-i`` is used with no argument
- ``none`` — core submodules only; no optional submodules, no extra feature dependencies

isaaclab.bat --install physx,newton,assets,rl[rsl_rl],tasks,ov :: or "isaaclab.bat -i physx,newton,assets,rl[rsl_rl],tasks,ov"
.. note::

To install specific visualizer, pass a comma-separated list of supported visualizers,
or ``all`` to install all available options: ``newton``, ``rerun``, ``viser``, ``kit``. Note when following the
default installation, all visualizers are installed.
``all`` installs the contrib and OV source packages, but not their heavy
dependency extras. Use ``contrib[rlinf]`` for rlinf
dependencies and ``ov[ovrtx]``, ``ov[ovphysx]``, or ``ov[all]`` for OV runtime
wheels.

Examples:

.. tab-set::
:sync-group: os
Expand All @@ -73,14 +95,43 @@ Installation

.. code:: bash

./isaaclab.sh --install visualizers[rerun] # or "./isaaclab.sh -i visualizers[rerun]"
# Default: core + optional submodules + auto extras
./isaaclab.sh -i

# Newton physics + RSL-RL framework
./isaaclab.sh -i 'newton,rl[rsl-rl]'

# Newton + rerun visualizer + mimic
./isaaclab.sh -i 'newton,visualizer[rerun],mimic'

# OV source packages + OVRTX wheel
./isaaclab.sh -i 'ov[ovrtx]'

# Contrib rlinf dependencies
./isaaclab.sh -i 'contrib[rlinf]'

# Core only — no optional submodules, no extras
./isaaclab.sh -i none

.. tab-item:: :icon:`fa-brands fa-windows` Windows
:sync: windows

.. code:: batch

isaaclab.bat --install visualizers[rerun] :: or "isaaclab.bat -i visualizers[rerun]"
:: Default: core + optional submodules + auto extras
isaaclab.bat -i

:: Newton physics + RSL-RL framework
isaaclab.bat -i "newton,rl[rsl-rl]"

:: Newton + rerun visualizer + mimic
isaaclab.bat -i "newton,visualizer[rerun],mimic"

:: OV source packages + OVRTX wheel
isaaclab.bat -i "ov[ovrtx]"

:: Contrib rlinf dependencies
isaaclab.bat -i "contrib[rlinf]"

Pass ``none`` to install only the core ``isaaclab`` package without any Isaac Lab submodules or RL frameworks.
:: Core only - no optional submodules, no extras
isaaclab.bat -i none
81 changes: 46 additions & 35 deletions docs/source/setup/installation/kitless_installation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -80,40 +80,45 @@ To install Isaac Sim, use the pip method described in :doc:`pip_installation`.
Selective Install
-----------------

If you want a minimal environment, ``./isaaclab.sh -i`` accepts comma-separated
sub-package names:
``./isaaclab.sh -i`` always installs the full core package set (assets, tasks, physx, rl,
visualizers, …). The argument controls which **optional** submodules and extra feature
dependencies are added on top.

**Optional submodules** (heavy — must be explicitly requested):

.. list-table::
:header-rows: 1

* - Option
- What it does
* - ``isaacsim``
- Install Isaac Sim pip package
* - Token
- What it installs
* - ``mimic``
- ``isaaclab_mimic`` — imitation-learning tools (ipywidgets, h5py)
* - ``teleop``
- ``isaaclab_teleop`` — teleoperation SDK (Linux x86 only)

**Optional extra feature sets** (heavy deps on top of always-installed core):

.. list-table::
:header-rows: 1

* - Token
- What it installs
* - ``newton``
- Install Newton physics + Newton visualizer
* - ``physx``
- Install PhysX physics runtime
- Newton physics library (``newton[sim]``) + newton extras across ``isaaclab_newton``, ``isaaclab_physx``, ``isaaclab_visualizers``
* - ``rl[<framework>]``
- RL framework. Selectors: ``rsl-rl``, ``skrl``, ``sb3``, ``rl-games``. Omit selector for all.
* - ``visualizer[<backend>]``
- Visualizer backend. Selectors: ``rerun``, ``viser``, ``newton``, ``kit``. Omit selector for all.
* - ``contrib[rlinf]``
- rlinf extras (ray, diffusers, etc.)
* - ``ov``
- Install Omniverse renderer runtime
* - ``tasks``
- Install built-in task environments
* - ``assets``
- Install robot/object configurations
* - ``visualizers``
- Install all visualizer backends
* - ``rsl_rl``
- Install RSL-RL framework
* - ``skrl``
- Install skrl framework
* - ``sb3``
- Install Stable Baselines3 framework
* - ``rl_games``
- Install rl_games framework
* - ``robomimic``
- Install robomimic framework
- OVRTX + OVPhysX extras for Omniverse rendering
* - ``isaacsim``
- Isaac Sim pip package
* - ``all``
- Core + optional submodules (mimic, teleop) + auto extras (newton, rl, visualizer, ov). Default. Does not include ``contrib``.
* - ``none``
- Install only core ``isaaclab`` package
- Core packages only — no optional submodules, no extra feature deps

Examples:

Expand All @@ -125,22 +130,28 @@ Examples:

.. code-block:: bash

# Minimal Newton setup
./isaaclab.sh -i newton,tasks,assets,ov,rl[rsl_rl]
# Core only (physx, tasks, assets always included — no optional extras)
./isaaclab.sh -i none

# Newton with OVRTX, RSL-RL, and Newton visualizer
./isaaclab.sh -i newton,tasks,assets,ov[ovrtx],rl[rsl_rl],visualizers[newton]
# Newton physics + RSL-RL (most common kitless setup)
./isaaclab.sh -i newton,'rl[rsl-rl]'

# Newton + OVRTX renderer + RSL-RL + Newton visualizer
./isaaclab.sh -i newton,ov,'rl[rsl-rl]','visualizer[newton]'

.. tab-item:: :icon:`fa-brands fa-windows` Windows
:sync: windows

.. code-block:: batch

:: Minimal Newton setup
isaaclab.bat -i newton,tasks,assets,ov,rl[rsl_rl]
:: Core only
isaaclab.bat -i none

:: Newton physics + RSL-RL
isaaclab.bat -i newton,rl[rsl-rl]

:: Newton with OVRTX, RSL-RL, and Newton visualizer
isaaclab.bat -i newton,tasks,assets,ov[ovrtx],rl[rsl_rl],visualizers[newton]
:: Newton + OVRTX + RSL-RL + Newton visualizer
isaaclab.bat -i newton,ov,rl[rsl-rl],visualizer[newton]


.. _installation-ovrtx:
Expand Down
Loading
Loading