Skip to content
Draft
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
5 changes: 3 additions & 2 deletions .github/actions/docker-build/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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" \
Expand Down
70 changes: 69 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down Expand Up @@ -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:
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/daily-compatibility.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ on:
schedule:
# Run daily at 8 PM PST (4 AM UTC)
- cron: '0 4 * * *'

workflow_dispatch:
inputs:
isaacsim_version:
Expand Down
116 changes: 116 additions & 0 deletions docker/Dockerfile.arm
Original file line number Diff line number Diff line change
@@ -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}
Loading