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
1 change: 1 addition & 0 deletions .github/actions/_lib/compute-deps-hash/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ runs:
isaaclab.sh
environment.yml
source/isaaclab/isaaclab/cli
tools/wheel_builder/uv-overrides.txt
# Pins the CI pytest deps layered onto the image after build, so a
# change to that list must invalidate the deps cache.
.github/actions/docker-build/action.yml
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/kitless-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ jobs:
^source/isaaclab/isaaclab/test/fixtures/ :: Isolated asset fixture implementation
^source/isaaclab_(physx|newton|ov)/isaaclab_.*/test/fixtures/ :: Backend fixture implementation
^source/isaaclab/test/benchmark/test_asset_suite_runtime_semantics\.py$ :: Kit-less pytest subset
^tools/wheel_builder/uv-overrides\.txt$ :: Importer dependency overrides
^\.github/workflows/kitless-docker\.yml$ :: This workflow file
^\.github/actions/detect-changes/ :: Change-detection action
^\.github/actions/_lib/compute-deps-hash/ :: Dependency-cache identity
Expand Down
6 changes: 1 addition & 5 deletions .github/workflows/license-check.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,8 @@ jobs:
ACCEPT_EULA: Y
ISAACSIM_ACCEPT_EULA: YES
run: |
# ``all`` covers every backend (Isaac Sim included), RL library, and visualizer.
# ``rlinf`` and ``mimic`` are outside ``all``, so name them to keep them scanned.
# No extras conflict, so this is a single resolution -- Isaac Sim no longer needs
# an imperative install after the sync.
bash "$GITHUB_WORKSPACE/.github/actions/_lib/with-python-package-retries.sh" \
uv sync --extra all --extra test --extra rlinf --extra mimic
uv sync --extra all --extra isaacsim --extra test --extra rlinf --extra mimic
# ``[tool.uv.pip] prerelease = "allow"`` lets unpinned tools float onto
# prereleases. pip-licenses 6.0.0a1 reports an empty License where 5.x reports
# ``UNKNOWN``, which license-exceptions.json keys on, and joins multi-license
Expand Down
10 changes: 8 additions & 2 deletions .github/workflows/wheel.yml
Original file line number Diff line number Diff line change
Expand Up @@ -194,10 +194,16 @@ jobs:
exit 1
fi

bash "$GITHUB_WORKSPACE/.github/actions/_lib/with-python-package-retries.sh" uv pip install --dry-run "${wheel}[all]"

bash "$GITHUB_WORKSPACE/.github/actions/_lib/with-python-package-retries.sh" uv pip install \
--dry-run \
--overrides "$overrides" \
"${wheel}[importers]"

bash "$GITHUB_WORKSPACE/.github/actions/_lib/with-python-package-retries.sh" uv pip install \
--dry-run \
--overrides "$overrides" \
--extra-index-url https://pypi.nvidia.com \
--index-strategy unsafe-best-match \
--prerelease=allow \
"${wheel}[all]"
"${wheel}[isaacsim]"
1 change: 1 addition & 0 deletions CONTRIBUTORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ Guidelines for modifications:
* Mayank Mittal
* Mike Yan Michelis
* Mikhail Yurasov
* Mustafa Haiderbhai
* Nikita Rudin
* Octi (Zhengyu) Zhang
* Ossama Ahmed
Expand Down
11 changes: 9 additions & 2 deletions docker/Dockerfile.kitless
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,24 @@ WORKDIR ${ISAACLAB_PATH}
COPY pyproject.toml uv.lock VERSION LICENSE LICENSE-mimic README.md ./
COPY source/ source/
COPY isaaclab.sh ./
COPY tools/wheel_builder/uv-overrides.txt tools/wheel_builder/uv-overrides.txt

# Same entry point as Dockerfile.base. The selectors are explicit because a bare
# --install excludes `ov` and `visualizer`; both take `[all]` here. The standalone
# importers are core dependencies. The venv pins python3.12 to match the runtime
# stage's libpython3.12, and isaaclab.sh resolves VIRTUAL_ENV first.
# importers are explicit wheel extras, so install them with the resolver overrides
# that preserve Isaac Lab's dependency versions. The venv pins python3.12 to match
# the runtime stage's libpython3.12, and isaaclab.sh resolves VIRTUAL_ENV first.
RUN uv venv --python /usr/bin/python3.12 --seed --no-managed-python "${VIRTUAL_ENV}" \
&& chmod +x "${ISAACLAB_PATH}/isaaclab.sh" \
&& "${ISAACLAB_PATH}/isaaclab.sh" --install newton,rl[all],ov[all],visualizer[all] \
&& uv pip install \
--overrides "${ISAACLAB_PATH}/tools/wheel_builder/uv-overrides.txt" \
"isaacsim-asset-isolated>=6.0,<6.1" \
"tinyobjloader==2.0.0rc13" \
&& python -c "import importlib.metadata as m; \
names = {d.metadata['Name'].lower() for d in m.distributions()}; \
assert 'isaacsim' not in names; \
assert 'isaacsim-asset-isolated' in names; \
assert 'ovphysx' in names; \
assert 'ovrtx' in names; \
assert 'viser' in names; \
Expand Down
9 changes: 8 additions & 1 deletion docker/test/test_dockerfile_nonroot.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from pathlib import Path

import pytest
import tomllib

REPO_ROOT = Path(__file__).resolve().parents[2]
DOCKER_DIR = REPO_ROOT / "docker"
Expand Down Expand Up @@ -110,17 +111,23 @@ def test_ros2_dockerfile_restores_non_root_runtime_user():


def test_kitless_dockerfile_installs_newton_rl_ov_and_visualizers_without_isaac_sim():
"""The kit-less image installs Newton, both OV runtimes, every Newton viewer, and the RL frameworks."""
"""The kit-less image installs its runtime features and importers without the full Isaac Sim runtime."""
dockerfile_text = (DOCKER_DIR / "Dockerfile.kitless").read_text(encoding="utf-8")
with (REPO_ROOT / "pyproject.toml").open("rb") as file:
importer_requirements = tomllib.load(file)["project"]["optional-dependencies"]["importers"]

assert (
"FROM ghcr.io/astral-sh/uv:0.9.25@sha256:13e233d08517abdafac4ead26c16d881cd77504a2c40c38c905cf3a0d70131a6 AS uv"
in dockerfile_text
)
# Installed through the same entry point as Dockerfile.base/Dockerfile.curobo.
assert '"${ISAACLAB_PATH}/isaaclab.sh" --install newton,rl[all],ov[all],visualizer[all]' in dockerfile_text
assert "COPY tools/wheel_builder/uv-overrides.txt tools/wheel_builder/uv-overrides.txt" in dockerfile_text
assert '--overrides "${ISAACLAB_PATH}/tools/wheel_builder/uv-overrides.txt"' in dockerfile_text
assert all(f'"{requirement}"' in dockerfile_text for requirement in importer_requirements)
assert "COPY isaaclab.sh ./" in dockerfile_text
assert "'isaacsim' not in names" in dockerfile_text
assert "'isaacsim-asset-isolated' in names" in dockerfile_text
assert "'ovphysx' in names" in dockerfile_text
assert "'ovrtx' in names" in dockerfile_text
assert "'viser' in names" in dockerfile_text
Expand Down
30 changes: 25 additions & 5 deletions docs/_extensions/isaaclab_docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,8 +203,8 @@ def run(self) -> list[nodes.Node]:
return _parse_rst(self, content)


class IsaacLabUvWheelInstall(SphinxDirective):
"""Render the uv wheel installation command for the current documentation version."""
class IsaacLabUvIsaacSimWheelInstall(SphinxDirective):
"""Render the Isaac Lab wheel command for the current Isaac Sim version."""

has_content = False

Expand All @@ -216,10 +216,29 @@ def run(self) -> list[nodes.Node]:
content = f"""\
.. code-block:: bash

uv pip install "isaaclab[all]" \\
uv pip install "isaaclab[isaacsim]" \\
--overrides "{overrides_url}" \\
--extra-index-url https://pypi.nvidia.com \\
--index-strategy unsafe-best-match --prerelease=allow
--index-strategy unsafe-best-match
"""
return _parse_rst(self, content)


class IsaacLabUvImportersWheelInstall(SphinxDirective):
"""Render the Isaac Lab standalone importer command with resolver overrides."""

has_content = False

def run(self) -> list[nodes.Node]:
branch = _source_branch(self.config)
overrides_url = (
f"https://raw.githubusercontent.com/isaac-sim/IsaacLab/{branch}/tools/wheel_builder/uv-overrides.txt"
)
content = f"""\
.. code-block:: bash

uv pip install "isaaclab[importers]" \\
--overrides "{overrides_url}"
"""
return _parse_rst(self, content)

Expand Down Expand Up @@ -323,7 +342,8 @@ def setup(app):
app.add_directive("isaaclab-kitless-install-snippet", IsaacLabKitlessInstallSnippet)
app.add_directive("isaaclab-quickstart-install", IsaacLabQuickstartInstall)
app.add_directive("isaaclab-isaacsim-install", IsaacLabIsaacSimInstall)
app.add_directive("isaaclab-uv-wheel-install", IsaacLabUvWheelInstall)
app.add_directive("isaaclab-uv-isaacsim-wheel-install", IsaacLabUvIsaacSimWheelInstall)
app.add_directive("isaaclab-uv-importers-wheel-install", IsaacLabUvImportersWheelInstall)
app.add_directive("isaaclab-torch-install", IsaacLabTorchInstall)
app.add_directive("isaaclab-ovrtx-install", IsaacLabOvrtxInstall)
return {
Expand Down
56 changes: 50 additions & 6 deletions docs/source/_static/css/environment-browser.css
Original file line number Diff line number Diff line change
Expand Up @@ -53,15 +53,17 @@ html[data-theme="dark"] .environment-browser {
white-space: nowrap;
}

.environment-mode-switch {
.environment-mode-switch,
.environment-scope-switch {
display: inline-flex;
flex: 0 0 auto;
overflow: hidden;
border: 1px solid var(--environment-border);
border-radius: 6px;
}

.environment-mode-switch button {
.environment-mode-switch button,
.environment-scope-switch button {
min-height: 2.35rem;
padding: 0.35rem 0.7rem;
border: 0;
Expand All @@ -72,15 +74,24 @@ html[data-theme="dark"] .environment-browser {
font-weight: 600;
}

.environment-mode-switch button:last-child {
.environment-mode-switch button:last-child,
.environment-scope-switch button:last-child {
border-right: 0;
}

.environment-mode-switch button.is-active {
.environment-mode-switch button.is-active,
.environment-scope-switch button.is-active {
color: #1f3300;
background: #76b900;
}

.environment-mode-switch button:disabled,
.environment-scope-switch button:disabled {
color: var(--environment-muted);
cursor: not-allowed;
opacity: 0.65;
}

.environment-inline-field,
.environment-selector,
.environment-checkpoint-toggle {
Expand All @@ -102,6 +113,14 @@ html[data-theme="dark"] .environment-browser {
flex: 1 1 20rem;
}

.environment-task-field > span {
min-width: 4.75rem;
}

.environment-scope-switch {
margin-left: auto;
}

.environment-inline-field select,
.environment-selector select,
.environment-task-filter select,
Expand Down Expand Up @@ -167,8 +186,7 @@ html[data-theme="dark"] .environment-browser {

.environment-checkpoint-toggle {
justify-content: center;
justify-self: start;
width: calc(100% - 0.35rem);
width: 100%;
min-height: 2.4rem;
padding: 0.35rem 0.6rem;
border: 1px solid var(--environment-border);
Expand All @@ -187,6 +205,32 @@ html[data-theme="dark"] .environment-browser {
accent-color: var(--pst-color-primary);
}

.environment-checkpoint-toggle:has(input:disabled) {
color: var(--environment-muted);
background: color-mix(in srgb, var(--pst-color-background) 55%, transparent);
cursor: not-allowed;
opacity: 0.65;
}

.environment-non-rl-note {
display: flex;
align-items: baseline;
gap: 0.5rem;
margin: 1rem 0 0;
padding: 0.65rem 0.8rem;
border-left: 3px solid var(--pst-color-info);
color: var(--pst-color-text-base);
background: color-mix(in srgb, var(--pst-color-info) 8%, transparent);
}

.environment-non-rl-note[hidden] {
display: none;
}

.environment-non-rl-note i {
color: var(--pst-color-info);
}

.environment-command-output {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
Expand Down
Loading
Loading