Skip to content

Commit 4540dae

Browse files
authored
fix(templates): update robotics Jazzy templates per new setup script (#544)
* fix(templates): update robotics Jazzy templates per new setup script - Remove Kisak Mesa and Kobuk Intel Graphics PPAs (no longer needed) - Remove explicit Mesa packages (use Ubuntu defaults) - Update RealSense repo URL to librealsense.realsenseai.com - Pin librealsense2-dkms, librealsense2, and ros-jazzy-librealsense2 to exact versions in the packages list using _version syntax - Replace first-boot systemd oneshot with direct DKMS install - Add post-deployment APT version pins as upgrade protection - Update metadata keywords (add dkms, remove mesa/ppa) * fix(templates): correct RealSense package version pins - Remove version pin from librealsense2-dkms (uses 1.3.x version scheme) - Remove version pin from ros-jazzy-librealsense2 (only 2.57.7 available) - Keep librealsense2 SDK pinned to 2.56.5-0~realsense.17055 - Simplify post-deployment APT pin to librealsense2 SDK only * fix(templates): address Copilot review comments - Add 'dkms' keyword to metadata in both raw and ISO templates - Update OpenVINO pin comment to reference setup-robotics-jazzy.sh instead of init_jazzy.sh * fix(templates): address review comment on librealsense pin comments Remove implementation detail comment about librealsense2-dkms version scheme from the RealSense post-deployment pin section in both templates. * fix(resolver,templates): fix oneAPI version conflict in robotics Jazzy builds Fix the Go dependency resolver to handle version constraint conflicts when packages from the same repository (same priority) need replacement. Also update both robotics Jazzy templates (raw + ISO) to align with the setup-robotics-jazzy.sh reference script. Resolver changes: - Track requested packages in resolvedDeps after dequeuing so later transitive dependencies reuse the explicitly requested version - Make constraint-satisfying replacements unconditional instead of gating on comparePriorityBehavior(), which incorrectly rejected valid replacements when both packages had the same repo priority Template changes (raw + ISO): - Add explicit versioned oneAPI packages before ros-jazzy-desktop to lock intel-oneapi-runtime-compilers to 2025.3.3-30 - Change ROS_DOMAIN_ID from 45 to 42 (matches reference script) - Expand oneAPI apt pin to cover runtime, compiler, and mkl patterns - Fix RealSense apt pin to use librealsense2* wildcard Tests: - Add TestConstraintSatisfyingReplacementSamePriority to verify unconditional replacement when constraint-satisfying candidate exists - Add TestRequestedPackageVersionPreserved to verify explicitly requested package versions are not overridden by transitive deps
1 parent 4c59906 commit 4540dae

4 files changed

Lines changed: 184 additions & 125 deletions

File tree

image-templates/ubuntu24-x86_64-robotics-jazzy-iso.yml

Lines changed: 25 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#
55
# Bootable ISO installer image. Flash to USB, boot, and install to internal drive.
66
# Includes ROS 2 Jazzy Desktop, Intel OpenVINO 2025, Gazebo Harmonic physics simulator,
7-
# Intel RealSense camera libraries, Intel NPU drivers, Mesa GPU stack, and more.
7+
# Intel RealSense camera libraries (DKMS), Intel NPU drivers, and more.
88
#
99
# Usage:
1010
# sudo -E ./image-composer-tool build image-templates/ubuntu24-x86_64-robotics-jazzy-iso.yml
@@ -53,7 +53,7 @@ metadata:
5353
- gpu
5454
- npu
5555
- level-zero
56-
- mesa
56+
- dkms
5757
- ubuntu
5858
- iso
5959
- bootable
@@ -107,27 +107,17 @@ packageRepositories:
107107
pkey: "https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB"
108108
component: "main"
109109

110-
# Kisak Mesa PPA (latest Mesa drivers)
111-
- codename: "noble"
112-
url: "https://ppa.launchpadcontent.net/kisak/kisak-mesa/ubuntu"
113-
pkey: "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xEB8B81E14DA65431D7504EA8F63F0F2B90935439"
114-
component: "main"
115-
116-
# Kobuk Team Intel Graphics PPA
117-
- codename: "noble"
118-
url: "https://ppa.launchpadcontent.net/kobuk-team/intel-graphics/ubuntu"
119-
pkey: "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x0C0E6AF955CE463C03FC51574D098D70AFBE5E1F"
120-
component: "main"
121-
122110
# Gazebo (OSRF) Harmonic stable repository
123111
- codename: "noble"
124112
url: "https://packages.osrfoundation.org/gazebo/ubuntu-stable"
125113
pkey: "https://packages.osrfoundation.org/gazebo.gpg"
126114
component: "main"
127115

128-
# Intel RealSense repository — NOT needed at build time.
129-
# All RealSense packages are installed on first boot via systemd oneshot service
130-
# (see configurations section). The first-boot script sets up the repo itself.
116+
# Intel RealSense repository (new URL as of 2026)
117+
- codename: "noble"
118+
url: "https://librealsense.realsenseai.com/Debian/apt-repo"
119+
pkey: "https://librealsense.realsenseai.com/Debian/librealsenseai.asc"
120+
component: "main"
131121

132122
systemConfig:
133123
name: robotics-jazzy
@@ -159,6 +149,13 @@ systemConfig:
159149
- dracut-core
160150
- cryptsetup-bin
161151

152+
# ── Intel OneAPI runtime (pinned to 2025.3.x) ───────────────────
153+
# Listed before ros-jazzy-desktop so the resolver locks these versions
154+
# first, preventing transitive deps from pulling 2026.0.0.
155+
- intel-oneapi-runtime-compilers_2025.3.3-30
156+
- intel-oneapi-runtime-compilers-common_2025.3.3-30
157+
- intel-oneapi-runtime-opencl_2025.3.3-30
158+
162159
# ── ROS 2 Jazzy Desktop (full) ──────────────────────────────────
163160
- ros-jazzy-desktop
164161

@@ -180,22 +177,11 @@ systemConfig:
180177
# ── Collaborative SLAM (Intel Xe / UHD GPU accelerated) ──────────
181178
- ros-jazzy-collab-slam-lze
182179

183-
# ── Intel RealSense camera ──────────────────────────────────────
184-
# Installed on first boot via systemd oneshot service (see configurations).
185-
# librealsense2-dkms requires DKMS which needs a live kernel to build modules;
186-
# cannot be built inside chroot. All RealSense packages are installed together
187-
# on first boot to ensure DKMS + userspace SDK are in sync.
188-
189-
# ── Mesa GPU stack (Intel Xe / UHD) ─────────────────────────────
190-
- libegl-mesa0
191-
- libgl1-mesa-dri
192-
- libgbm1
193-
- libglx-mesa0
194-
- mesa-libgallium
195-
- mesa-va-drivers
196-
- mesa-vdpau-drivers
197-
- mesa-vulkan-drivers
198-
- xwayland
180+
# ── Intel RealSense camera (DKMS + SDK, installed at build time) ──
181+
- linux-headers-generic
182+
- librealsense2-dkms
183+
- librealsense2_2.56.5-0~realsense.17055
184+
- ros-jazzy-librealsense2
199185

200186
# ── Firmware ────────────────────────────────────────────────────
201187
- linux-firmware
@@ -213,7 +199,7 @@ systemConfig:
213199
configurations:
214200
# ── ROS 2 environment setup ────────────────────────────────────
215201
- cmd: "echo 'source /opt/ros/jazzy/setup.bash' >> /etc/bash.bashrc"
216-
- cmd: "echo 'export ROS_DOMAIN_ID=45' >> /etc/bash.bashrc"
202+
- cmd: "echo 'export ROS_DOMAIN_ID=42' >> /etc/bash.bashrc"
217203

218204
# ── Post-deployment APT version pinning (protects against bad upgrades) ──
219205
# Note: Origin-based priority pins (ECI=1000, AMR=1001) are auto-generated
@@ -222,12 +208,12 @@ systemConfig:
222208
#
223209
# Block old FLANN 1.19.x from ECI (prefer Ubuntu's FLANN 1.9.2)
224210
- cmd: "printf 'Package: libflann*\\nPin: version 1.19.*\\nPin-Priority: -1\\n\\nPackage: flann*\\nPin: version 1.19.*\\nPin-Priority: -1\\n' > /etc/apt/preferences.d/eci-flann-block"
225-
# Pin OneAPI runtime deps to 2025.3.*
226-
- cmd: "printf 'Package: intel-oneapi-runtime-*\\nPin: version 2025.3.*\\nPin-Priority: 1001\\n' > /etc/apt/preferences.d/oneapi"
227-
# OpenVINO version pins (match init_jazzy.sh exactly)
211+
# Pin OneAPI packages to 2025.3.* (matches setup-robotics-jazzy.sh exactly)
212+
- cmd: "printf 'Package: intel-oneapi-runtime-*\\nPin: version 2025.3.*\\nPin-Priority: 1001\\n\\nPackage: intel-oneapi-compiler-*\\nPin: version 2025.3.*\\nPin-Priority: 1001\\n\\nPackage: intel-oneapi-mkl-*\\nPin: version 2025.3.*\\nPin-Priority: 1001\\n' > /etc/apt/preferences.d/oneapi"
213+
# OpenVINO version pins (match setup-robotics-jazzy.sh exactly)
228214
- cmd: "printf 'Package: openvino-libraries-dev\\nPin: version 2025.3.0*\\nPin-Priority: 1001\\n\\nPackage: openvino\\nPin: version 2025.3.0*\\nPin-Priority: 1001\\n\\nPackage: ros-jazzy-openvino-wrapper-lib\\nPin: version 2025.3.0*\\nPin-Priority: 1002\\n\\nPackage: ros-jazzy-openvino-node\\nPin: version 2025.3.0*\\nPin-Priority: 1002\\n' > /etc/apt/preferences.d/intel-openvino"
229-
# RealSense version pin
230-
- cmd: "printf 'Package: librealsense2*\\nPin: version 2.56.5-0~realsense.17055\\nPin-Priority: 1001\\n' > /etc/apt/preferences.d/librealsense"
215+
# RealSense SDK version pin for post-deployment upgrade protection.
216+
- cmd: "printf 'Package: librealsense2*\\nPin: version 2.56.5-0~realsense.17055\\nPin-Priority: 1001\\n\\nPackage: ros-jazzy-librealsense2*\\nPin: version 2.56.4*\\nPin-Priority: 1001\\n\\nPackage: ros-jazzy-realsense2*\\nPin: version 4.56.4*\\nPin-Priority: 1001\\n' > /etc/apt/preferences.d/librealsense"
231217

232218
# ── debconf pre-selections for OpenVINO node ─────────────────────
233219
- cmd: "echo 'ros-jazzy-openvino-node openvino-node/pip-proxy select true' | debconf-set-selections"
@@ -236,16 +222,6 @@ systemConfig:
236222
# ── Intel NPU udev rules (render group access to /dev/accel/*) ──
237223
- cmd: "printf 'SUBSYSTEM==\"accel\", KERNEL==\"accel*\", GROUP=\"render\", MODE=\"0660\"\\n' > /etc/udev/rules.d/10-intel-vpu.rules"
238224

239-
# ── Intel RealSense first-boot installation ────────────────────
240-
# librealsense2-dkms requires DKMS (needs live kernel for module builds).
241-
# This creates a systemd oneshot that sets up the repo, installs all
242-
# RealSense packages (version-pinned via /etc/apt/preferences.d/librealsense),
243-
# then disables itself.
244-
- cmd: "printf '#!/bin/bash\\nset -euo pipefail\\nexport DEBIAN_FRONTEND=noninteractive\\nmkdir -p /etc/apt/keyrings\\ncurl -sSf https://librealsense.intel.com/Debian/librealsense.pgp -o /etc/apt/keyrings/librealsense.pgp\\necho \"deb [signed-by=/etc/apt/keyrings/librealsense.pgp] https://librealsense.intel.com/Debian/apt-repo noble main\" > /etc/apt/sources.list.d/librealsense.list\\napt-get update\\napt-get install -y librealsense2-dkms librealsense2\\nsystemctl disable install-librealsense.service\\nrm -f /usr/local/bin/install-librealsense.sh\\n' > /usr/local/bin/install-librealsense.sh"
245-
- cmd: "chmod 755 /usr/local/bin/install-librealsense.sh"
246-
- cmd: "printf '[Unit]\\nDescription=Install Intel RealSense packages (first boot)\\nAfter=network-online.target\\nWants=network-online.target\\nConditionPathExists=/usr/local/bin/install-librealsense.sh\\n\\n[Service]\\nType=oneshot\\nExecStart=/usr/local/bin/install-librealsense.sh\\nEnvironment=DEBIAN_FRONTEND=noninteractive\\nTimeoutStartSec=0\\n\\n[Install]\\nWantedBy=multi-user.target\\n' > /etc/systemd/system/install-librealsense.service"
247-
- cmd: "systemctl enable install-librealsense.service"
248-
249225
# ── Enable required services ────────────────────────────────────
250226
- cmd: "systemctl enable NetworkManager"
251227
- cmd: "systemctl enable ssh"

image-templates/ubuntu24-x86_64-robotics-jazzy-raw.yml

Lines changed: 26 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
# Ubuntu 24.04 LTS + ROS 2 Jazzy Desktop + Intel OpenVINO + Gazebo Harmonic +
33
# Intel RealSense + Robotics SDK + Collab SLAM + Intel GPU/NPU support
44
#
5-
# Full-featured robotics development image based on the init_jazzy.sh setup script.
5+
# Full-featured robotics development image based on the setup-robotics-jazzy.sh script.
66
# Includes ROS 2 Jazzy Desktop, Intel OpenVINO 2025, Gazebo Harmonic physics simulator,
7-
# Intel RealSense camera libraries, Intel NPU drivers, Mesa GPU stack, and more.
7+
# Intel RealSense camera libraries (DKMS), Intel NPU drivers, and more.
88
#
99
# Usage:
1010
# sudo -E ./image-composer-tool build image-templates/ubuntu24-x86_64-robotics-jazzy-raw.yml
@@ -55,9 +55,8 @@ metadata:
5555
- gpu
5656
- npu
5757
- level-zero
58-
- mesa
58+
- dkms
5959
- ubuntu
60-
6160
image:
6261
name: robotics-jazzy-ubuntu24
6362
version: "24.04"
@@ -133,27 +132,17 @@ packageRepositories:
133132
pkey: "https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB"
134133
component: "main"
135134

136-
# Kisak Mesa PPA (latest Mesa drivers)
137-
- codename: "noble"
138-
url: "https://ppa.launchpadcontent.net/kisak/kisak-mesa/ubuntu"
139-
pkey: "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xEB8B81E14DA65431D7504EA8F63F0F2B90935439"
140-
component: "main"
141-
142-
# Kobuk Team Intel Graphics PPA
143-
- codename: "noble"
144-
url: "https://ppa.launchpadcontent.net/kobuk-team/intel-graphics/ubuntu"
145-
pkey: "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x0C0E6AF955CE463C03FC51574D098D70AFBE5E1F"
146-
component: "main"
147-
148135
# Gazebo (OSRF) Harmonic stable repository
149136
- codename: "noble"
150137
url: "https://packages.osrfoundation.org/gazebo/ubuntu-stable"
151138
pkey: "https://packages.osrfoundation.org/gazebo.gpg"
152139
component: "main"
153140

154-
# Intel RealSense repository — NOT needed at build time.
155-
# All RealSense packages are installed on first boot via systemd oneshot service
156-
# (see configurations section). The first-boot script sets up the repo itself.
141+
# Intel RealSense repository (new URL as of 2026)
142+
- codename: "noble"
143+
url: "https://librealsense.realsenseai.com/Debian/apt-repo"
144+
pkey: "https://librealsense.realsenseai.com/Debian/librealsenseai.asc"
145+
component: "main"
157146

158147
systemConfig:
159148
name: robotics-jazzy
@@ -185,6 +174,13 @@ systemConfig:
185174
- dracut-core
186175
- cryptsetup-bin
187176

177+
# ── Intel OneAPI runtime (pinned to 2025.3.x) ───────────────────
178+
# Listed before ros-jazzy-desktop so the resolver locks these versions
179+
# first, preventing transitive deps from pulling 2026.0.0.
180+
- intel-oneapi-runtime-compilers_2025.3.3-30
181+
- intel-oneapi-runtime-compilers-common_2025.3.3-30
182+
- intel-oneapi-runtime-opencl_2025.3.3-30
183+
188184
# ── ROS 2 Jazzy Desktop (full) ──────────────────────────────────
189185
- ros-jazzy-desktop
190186

@@ -206,22 +202,11 @@ systemConfig:
206202
# ── Collaborative SLAM (Intel Xe / UHD GPU accelerated) ──────────
207203
- ros-jazzy-collab-slam-lze
208204

209-
# ── Intel RealSense camera ──────────────────────────────────────
210-
# Installed on first boot via systemd oneshot service (see configurations).
211-
# librealsense2-dkms requires DKMS which needs a live kernel to build modules;
212-
# cannot be built inside chroot. All RealSense packages are installed together
213-
# on first boot to ensure DKMS + userspace SDK are in sync.
214-
215-
# ── Mesa GPU stack (Intel Xe / UHD) ─────────────────────────────
216-
- libegl-mesa0
217-
- libgl1-mesa-dri
218-
- libgbm1
219-
- libglx-mesa0
220-
- mesa-libgallium
221-
- mesa-va-drivers
222-
- mesa-vdpau-drivers
223-
- mesa-vulkan-drivers
224-
- xwayland
205+
# ── Intel RealSense camera (DKMS + SDK, installed at build time) ──
206+
- linux-headers-generic
207+
- librealsense2-dkms
208+
- librealsense2_2.56.5-0~realsense.17055
209+
- ros-jazzy-librealsense2
225210

226211
# ── Firmware ────────────────────────────────────────────────────
227212
- linux-firmware
@@ -239,7 +224,7 @@ systemConfig:
239224
configurations:
240225
# ── ROS 2 environment setup ────────────────────────────────────
241226
- cmd: "echo 'source /opt/ros/jazzy/setup.bash' >> /etc/bash.bashrc"
242-
- cmd: "echo 'export ROS_DOMAIN_ID=45' >> /etc/bash.bashrc"
227+
- cmd: "echo 'export ROS_DOMAIN_ID=42' >> /etc/bash.bashrc"
243228

244229
# ── Post-deployment APT version pinning (protects against bad upgrades) ──
245230
# Note: Origin-based priority pins (ECI=1000, AMR=1001) are auto-generated
@@ -248,12 +233,12 @@ systemConfig:
248233
#
249234
# Block old FLANN 1.19.x from ECI (prefer Ubuntu's FLANN 1.9.2)
250235
- cmd: "printf 'Package: libflann*\\nPin: version 1.19.*\\nPin-Priority: -1\\n\\nPackage: flann*\\nPin: version 1.19.*\\nPin-Priority: -1\\n' > /etc/apt/preferences.d/eci-flann-block"
251-
# Pin OneAPI runtime deps to 2025.3.*
252-
- cmd: "printf 'Package: intel-oneapi-runtime-*\\nPin: version 2025.3.*\\nPin-Priority: 1001\\n' > /etc/apt/preferences.d/oneapi"
253-
# OpenVINO version pins (match init_jazzy.sh exactly)
236+
# Pin OneAPI packages to 2025.3.* (matches setup-robotics-jazzy.sh exactly)
237+
- cmd: "printf 'Package: intel-oneapi-runtime-*\\nPin: version 2025.3.*\\nPin-Priority: 1001\\n\\nPackage: intel-oneapi-compiler-*\\nPin: version 2025.3.*\\nPin-Priority: 1001\\n\\nPackage: intel-oneapi-mkl-*\\nPin: version 2025.3.*\\nPin-Priority: 1001\\n' > /etc/apt/preferences.d/oneapi"
238+
# OpenVINO version pins (match setup-robotics-jazzy.sh exactly)
254239
- cmd: "printf 'Package: openvino-libraries-dev\\nPin: version 2025.3.0*\\nPin-Priority: 1001\\n\\nPackage: openvino\\nPin: version 2025.3.0*\\nPin-Priority: 1001\\n\\nPackage: ros-jazzy-openvino-wrapper-lib\\nPin: version 2025.3.0*\\nPin-Priority: 1002\\n\\nPackage: ros-jazzy-openvino-node\\nPin: version 2025.3.0*\\nPin-Priority: 1002\\n' > /etc/apt/preferences.d/intel-openvino"
255-
# RealSense version pin
256-
- cmd: "printf 'Package: librealsense2*\\nPin: version 2.56.5-0~realsense.17055\\nPin-Priority: 1001\\n' > /etc/apt/preferences.d/librealsense"
240+
# RealSense SDK version pin for post-deployment upgrade protection.
241+
- cmd: "printf 'Package: librealsense2\\nPin: version 2.56.5-0~realsense.17055\\nPin-Priority: 1001\\n\\nPackage: ros-jazzy-librealsense2*\\nPin: version 2.56.4*\\nPin-Priority: 1001\\n\\nPackage: ros-jazzy-realsense2*\\nPin: version 4.56.4*\\nPin-Priority: 1001\\n' > /etc/apt/preferences.d/librealsense"
257242

258243
# ── debconf pre-selections for OpenVINO node ─────────────────────
259244
- cmd: "echo 'ros-jazzy-openvino-node openvino-node/pip-proxy select true' | debconf-set-selections"
@@ -262,16 +247,6 @@ systemConfig:
262247
# ── Intel NPU udev rules (render group access to /dev/accel/*) ──
263248
- cmd: "printf 'SUBSYSTEM==\"accel\", KERNEL==\"accel*\", GROUP=\"render\", MODE=\"0660\"\\n' > /etc/udev/rules.d/10-intel-vpu.rules"
264249

265-
# ── Intel RealSense first-boot installation ────────────────────
266-
# librealsense2-dkms requires DKMS (needs live kernel for module builds).
267-
# This creates a systemd oneshot that sets up the repo, installs all
268-
# RealSense packages (version-pinned via /etc/apt/preferences.d/librealsense),
269-
# then disables itself.
270-
- cmd: "printf '#!/bin/bash\\nset -euo pipefail\\nexport DEBIAN_FRONTEND=noninteractive\\nmkdir -p /etc/apt/keyrings\\ncurl -sSf https://librealsense.intel.com/Debian/librealsense.pgp -o /etc/apt/keyrings/librealsense.pgp\\necho \"deb [signed-by=/etc/apt/keyrings/librealsense.pgp] https://librealsense.intel.com/Debian/apt-repo noble main\" > /etc/apt/sources.list.d/librealsense.list\\napt-get update\\napt-get install -y librealsense2-dkms librealsense2\\nsystemctl disable install-librealsense.service\\nrm -f /usr/local/bin/install-librealsense.sh\\n' > /usr/local/bin/install-librealsense.sh"
271-
- cmd: "chmod 755 /usr/local/bin/install-librealsense.sh"
272-
- cmd: "printf '[Unit]\\nDescription=Install Intel RealSense packages (first boot)\\nAfter=network-online.target\\nWants=network-online.target\\nConditionPathExists=/usr/local/bin/install-librealsense.sh\\n\\n[Service]\\nType=oneshot\\nExecStart=/usr/local/bin/install-librealsense.sh\\nEnvironment=DEBIAN_FRONTEND=noninteractive\\nTimeoutStartSec=0\\n\\n[Install]\\nWantedBy=multi-user.target\\n' > /etc/systemd/system/install-librealsense.service"
273-
- cmd: "systemctl enable install-librealsense.service"
274-
275250
# ── Enable required services ────────────────────────────────────
276251
- cmd: "systemctl enable NetworkManager"
277252
- cmd: "systemctl enable ssh"

0 commit comments

Comments
 (0)