1717 runs-on : ubuntu-latest
1818 container :
1919 image : ${{ matrix.docker_image }}
20+ continue-on-error : ${{ matrix.experimental == true }}
2021 strategy :
2122 fail-fast : false
2223 matrix :
2627 - humble
2728 - jazzy
2829 - kilted
30+ - lyrical
2931 - rolling
3032 include :
3133 # Humble Hawksbill (May 2022 - May 2027)
3739 # Kilted Kaiju (May 2025 - Dec 2026)
3840 - docker_image : ubuntu:noble
3941 ros_distribution : kilted
42+ # Lyrical Luth (May 2026 - May 2031, beta) - allow-failure until packages stabilize
43+ - docker_image : ubuntu:26.04
44+ ros_distribution : lyrical
45+ experimental : true
46+ ros_tar_url : " https://github.com/ros2/ros2/releases/download/release-lyrical-beta-20260429-1/ros2-lyrical-2026-04-29-1-resolute-x86_64.tar.bz2"
4047 # Rolling Ridley (No End-Of-Life)
4148 - docker_image : ubuntu:noble
4249 ros_distribution : rolling
@@ -49,41 +56,46 @@ jobs:
4956 architecture : ${{ matrix.architecture }}
5057
5158 - name : Setup ROS2
52- if : ${{ matrix.ros_distribution != 'rolling' }}
59+ if : ${{ matrix.ros_distribution != 'rolling' && matrix.ros_distribution != 'lyrical' }}
5360 uses : ros-tooling/setup-ros@v0.7
5461 with :
5562 required-ros-distributions : ${{ matrix.ros_distribution }}
5663
57- - name : Install ROS2 Rolling Nightly
58- if : ${{ matrix.ros_distribution == 'rolling' }}
64+ - name : Enable ROS2 apt repository (rolling / lyrical)
65+ if : ${{ matrix.ros_distribution == 'rolling' || matrix.ros_distribution == 'lyrical' }}
5966 run : |
6067 apt-get update
6168 apt-get install -y software-properties-common curl
6269
63- # Enable required repositories (per https://docs.ros.org/en/rolling /Installation/Alternatives/ Ubuntu-Install-Binary .html)
70+ # Enable required repositories (per https://docs.ros.org/en/lyrical /Installation/Ubuntu-Install-Debs .html)
6471 add-apt-repository universe
6572 ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F'"' '{print $4}')
6673 curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"
6774 dpkg -i /tmp/ros2-apt-source.deb
68-
69- # Install prerequisites and apt packages BEFORE nightly tarball
7075 apt-get update
7176 apt-get install -y build-essential cmake tar bzip2 python3 python3-rosdep python3-colcon-common-extensions
72- apt-get install -y ros-rolling-test-msgs ros-rolling-mrpt-msgs
7377
74- # Extract nightly binary AFTER apt packages so nightly's newer libs overwrite apt's older ones
75- curl -sL "${{ matrix.ros_tar_url }}" -o /tmp/ros2-nightly.tar.bz2
76- mkdir -p /opt/ros/rolling
77- tar xf /tmp/ros2-nightly.tar.bz2 --strip-components=1 -C /opt/ros/rolling
78- rm /tmp/ros2-nightly.tar.bz2
78+ - name : Install ROS2 from binary tarball (rolling / lyrical)
79+ if : ${{ matrix.ros_distribution == 'rolling' || matrix.ros_distribution == 'lyrical' }}
80+ run : |
81+ # Install apt packages BEFORE the binary tarball
82+ apt-get install -y ros-${{ matrix.ros_distribution }}-test-msgs
83+ # mrpt_msgs may not be available for newer/beta distros (e.g. lyrical); install best-effort
84+ apt-get install -y ros-${{ matrix.ros_distribution }}-mrpt-msgs || echo "ros-${{ matrix.ros_distribution }}-mrpt-msgs not yet available, skipping"
85+
86+ # Extract binary tarball AFTER apt packages so its newer libs overwrite apt's older ones
87+ curl -sL "${{ matrix.ros_tar_url }}" -o /tmp/ros2-${{ matrix.ros_distribution }}.tar.bz2
88+ mkdir -p /opt/ros/${{ matrix.ros_distribution }}
89+ tar xf /tmp/ros2-${{ matrix.ros_distribution }}.tar.bz2 --strip-components=1 -C /opt/ros/${{ matrix.ros_distribution }}
90+ rm /tmp/ros2-${{ matrix.ros_distribution }}.tar.bz2
7991
8092 # Install any remaining runtime dependencies using rosdep
8193 rosdep init || true
8294 rosdep update
83- rosdep install --rosdistro rolling --from-paths /opt/ros/rolling /share --ignore-src -y --skip-keys "cyclonedds fastcdr fastdds iceoryx_binding_c rmw_connextdds rti-connext-dds-7.3.0 rti-connext-dds-7.7.0 urdfdom_headers python3-pyqt6.qtsvg rosidl_buffer_py pybind11"
95+ rosdep install --rosdistro ${{ matrix.ros_distribution }} --from-paths /opt/ros/${{ matrix.ros_distribution }} /share --ignore-src -y --skip-keys "cyclonedds fastcdr fastdds iceoryx_binding_c rmw_connextdds rti-connext-dds-7.3.0 rti-connext-dds-7.7.0 urdfdom_headers python3-pyqt6.qtsvg rosidl_buffer_py pybind11"
8496
8597 - name : Install test-msgs and mrpt_msgs on Linux
86- if : ${{ matrix.ros_distribution != 'rolling' }}
98+ if : ${{ matrix.ros_distribution != 'rolling' && matrix.ros_distribution != 'lyrical' }}
8799 run : |
88100 sudo apt install -y ros-${{ matrix.ros_distribution }}-test-msgs ros-${{ matrix.ros_distribution }}-mrpt-msgs
89101
@@ -98,18 +110,7 @@ jobs:
98110
99111 - uses : actions/checkout@v6
100112
101- - name : Build and test rclnodejs (nightly)
102- if : ${{ matrix.ros_distribution == 'rolling' }}
103- run : |
104- uname -a
105- source /opt/ros/rolling/setup.bash
106- npm i
107- npm run lint
108- npm test
109- npm run clean
110-
111113 - name : Build and test rclnodejs
112- if : ${{ matrix.ros_distribution != 'rolling' }}
113114 run : |
114115 uname -a
115116 source /opt/ros/${{ matrix.ros_distribution }}/setup.bash
@@ -118,10 +119,10 @@ jobs:
118119 npm test
119120 npm run clean
120121
121- - name : Test with IDL ROS messages against rolling
122- if : ${{ matrix.ros_distribution == 'rolling' }}
122+ - name : Test with IDL ROS messages ( rolling / lyrical)
123+ if : ${{ matrix.ros_distribution == 'rolling' || matrix.ros_distribution == 'lyrical' }}
123124 run : |
124- source /opt/ros/rolling /setup.bash
125+ source /opt/ros/${{ matrix.ros_distribution }} /setup.bash
125126 npm i
126127 npm run test-idl
127128 npm run clean
0 commit comments