name: CI on: push: branches: [main] pull_request: jobs: cpu: name: CPU tests and ruff runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: "3.12" - name: Install CPU packages run: | python -m pip install --upgrade pip python -m pip install \ -e mecanum-kinematics \ -e omnibot-ai-engines/learning_engine \ -e omnibot-ai-engines/agent_engine \ -e yahboom-python-driver \ -e yahboom-python-driver \ ohho-os \ pytest numpy pyarrow click pyyaml ruff coverage opencv-python-headless pandas aiortc \ xacro trimesh fast-simplification python -m pip install torch --index-url https://download.pytorch.org/whl/cpu - name: Ruff run: ruff check . - name: CPU suites run: | pytest mecanum-kinematics/tests yahboom-python-driver/tests ros2-bev-stitcher/tests ohho-webrtc/tests omnibot-ros2/omnibot_arm/test omnibot-ai-ros2/omnibot_lerobot/test omnibot-ros2/omnibot_bringup/test/test_unbuilt_launch.py omnibot-ros2/omnibot_bringup/test/test_teleop_default.py omnibot-ros2/omnibot_bringup/test/test_teleop_safety.py omnibot-ros2/omnibot_bringup/test/test_sim_vr_profile.py omnibot-ros2/omnibot_bringup/test/test_pick_place_spawn.py omnibot-ros2/omnibot_bringup/test/test_descriptor.py omnibot-ros2/omnibot_bringup/test/test_sim_cameras.py omnibot-ros2/omnibot_bringup/test/test_sim_vr_launch.py omnibot-ros2/omnibot_bringup/test/test_docker_sim.py omnibot-ros2/omnibot_bringup/test/test_frame_launch_docs.py omnibot-ros2/omnibot_navigation/test omnibot-ros2/omnibot_description/test infra/observability/tests scripts/test_architecture_launch_table.py scripts/tests -q python -m unittest discover -s omnibot-ai-engines/learning_engine/tests -t omnibot-ai-engines python -m unittest discover -s omnibot-ai-engines/agent_engine/tests -t omnibot-ai-engines PYTHONPATH=omnibot-ai-engines pytest omnibot-ai-engines/data_engine/tests omnibot-ai-engines/lerobot_engine/tests -q - name: CPU line coverage run: python scripts/run_cpu_coverage.py - name: Upload CPU coverage artifact uses: actions/upload-artifact@v4 if: always() with: name: cpu-coverage path: | coverage/coverage-summary.txt coverage/cpu-coverage.json vla-engine: name: OmniVLA engine (vla_engine) tests runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: "3.12" - name: Install vla_engine (CPU torch) and run tests run: | python -m pip install --upgrade pip python -m pip install torch --index-url https://download.pytorch.org/whl/cpu python -m pip install -e "omnibot-ai-engines/vla_engine[serve,test]" pytest omnibot-ai-engines/vla_engine/tests -q docs: name: README docs-as-tests runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: "3.12" - name: CPU-only README fences in a fresh venv run: python3 scripts/docs_test_readme.py - name: VR profile release notes stay unpublished run: python3 scripts/check_vr_profile_release_notes.py ros: name: colcon build and test runs-on: ubuntu-24.04 container: ros:jazzy-ros-base-noble timeout-minutes: 120 steps: - name: Install git, sudo, and URDF validation tools run: apt-get update && apt-get install -y git sudo ca-certificates liburdfdom-tools ros-jazzy-xacro - uses: actions/checkout@v4 - name: Validate the robot description shell: bash run: | set -eo pipefail source /opt/ros/jazzy/setup.bash xacro omnibot-ros2/omnibot_description/urdf/omnibot.urdf.xacro > /tmp/omnibot.urdf check_urdf /tmp/omnibot.urdf - name: ROS 2 quick start from the README shell: bash run: | set -eo pipefail sudo apt-get update sudo apt-get install -y python3-colcon-common-extensions python3-rosdep python3-pytest python3-pip sudo rosdep init || true rosdep update source /opt/ros/jazzy/setup.bash rosdep install --from-paths src --ignore-src -y --rosdistro jazzy \ --dependency-types=build \ --dependency-types=buildtool \ --dependency-types=build_export \ --dependency-types=buildtool_export \ --dependency-types=exec \ --dependency-types=test # Jazzy ships NumPy 1.26. Current pyarrow needs NumPy 2; 18.1.0 is the pin # the lerobot README uses for that NumPy. # data_engine is not installed here (its setup.py pulls torch). The # lerobot test shells out to validate_dataset and filter_episodes, # which import click. The CPU job installs that extra the same way. python3 -m pip install --break-system-packages \ -e omnibot-ai-engines/learning_engine \ -e omnibot-ai-engines/agent_engine \ numpy pyarrow==18.1.0 click colcon build --symlink-install --base-paths src source install/setup.bash colcon test --base-paths src --event-handlers console_direct+ --return-code-on-test-failure colcon test-result --verbose sim-smoke: name: sim-smoke runs-on: ubuntu-24.04 container: ros:jazzy-ros-base-noble timeout-minutes: 60 env: OMNIBOT_SIM_SMOKE: "1" LIBGL_ALWAYS_SOFTWARE: "1" GALLIUM_DRIVER: llvmpipe QT_QPA_PLATFORM: offscreen MESA_GL_VERSION_OVERRIDE: "3.3" steps: - name: Install git and sudo run: apt-get update && apt-get install -y git sudo ca-certificates - uses: actions/checkout@v4 - name: Install Gazebo Harmonic, the bridge, and software rendering shell: bash run: | set -eo pipefail sudo apt-get update sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \ python3-colcon-common-extensions \ python3-rosdep \ python3-pytest \ libgl1-mesa-dri \ libegl1 \ libegl-mesa0 \ libglx-mesa0 \ libglu1-mesa \ xvfb sudo rosdep init || true rosdep update source /opt/ros/jazzy/setup.bash rosdep install --from-paths src --ignore-src -y --rosdistro jazzy \ --dependency-types=build \ --dependency-types=buildtool \ --dependency-types=build_export \ --dependency-types=buildtool_export \ --dependency-types=exec \ --dependency-types=test - name: Build and run the headless launch test shell: bash run: | set -eo pipefail source /opt/ros/jazzy/setup.bash colcon build --symlink-install --base-paths src \ --packages-up-to omnibot_bringup source install/setup.bash colcon test --base-paths src --packages-select omnibot_bringup \ --event-handlers console_direct+ --return-code-on-test-failure colcon test-result --verbose