Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 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
9b34a25
Continue mutex migration build
wolfv Aug 24, 2026
9964d16
Continue build-24 dependency convergence
wolfv Aug 24, 2026
8493be0
Finish cached migration in two tolerant passes
wolfv Aug 24, 2026
a07b000
Checkpoint slow migration jobs within CI limit
wolfv Aug 25, 2026
784cd2c
Continue final build-24 convergence
wolfv Aug 25, 2026
31e3d61
Validate mature Windows checkpoint directly
wolfv Aug 25, 2026
f84cfe2
Reliably restore timeout artifacts
wolfv Aug 25, 2026
a7c7be1
Rename ros-lyrical-rosidl-generator-py.patch to ros-lyrical-rosidl-ge…
Tobias-Fischer Aug 30, 2026
571c4cd
Clean up outdated cache entries in testpr.yml
Tobias-Fischer Aug 30, 2026
57e98fd
Update cache deletion in testpr.yml workflow
Tobias-Fischer Aug 30, 2026
7eedf5d
Update github actions similar to what we have in rolling
mini-1235 Sep 2, 2026
525c4a0
Bump vinca and refresh snapshot
mini-1235 Sep 2, 2026
87977c0
Fix deprecated syntax in pixi
mini-1235 Sep 2, 2026
5e57a8b
Generate iceroyx and cyclonedds with run deps
mini-1235 Sep 2, 2026
b6c3a13
Update patches
mini-1235 Sep 2, 2026
3415d03
Rebuild without cache
mini-1235 Sep 2, 2026
5ece743
Try downgrading rattler build
mini-1235 Sep 2, 2026
22d3881
Remove patches that are already upstream
mini-1235 Sep 2, 2026
8e99a1f
Summarize build error
mini-1235 Sep 2, 2026
299fc27
Fix autoware qp and osqp
mini-1235 Sep 2, 2026
855444b
Fix nav2 dependencies
mini-1235 Sep 2, 2026
5588d3d
Restore rcutils patch
mini-1235 Sep 3, 2026
b6360a1
Apply vinca #146 and refresh snapshot
mini-1235 Sep 3, 2026
eaf35b2
Fix rmf traffic missing dependency
mini-1235 Sep 3, 2026
faaebd4
Bump libprotobuf
mini-1235 Sep 3, 2026
c9ca33a
Pin libgdal, theora, jsoncpp
mini-1235 Sep 3, 2026
f866e7b
Continue with cache
mini-1235 Sep 4, 2026
5bf62c4
Bump latest vinca
mini-1235 Sep 4, 2026
a15cfcc
Update moveit task constructor patch
mini-1235 Sep 4, 2026
1384bf8
Fix windows path issue and improve build summary
mini-1235 Sep 4, 2026
ff87ddf
Fix windows uuid issue in nav2 map server
mini-1235 Sep 5, 2026
bbfbd0e
Avoid Windows min max macros in nav2 map server
mini-1235 Sep 5, 2026
4cc2e8e
Fix -Wno-unknown-pragma on windows
mini-1235 Sep 5, 2026
a46725e
Bump zenoh to 1.10.0
mini-1235 Sep 7, 2026
5eeb70f
Cancel superseded PR workflow runs
mini-1235 Sep 7, 2026
568ed64
Fix moveit task constructor on windows
mini-1235 Sep 8, 2026
5593478
Link MoveIt Task Constructor with Winsock
mini-1235 Sep 8, 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
98 changes: 98 additions & 0 deletions .github/scripts/summarize_rattler_build.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
#!/usr/bin/env python3
"""Write a compact rattler-build diagnostic for the GitHub job summary."""

from __future__ import annotations

import argparse
import os
import re
from pathlib import Path


ANSI_ESCAPE = re.compile(r"\x1b(?:[@-_][0-?]*[ -/]*[@-~]|\][^\x07]*(?:\x07|\x1b\\))")
TIMESTAMP = re.compile(r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z\s*")
DIAGNOSTIC = re.compile(
r"(?:Error:\s+×|fatal error(?:\s+[A-Z]+\d+)?:|\berror(?:\s+[A-Z]+\d+)?:|"
r"CMake Error(?::|\s+at\b)|FAILED:|Patch application error|"
r"Failed to resolve dependencies|Cannot solve the request)",
re.IGNORECASE,
)
RECIPE_START = re.compile(r"Running build for recipe:|Build variant:")


def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser()
parser.add_argument("--log", type=Path, required=True)
parser.add_argument("--platform", required=True)
parser.add_argument("--outcome", required=True)
return parser.parse_args()


def clean(line: str) -> str:
cleaned = TIMESTAMP.sub("", ANSI_ESCAPE.sub("", line)).rstrip()
if len(cleaned) > 1_000:
return cleaned[:1_000] + " … [line truncated]"
return cleaned


def diagnostic_excerpt(lines: list[str]) -> list[str]:
matches = [index for index, line in enumerate(lines) if DIAGNOSTIC.search(line)]
if not matches:
return []

# Keep context around the last diagnostics. This includes multiline solver
# explanations without flooding the GitHub summary with the complete log.
selected: set[int] = set()
for index in matches[-20:]:
selected.update(range(max(0, index - 2), min(len(lines), index + 14)))

# Name the recipe that produced the final diagnostic even when dependency
# solver output has pushed its heading far outside the context window.
first_diagnostic = matches[max(0, len(matches) - 20)]
for index in range(first_diagnostic, -1, -1):
if RECIPE_START.search(lines[index]):
selected.add(index)
break

excerpt: list[str] = []
previous = -2
for index in sorted(selected):
if previous >= 0 and index > previous + 1:
excerpt.append("...")
excerpt.append(lines[index])
previous = index
return excerpt[-160:]


def main() -> None:
args = parse_args()
run_url = (
f"{os.environ.get('GITHUB_SERVER_URL', 'https://github.com')}/"
f"{os.environ.get('GITHUB_REPOSITORY', '')}/actions/runs/"
f"{os.environ.get('GITHUB_RUN_ID', '')}"
)
symbol = "✅" if args.outcome == "success" else "❌"

print(f"## {symbol} rattler-build: `{args.platform}`")
print()
print(f"Outcome: **{args.outcome}** · [Open workflow run]({run_url})")

if not args.log.is_file():
print("\nNo build log was produced.")
return

lines = [clean(line) for line in args.log.read_text(encoding="utf-8", errors="replace").splitlines()]
excerpt = diagnostic_excerpt(lines)
if not excerpt:
print("\nNo error diagnostics were found in the build log.")
return

print("\n### Final diagnostics\n")
print("```text")
print("\n".join(excerpt))
print("```")
print("\nThe complete `rattler-build.log` is available in this run's artifacts.")


if __name__ == "__main__":
main()
48 changes: 44 additions & 4 deletions .github/workflows/testpr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ on:
pull_request:
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

env:
ROS_VERSION: 2
PYTHONIOENCODING: utf-8
Expand Down Expand Up @@ -51,6 +55,9 @@ jobs:
run: |
# Workaround for problem related to long paths
echo "CONDA_BLD_PATH=C:\\bld\\" >> $GITHUB_ENV
# Keep rattler-build's package-specific directory but omit its timestamp
# suffix, which can push generated MSVC object paths over MAX_PATH.
echo "RATTLER_BUILD_EXTRA_ARGS=--no-build-id" >> $GITHUB_ENV
mkdir /c/bld

# Workaround for https://github.com/RoboStack/ros-humble/pull/141#issuecomment-1941919816
Expand All @@ -72,6 +79,11 @@ jobs:
rm -rf /c/Strawberry
rm -rf "/c/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/"

- name: Disable git auto-maintenance in source caches
shell: bash -l {0}
run: |
git config --global maintenance.auto false

- name: Generate recipes
shell: bash -l {0}
run: |
Expand Down Expand Up @@ -103,7 +115,9 @@ 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
# You can uncomment/modify the line below in case the cache for some packages becomes corrupted and needs to be regenerated.
# Make sure you don't merge these changes, though!
# rm -rf ${{ matrix.folder_cache }}/ros-lyrical-moveit-core* 2>/dev/null || true
mkdir -p ${{ matrix.folder_cache }}
pixi run rattler-index fs ${{ matrix.folder_cache }}/.. --force

Expand All @@ -113,9 +127,33 @@ jobs:
ls ${{ matrix.folder_cache }} || true

- name: Build recipes
id: build-recipes
shell: bash -l {0}
run: |
set +e
pixi run rattler-build build ${RATTLER_BUILD_EXTRA_ARGS:-} --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 2>&1 | tee rattler-build.log
build_status=${PIPESTATUS[0]}
echo "exit-code=${build_status}" >> "$GITHUB_OUTPUT"
exit "$build_status"

- name: Summarize build result
if: always()
shell: bash -l {0}
run: |
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
pixi run python .github/scripts/summarize_rattler_build.py \
--log rattler-build.log \
--platform "${{ matrix.platform }}" \
--outcome "${{ steps.build-recipes.outcome }}" \
>> "$GITHUB_STEP_SUMMARY"

- name: Upload build log
if: always()
uses: actions/upload-artifact@v6
with:
name: build-log-${{ matrix.platform }}-${{ github.run_id }}-${{ github.run_attempt }}
path: rattler-build.log
if-no-files-found: warn
retention-days: 7

- name: See packages that will be saved in cache
shell: bash -l {0}
Expand All @@ -125,7 +163,8 @@ jobs:

- name: Save build cache
uses: actions/cache/save@v5
if: always()
# Save partial output when the build fails or is cancelled by the job timeout; do not save when it was skipped.
if: ${{ always() && (steps.build-recipes.outcome == 'success' || steps.build-recipes.outcome == 'failure' || steps.build-recipes.outcome == 'cancelled') }}
with:
path: |
${{ matrix.folder_cache }}
Expand All @@ -137,7 +176,8 @@ jobs:
pixi run vinca-gha --platform ${{ matrix.platform }} --trigger-branch dummy_build_branch_as_it_is_unused -d ./recipes

- name: Upload build cache as artifact
if: ${{ always() && env.SAVE_CACHE_AS_ARTIFACT == 'true' }}
# Keep artifacts consistent with the cache: retain partial output from failed or cancelled builds, but not skipped builds.
if: ${{ always() && env.SAVE_CACHE_AS_ARTIFACT == 'true' && (steps.build-recipes.outcome == 'success' || steps.build-recipes.outcome == 'failure' || steps.build-recipes.outcome == 'cancelled') }}
uses: actions/upload-artifact@v6
with:
name: cache-${{ matrix.platform }}-${{ github.run_id }}
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
28 changes: 18 additions & 10 deletions conda_build_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ libboost_devel:
libboost_python_devel:
- '1.90'
libprotobuf:
- 6.33.5
- 7.35.1
protobuf:
- 6.33.5
- 7.35.1
spdlog:
- 1.17
pugixml:
Expand All @@ -25,18 +25,26 @@ libxml2:
- 2.14.*
graphviz:
- 14.*
libgdal:
- '3.13'
libgdal_core:
- '3.13'
# Mitigation for
# https://github.com/RoboStack/ros-jazzy/pull/126#issuecomment-3515455380
libcap:
- 2.77
- 2.78
libtheora:
- '1.2'
fmt:
- 12.1
lua:
- 5.4
tbb:
- '2022'
- '2023'
tbb_devel:
- '2022'
- '2023'
jsoncpp:
- 1.9.8

# Workaround for https://github.com/RoboStack/ros-jazzy/pull/40#issuecomment-2782226697
cmake:
Expand All @@ -60,7 +68,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 +83,12 @@ cxx_compiler:
- vs2022 # [win]
cxx_compiler_version: # [unix]
- 14 # [linux]
- 18 # [osx]
- 19 # [osx]

libzenohc:
- 1.9.0
- 1.10.0
libzenohcxx:
- 1.9.0
- 1.10.0

libhwloc:
- 2.12.2
- 2.13.0
37 changes: 27 additions & 10 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,14 @@ 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"]
nav2_util:
add_host: ["libboost-devel"]
# omplConfig.cmake exports Boost as a dependency.
add_host: ["${{ 'llvm-openmp' if osx }}", "ompl", "libode", "libboost-devel"]
nav2_rviz_plugins:
# Qt 6 provides its StateMachine component through the qt6-scxml package.
add_host: ["qt6-scxml"]
add_run: ["qt6-scxml"]
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,15 +162,24 @@ 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"]
geometric_shapes:
add_host: ["libboost-devel", "octomap"]
rmf_traffic:
add_host: ["octomap"]
add_run: ["octomap"]
ros_image_to_qimage:
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}"]
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 @@ -275,6 +282,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 +313,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
Loading