Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
c823d32
Update Lyrical rosdistro snapshot
wolfv Aug 1, 2026
23c08d7
Refresh patches for updated Lyrical packages
wolfv Aug 1, 2026
ae0d777
Fix slam-toolbox after snapshot update
wolfv Aug 2, 2026
4533e2a
Turn snapshot refresh into full rebuild
wolfv Aug 2, 2026
84b8e0a
Fix initial full rebuild dependency ordering
wolfv Aug 2, 2026
6e8c70e
Build full rebuilds in dependency-tolerant passes
wolfv Aug 2, 2026
6297d94
Use immutable source archives for full rebuilds
wolfv Aug 2, 2026
7480aea
Run source conversion through the pixi environment
wolfv Aug 2, 2026
9b075e6
Run every dependency-tolerant rebuild pass
wolfv Aug 2, 2026
bd68338
Fix remaining full rebuild blockers
wolfv Aug 3, 2026
748bd1d
Fix remaining ARM full rebuild blockers
wolfv Aug 3, 2026
4b2aef7
Reuse full rebuild cache for final validation
wolfv Aug 3, 2026
d3be379
Bootstrap runtime cycles and fix iceoryx on Windows
wolfv Aug 3, 2026
349bc03
Unvendor iceoryx and complete mutex bootstrap
wolfv Aug 4, 2026
d5836c9
Merge remote-tracking branch 'origin/main' into update-lyrical-snapshot
wolfv Aug 4, 2026
dc29dce
Refresh RMF patches and bootstrap core runtime packages
wolfv Aug 4, 2026
388174e
Break RCL bootstrap cycle and seed middleware stack
wolfv Aug 4, 2026
bb28685
Refresh snapshot for Navigation2 release
wolfv Aug 8, 2026
918613e
Remove patches included in updated releases
wolfv Aug 8, 2026
4499c0b
Remove obsolete Navigation2 platform patches
wolfv Aug 8, 2026
1d26d95
Install complete iceoryx host package for CycloneDDS
wolfv Aug 8, 2026
bf03edb
Fix RMF validator target and mutex bootstrap
wolfv Aug 8, 2026
169cc74
Bootstrap ament lint and RMW test fixture stacks
wolfv Aug 8, 2026
e7eda8e
Fail fast when a bootstrap package fails
wolfv Aug 8, 2026
260f721
Complete foundational mutex bootstrap ordering
wolfv Aug 8, 2026
e1a10b1
Bootstrap service messages and RCL components
wolfv Aug 8, 2026
aa57c54
Replace manual bootstrap with dependency-tolerant passes
wolfv Aug 8, 2026
6ce51ee
Propagate angles runtime dependency from nav2-util
wolfv Aug 8, 2026
d51f8a8
Invalidate nav2-util cache after dependency fix
wolfv Aug 8, 2026
ead9fec
Fix exported Nav2 dependencies and macOS macro clash
wolfv Aug 8, 2026
54b58a8
Fix remaining cached rebuild failures
wolfv Aug 8, 2026
77a4731
Fix RMF validator target and libc++ atomic support
wolfv Aug 8, 2026
bcfe0b9
Complete portable atomic and RMF target fixes
wolfv Aug 8, 2026
e12290c
Remove obsolete Nav2 MPPI clang constraint
wolfv Aug 8, 2026
d1f1d03
Continue rebuild from refreshed platform caches
wolfv Aug 9, 2026
805fb3f
Handle Nav2 real-time utilities on Windows
wolfv Aug 10, 2026
0bd8eda
Use atomic shared pointer feature detection
wolfv Aug 11, 2026
d924a4f
Fix Nav2 message validation on MSVC
wolfv Aug 13, 2026
6135ee4
Refresh snapshot for latest Lyrical releases
wolfv Aug 20, 2026
5c54fea
Reindex artifacts between tolerant build passes
wolfv Aug 20, 2026
35dc68e
Merge remote-tracking branch 'origin/main' into pr-34
wolfv Aug 20, 2026
8e01cd9
Refresh patches against current release sources
wolfv Aug 20, 2026
2519155
Retry transient recipe metadata downloads
wolfv Aug 20, 2026
a65b713
Recover builds from incomplete PR caches
wolfv Aug 20, 2026
b6da7f3
Restore compatibility for updated MoveIt and OSQP
wolfv Aug 20, 2026
ef97b93
Fix OSQP selection and MoveIt export header
wolfv Aug 20, 2026
d063fac
Fix swri-console on macOS and bound CI passes
wolfv Aug 21, 2026
6ec31d8
Restore partial caches after hosted job timeouts
wolfv Aug 21, 2026
6c8d576
Fit cached macOS and Windows builds within CI limit
wolfv Aug 22, 2026
33cd1ee
Bump recipes for the mutex migration
wolfv Aug 22, 2026
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
101 changes: 95 additions & 6 deletions .github/workflows/testpr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,31 @@ jobs:
- name: Generate recipes
shell: bash -l {0}
run: |
mkdir -p recipes
pixi run -v vinca --platform ${{ matrix.platform }} -m -n
set -e
for attempt in 1 2 3; do
rm -rf recipes
mkdir -p recipes
if pixi run -v vinca --platform ${{ matrix.platform }} -m -n; then
break
fi
if [[ "${attempt}" == "3" ]]; then
echo "Recipe generation failed after ${attempt} attempts" >&2
exit 1
fi
echo "Recipe generation attempt ${attempt} failed; retrying..." >&2
sleep 15
done
# Avoid concurrent Git clone cache corruption when many ROS packages
# share the same release repository.
pixi run python use_github_source_archives.py

- name: Check patches
shell: bash -l {0}
run: |
pixi run check-patches
# Recipes were already generated for the matrix platform and their Git
# sources converted to archives. Do not use the Pixi task here because
# its generate-recipes dependency would overwrite both changes.
pixi run python check_patches_clean_apply.py

- name: Restore build cache
id: cache-restore
Expand All @@ -94,6 +112,28 @@ jobs:
restore-keys: |
${{ runner.os }}-${{ matrix.platform }}-pr-${{ github.event.pull_request.number }}-

- name: Restore latest partial-build artifact
if: ${{ steps.cache-restore.outputs.cache-hit != 'true' && env.IGNORE_CACHE_AND_DO_FULL_REBUILD != 'true' }}
shell: bash -l {0}
env:
GH_TOKEN: ${{ github.token }}
run: |
# A hosted job canceled at the hard six-hour limit cannot reliably save
# its actions/cache entry, but always() still uploads its partial output
# as an artifact. Recover the newest such checkpoint on the next run.
prefix="cache-${{ matrix.platform }}-"
artifact_id=$(gh api "repos/${GITHUB_REPOSITORY}/actions/artifacts?per_page=100" \
--jq '.artifacts | map(select(.expired == false and (.name | startswith("'"${prefix}"'")))) | sort_by(.created_at) | last | .id // empty')
if [[ -n "${artifact_id}" ]]; then
echo "Restoring partial-build artifact ${artifact_id}"
gh api "repos/${GITHUB_REPOSITORY}/actions/artifacts/${artifact_id}/zip" > partial-cache.zip
mkdir -p ${{ matrix.folder_cache }}
pixi run python -m zipfile -e partial-cache.zip ${{ matrix.folder_cache }}
rm partial-cache.zip
else
echo "No partial-build artifact found for ${{ matrix.platform }}"
fi

- name: Optional force full rebuild
if: ${{ env.IGNORE_CACHE_AND_DO_FULL_REBUILD == 'true' }}
shell: bash -l {0}
Expand All @@ -103,7 +143,17 @@ jobs:
- name: Delete specific outdated cache entries
shell: bash -l {0}
run: |
# rm -rf ${{ matrix.folder_cache }}/ros-lyrical-pcl-conversions* 2>/dev/null || true
# nav2-util was cached before its exported angles dependency was
# propagated; force replacement without discarding the full rebuild.
rm -rf ${{ matrix.folder_cache }}/ros-lyrical-nav2-util-* 2>/dev/null || true
rm -rf ${{ matrix.folder_cache }}/ros-lyrical-nav2-route-* 2>/dev/null || true
rm -rf ${{ matrix.folder_cache }}/ros-lyrical-nav2-ros-common-* 2>/dev/null || true
# Build 23 caches contain a mixture of pre- and post-mutex-migration
# packages with identical filenames. Remove them now that this rebuild
# uses build 24, otherwise strict local-channel priority can select an
# incompatible package requiring the old mutex.
rm -rf ${{ matrix.folder_cache }}/*_23.conda 2>/dev/null || true
rm -rf ${{ matrix.folder_cache }}/ros2-distro-mutex-*-lyrical_23.conda 2>/dev/null || true
mkdir -p ${{ matrix.folder_cache }}
pixi run rattler-index fs ${{ matrix.folder_cache }}/.. --force

Expand All @@ -113,8 +163,34 @@ jobs:
ls ${{ matrix.folder_cache }} || true

- name: Build recipes
id: build-recipes
shell: bash -l {0}
run: |
set -e
# rattler-build orders build and host dependencies, but runtime-only
# dependencies do not create build-graph edges. A mutex migration makes
# old runtime packages unusable, so run tolerant passes to populate the
# new mutex generation before the final strict validation. Four passes
# also let the build recover when an earlier failed run saved little or
# no usable cache.
pass_count=4
# Hosted macOS and Windows jobs have a hard six-hour limit. Their
# partial-artifact checkpoint provides the bootstrap state, so use one
# tolerant pass followed by strict validation to stay within the limit.
if [[ "${{ matrix.platform }}" == osx-* || "${{ matrix.platform }}" == "win-64" ]]; then
pass_count=1
fi

for pass in $(seq 1 "${pass_count}"); do
echo "Dependency-tolerant build pass ${pass}/${pass_count}"
rm -rf ${{ matrix.folder_cache }}/../src_cache/git
pixi run rattler-build build --recipe-dir recipes --target-platform ${{ matrix.platform }} -m ./conda_build_config.yaml -c https://prefix.dev/conda-forge -c https://prefix.dev/robostack-lyrical --continue-on-failure --skip-existing || true
# Each rattler-build invocation resolves against channel repodata read
# at startup. Publish this pass's new artifacts before the next pass.
pixi run rattler-index fs ${{ matrix.folder_cache }}/.. --force
done

rm -rf ${{ matrix.folder_cache }}/../src_cache/git
pixi run rattler-build build --recipe-dir recipes --target-platform ${{ matrix.platform }} -m ./conda_build_config.yaml -c https://prefix.dev/conda-forge -c https://prefix.dev/robostack-lyrical --skip-existing

- name: See packages that will be saved in cache
Expand All @@ -125,7 +201,9 @@ jobs:

- name: Save build cache
uses: actions/cache/save@v5
if: always()
# Preserve useful partial builds, but do not let a recipe-generation or
# patch-check failure replace the restore prefix with an empty cache.
if: ${{ always() && (steps.build-recipes.outcome == 'success' || steps.build-recipes.outcome == 'failure') }}
with:
path: |
${{ matrix.folder_cache }}
Expand All @@ -134,7 +212,18 @@ jobs:
- name: Generate GitHub Actions workflows to catch post-PR problems
shell: bash -l {0}
run: |
pixi run vinca-gha --platform ${{ matrix.platform }} --trigger-branch dummy_build_branch_as_it_is_unused -d ./recipes
set -e
for attempt in 1 2 3; do
if pixi run vinca-gha --platform ${{ matrix.platform }} --trigger-branch dummy_build_branch_as_it_is_unused -d ./recipes; then
break
fi
if [[ "${attempt}" == "3" ]]; then
echo "Workflow generation failed after ${attempt} attempts" >&2
exit 1
fi
echo "Workflow generation attempt ${attempt} failed; retrying..." >&2
sleep 15
done

- name: Upload build cache as artifact
if: ${{ always() && env.SAVE_CACHE_AS_ARTIFACT == 'true' }}
Expand Down
6 changes: 6 additions & 0 deletions check_patches_clean_apply.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,12 @@ def run_rattler_build_individually(recipes: List[Path]) -> None:
print("\n Running:", " ".join(cmd), "\n", flush=True)
try:
proc = subprocess.run(cmd, text=True, capture_output=True, errors="replace", encoding="utf-8")
# rattler-build's shared Git source cache can occasionally retain
# tag refs whose objects were not fetched. Retry from a clean Git
# cache rather than reporting a spurious patch failure.
if proc.returncode != 0 and "Git error: Git fetch failed" in proc.stderr:
shutil.rmtree(ROOT_DIR / "output" / "src_cache" / "git", ignore_errors=True)
proc = subprocess.run(cmd, text=True, capture_output=True, errors="replace", encoding="utf-8")
success = proc.returncode == 0
results.append(
{
Expand Down
12 changes: 6 additions & 6 deletions conda_build_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,15 @@ graphviz:
# Mitigation for
# https://github.com/RoboStack/ros-jazzy/pull/126#issuecomment-3515455380
libcap:
- 2.77
- 2.78
fmt:
- 12.1
lua:
- 5.4
tbb:
- '2022'
- '2023'
tbb_devel:
- '2022'
- '2023'

# Workaround for https://github.com/RoboStack/ros-jazzy/pull/40#issuecomment-2782226697
cmake:
Expand All @@ -60,7 +60,7 @@ c_compiler:
- vs2022 # [win]
c_compiler_version: # [unix]
- 14 # [linux]
- 18 # [osx]
- 19 # [osx]
c_stdlib:
- sysroot # [linux]
- macosx_deployment_target # [osx]
Expand All @@ -75,12 +75,12 @@ cxx_compiler:
- vs2022 # [win]
cxx_compiler_version: # [unix]
- 14 # [linux]
- 18 # [osx]
- 19 # [osx]

libzenohc:
- 1.9.0
libzenohcxx:
- 1.9.0

libhwloc:
- 2.12.2
- 2.13.0
65 changes: 57 additions & 8 deletions patch/dependencies.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,6 @@ rmf_visualization_schedule:
rmf_fleet_adapter:
add_host: ["eigen-abi-devel"]
remove_host: ["eigen"]
rmf_websocket:
add_host: ["asio", "websocketpp"]
add_run: ["asio", "websocketpp"]
behaviortree_cpp:
add_host: ["libboost-devel", "cppzmq", "zeromq", "sqlite"]
add_run: ["libboost"]
Expand Down Expand Up @@ -98,13 +95,26 @@ backward_ros:
add_host: ["${{ 'binutils' if linux }}", "${{ 'elfutils' if linux }}", "ros-lyrical-ament-cmake-libraries"]
nav2_smac_planner:
add_build: ["${{ 'llvm-openmp' if osx }}"]
add_host: ["${{ 'llvm-openmp' if osx }}", "ompl", "libode"]
# omplConfig.cmake exports Boost as a dependency.
add_host: ["${{ 'llvm-openmp' if osx }}", "ompl", "libode", "libboost-devel"]
nav2_map_server:
# rosdep does not resolve libuuid on macOS, though conda-forge provides it.
add_host: ["libuuid"]
add_run: ["libuuid"]
nav2_rviz_plugins:
# Qt 6 provides its StateMachine component through the qt6-scxml package.
add_host: ["qt6-scxml"]
add_run: ["qt6-scxml"]
nav2_route:
# Both dependencies are exported by nav2_routeConfig.cmake.
add_run: ["nanoflann", "nlohmann_json"]
nav2_util:
add_host: ["libboost-devel"]
# nav2_util exports angles from its CMake config, so downstream consumers
# need it in the runtime environment as well.
add_run: ["ros-lyrical-angles"]
nav2_constrained_smoother:
add_host: ["${{ 'openblas' if win }}", "ceres-solver * cpu*"]
nav2_mppi_controller:
add_build: ["${{ 'clang <19' if osx }}"]
ompl:
add_host: ["ompl"]
pybind11_json_vendor:
Expand Down Expand Up @@ -164,6 +174,21 @@ force_torque_sensor_broadcaster:
add_host: ["typeguard", "jinja2"]
ros_gz_sim:
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}", "ros-lyrical-gz-sensors-vendor"]
ament_cmake_ros:
# Break the test-only runtime cycle so a new mutex migration can bootstrap.
remove_run: ["ros-lyrical-rmw-test-fixture-implementation"]
cyclonedds:
# The posh CMake targets reference the iox-roudi executable shipped by the
# top-level iceoryx package, so the split devel packages alone are incomplete.
add_host: ["iceoryx", "libiceoryx-hoofs-devel", "libiceoryx-posh-devel"]
add_run: ["libiceoryx-hoofs", "libiceoryx-posh"]
remove_host: ["ros-lyrical-iceoryx-hoofs", "ros-lyrical-iceoryx-posh"]
remove_run: ["ros-lyrical-iceoryx-hoofs", "ros-lyrical-iceoryx-posh"]
rmw_cyclonedds_cpp:
add_host: ["libiceoryx-binding-c-devel"]
add_run: ["libiceoryx-binding-c"]
remove_host: ["ros-lyrical-iceoryx-binding-c"]
remove_run: ["ros-lyrical-iceoryx-binding-c"]
geometric_shapes:
add_host: ["libboost-devel", "octomap"]
ros_image_to_qimage:
Expand All @@ -172,7 +197,10 @@ rqt_image_overlay:
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}"]
slam_toolbox:
add_build: ["${{ 'qt6-main' if (build_platform != target_platform) }}"]
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}", "blas-devel", "ceres-solver * cpu*"]
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}", "blas-devel", "ceres-solver * cpu*", "qt6-main"]
add_run: ["qt6-main"]
remove_host: ["qt-main"]
remove_run: ["qt-main"]
vision_msgs_rviz_plugins:
add_build: ["${{ 'qt6-main' if (build_platform != target_platform) }}"]
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}"]
Expand Down Expand Up @@ -267,6 +295,17 @@ autoware_utils_pcl:
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}"]
autoware_utils_debug:
add_host: ["fmt"]
autoware_osqp_interface:
# Autoware 1.7 still uses the OSQP 0.x C API.
add_host: ["ros-lyrical-osqp-vendor ==0.2.0"]
add_run: ["ros-lyrical-osqp-vendor ==0.2.0"]
remove_host: ["ros-lyrical-osqp-vendor"]
remove_run: ["ros-lyrical-osqp-vendor"]
autoware_qp_interface:
add_host: ["ros-lyrical-osqp-vendor ==0.2.0"]
add_run: ["ros-lyrical-osqp-vendor ==0.2.0"]
remove_host: ["ros-lyrical-osqp-vendor"]
remove_run: ["ros-lyrical-osqp-vendor"]
autoware_trajectory:
add_host: ["fmt", "cpp-expected"]
autoware_behavior_velocity_planner:
Expand All @@ -275,6 +314,16 @@ autoware_behavior_velocity_planner_common:
add_host: ["cpp-expected"]
autoware_behavior_velocity_stop_line_module:
add_host: ["cpp-expected"]
rmf_task_sequence:
# The vendor package's ament config does not load the imported validator
# target. Make the conda-forge CMake package directly available.
add_host: ["json_schema_validator"]
add_run: ["json_schema_validator"]
rmw_implementation:
# These backends are only used by the disabled test suite. Keeping them all
# as host dependencies creates a bootstrap cycle during mutex migrations;
# the default Fast DDS backend is sufficient to configure the package.
remove_host: ["ros-lyrical-rmw-connextdds", "ros-lyrical-rmw-cyclonedds-cpp", "ros-lyrical-rmw-fastrtps-dynamic-cpp", "ros-lyrical-rmw-zenoh-cpp"]
rclpy:
add_host: ["typing_extensions"]
add_run: ["typing_extensions"]
Expand All @@ -296,7 +345,7 @@ grid_map_octomap:
add_host: ["octomap"]
add_run: ["octomap"]
py_trees:
add_host: ["poetry-core"]
add_host: ["hatchling"]
py_trees_js:
add_host: ["poetry-core"]
py_trees_ros:
Expand Down
26 changes: 0 additions & 26 deletions patch/ros-lyrical-chomp-motion-planner.patch

This file was deleted.

Loading
Loading