Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
b214ac9
docs: define cross-distribution sync workflow
Tobias-Fischer Aug 27, 2026
428cdcd
ci: harden shared source and build caches
Tobias-Fischer Aug 27, 2026
2be97a2
build: identify the platform in gap reports
Tobias-Fischer Aug 27, 2026
4c436b5
build: add canonical configuration sorting
Tobias-Fischer Aug 27, 2026
4154572
vinca: sync released package seeds
Tobias-Fischer Aug 28, 2026
3084538
merge: bring in jazzy main (remove anaconda-client, vinca→conda dep)
Tobias-Fischer Sep 1, 2026
1960fce
sync: cross-distro workflow and config unification
Tobias-Fischer Sep 1, 2026
067f3c3
fix: regenerate jazzy pixi.lock after clean env reinstall
Tobias-Fischer Sep 2, 2026
0ca6198
fix: update jazzy patches and pixi.lock refresh
Tobias-Fischer Sep 3, 2026
be005be
fix: build cache never saved (undefined step id reference)
Tobias-Fischer Sep 4, 2026
0ef312f
fix: OpenCV5/CMake4/Eigen3/Boost parity fixes and humble sync for jaz…
Tobias-Fischer Sep 4, 2026
a73d9b3
merge: bring in main
Tobias-Fischer Sep 4, 2026
904749d
fix: bump ros2-distro-mutex version to force republish with new run_c…
Tobias-Fischer Sep 4, 2026
16eeb40
fix: cancel superseded testpr.yml runs (mirrors humble)
Tobias-Fischer Sep 4, 2026
3dc6b32
fix: force republish of ros2cli/rosidl_cli, stale-pinned to old distr…
Tobias-Fischer Sep 4, 2026
ddbda94
fix: cache-bust ros2-ros-workspace, stale-pinned to old distro-mutex
Tobias-Fischer Sep 4, 2026
777aa50
fix: ament_cmake_python install(CODE) breaks on win-64 paths starting…
Tobias-Fischer Sep 4, 2026
71ff3ad
fix: cache-bust ros2-ament-package too, same stale distro-mutex pin
Tobias-Fischer Sep 4, 2026
595dd90
fix: bump global build_number 22->23 to force full republish after mu…
Tobias-Fischer Sep 4, 2026
b53f5e7
fix: depth_image_proc — OpenCV5 removed CV_THRESH_TOZERO_INV macro
Tobias-Fischer Sep 4, 2026
92d79c0
fix: stereo_image_proc — OpenCV5 dropped nested calib3d.hpp header
Tobias-Fischer Sep 4, 2026
dc84ee2
fix: mcap_vendor missing cstdint + cache-bust corrupt sensor_msgs
Tobias-Fischer Sep 5, 2026
40218c9
fix: depthai — CMake4 floor (same fixes already landed on humble)
Tobias-Fischer Sep 5, 2026
9bc840a
fix: depthai_bridge — port humble's OpenCV5 fixes (identical source)
Tobias-Fischer Sep 5, 2026
9135b15
fix: depthai_examples — port humble's OpenCV version-pin fix (identic…
Tobias-Fischer Sep 5, 2026
7b3c44c
fix: cache-bust corrupt ros2-rcl-interfaces (win-64)
Tobias-Fischer Sep 5, 2026
a955a62
fix: proxsuite — depend on conda-forge package instead of building fr…
Tobias-Fischer Sep 5, 2026
85e59bb
fix: cache-bust corrupt ros2-control-msgs (win-64)
Tobias-Fischer Sep 5, 2026
be5e7c3
fix: libg2o — drop unnecessary Qt5 host dep, fix win-64 DLL export
Tobias-Fischer Sep 5, 2026
6bf0b5d
fix: cache-bust ros2-libg2o (stale qt5 run-dep conflicts with pcl's q…
Tobias-Fischer Sep 5, 2026
79d6781
fix: apriltag_ros — OpenCV5 split calib3d into calib+geometry
Tobias-Fischer Sep 5, 2026
4eefa82
fix: exclude automatika_embodied_agents from win-64 builds
Tobias-Fischer Sep 5, 2026
6affb0b
fix: cache-bust ros2-cartographer (stale lua pin conflicts with curre…
Tobias-Fischer Sep 5, 2026
62d8c91
fix: cartographer — pin lua to avoid conflict with conda-forge's own …
Tobias-Fischer Sep 5, 2026
a482361
fix: add --channel-priority disabled to rattler-build build
Tobias-Fischer Sep 5, 2026
e6811e4
fix: cache-bust corrupt ros2-composition-interfaces (win-64)
Tobias-Fischer Sep 5, 2026
3d00dbc
fix: bump coal dummy-package pin to 3.0.4 for pinocchio 4.1.0 compat
Tobias-Fischer Sep 5, 2026
6f63583
fix: patch ros2-orbbec-camera for OpenCV5 Mat_<> comma-init deprecation
Tobias-Fischer Sep 5, 2026
f0c10c2
fix: port sick_scan_xd msgpack11.hpp cstdint fix from humble
Tobias-Fischer Sep 5, 2026
5394c61
fix: autoware_lanelet2_extension — guard GCC-only flag from MSVC
Tobias-Fischer Sep 5, 2026
8188b46
fix: autoware_interpolation — add missing <string> include (win-64)
Tobias-Fischer Sep 5, 2026
3dfa29a
fix: behaviortree_cpp_v3 — add missing ZMQ include dirs for bt3_recor…
Tobias-Fischer Sep 5, 2026
55de049
fix: behaviortree_cpp_v3 — disable BUILD_UNIT_TESTS (win-64)
Tobias-Fischer Sep 5, 2026
cd1a75f
fix: cartographer_ros — add /bigobj for win-64 (node.cpp section limit)
Tobias-Fischer Sep 5, 2026
50100c6
fix: robot_localization — add /bigobj for win-64 (ros_filter.cpp sect…
Tobias-Fischer Sep 5, 2026
1d96e3a
fix: rviz_ogre_vendor — add CMAKE_POLICY_VERSION_MINIMUM for freetype…
Tobias-Fischer Sep 5, 2026
fb7ddbb
fix: clearpath_diagnostics — add /bigobj for win-64, fix patch format
Tobias-Fischer Sep 6, 2026
55f3909
ci: add compact build-log summary + artifact upload
Tobias-Fischer Sep 6, 2026
db43775
fix: sick_scan_xd's osx.patch was silently orphaned (wrong name prefix)
Tobias-Fischer Sep 6, 2026
881d36f
fix: ros_gz_bridge — replace WINDOWS_EXPORT_ALL_SYMBOLS with explicit…
Tobias-Fischer Sep 6, 2026
aa7eb95
docs+ci: clarify vinca's 3 exclusion mechanisms, add orphaned-patch c…
Tobias-Fischer Sep 6, 2026
45afb98
docs+ci: add orphaned-patch check script and vinca.yaml exclusion docs
Tobias-Fischer Sep 6, 2026
70c52ec
fix: libpointmatcher win-64 build — boost::timer removed in Boost 1.90
Tobias-Fischer Sep 6, 2026
950a24f
fix: libpointmatcher win-64 build — MSVC OpenMP requires signed loop …
Tobias-Fischer Sep 6, 2026
37393b9
fix: ros_gz_bridge win-64 CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS cache-defa…
Tobias-Fischer Sep 6, 2026
b71d63b
fix: persist_parameter_server win-64 __PRETTY_FUNCTION__ MSVC incompa…
Tobias-Fischer Sep 7, 2026
fc17737
fix: exclude rosbag2_performance_benchmarking from win-64
Tobias-Fischer Sep 7, 2026
76bf93d
fix: rtabmap win-64 -- libdc1394 has no conda-forge build
Tobias-Fischer Sep 7, 2026
0438d75
fix: rtabmap win-64 -- CoInitialize undeclared (missing objbase.h)
Tobias-Fischer Sep 7, 2026
f98bba4
fix: sick_safetyscanners_base win-64 -- dead timeval-taking overload
Tobias-Fischer Sep 7, 2026
1082e90
fix: system_modes win-64 -- mode.lib missing (no exported symbols)
Tobias-Fischer Sep 7, 2026
41610dc
fix: ros2-visp win-64 build — zbar has no win-64 conda-forge build
Tobias-Fischer Sep 7, 2026
773cc46
docs+ci: trim longwinded comments and stale temporary cache-bust entries
Tobias-Fischer Sep 7, 2026
7b82476
fix: unvendor cyclonedds and iceoryx, depend on conda-forge instead
Tobias-Fischer Sep 7, 2026
c6236bb
fix: cyclonedds 0.10.5 is actually available on win-64, unvendor ther…
Tobias-Fischer Sep 7, 2026
d6c4839
fix: win-64 long-path fixes; remove duplicate Check-sorting step
Tobias-Fischer Sep 9, 2026
c899024
fix: pin sip < 6.16, fixing the live win-64-adjacent CI failure
Tobias-Fischer Sep 9, 2026
93699b8
Merge origin/main: RoboPlan, rclpy_message_converter, mobile_robot_si…
Tobias-Fischer Sep 9, 2026
eac4cbd
fix: pin sip directly on qt_gui_cpp/python_qt_binding (real fix this …
Tobias-Fischer Sep 9, 2026
0fe0965
refactor: consolidate three duplicate 'if: linux' blocks into one
Tobias-Fischer Sep 9, 2026
5b7e777
fix: unpin sip on python_qt_binding, it conflicts with real PyQt5
Tobias-Fischer Sep 10, 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()
84 changes: 78 additions & 6 deletions .github/workflows/testpr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@ on:
pull_request:
workflow_dispatch:

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

permissions:
actions: read
contents: read

env:
ROS_VERSION: 2
# Change to 'true' to enable the cache upload as artifacts
Expand Down Expand Up @@ -42,6 +50,7 @@ jobs:
- uses: prefix-dev/setup-pixi@v0.10.2
with:
frozen: true
pixi-version: v0.75.0

- name: Check sorting
if: matrix.platform == 'linux-64'
Expand All @@ -57,6 +66,19 @@ jobs:
echo "CONDA_BLD_PATH=C:\\bld\\" >> $GITHUB_ENV
mkdir /c/bld

- name: Enable Windows long path support
if: matrix.platform == 'win-64'
shell: pwsh
run: |
# MSVC/MSBuild (VS 2019 16.0+, which windows-2022's toolset is well past)
# honor the Win32 long-path opt-in via this registry key. Without it,
# cl.exe can fail with a cryptic "fatal error C1083: Cannot open
# compiler generated file: ''" once a target's generated intermediate
# (.obj/.tlog) path exceeds the legacy 260-char MAX_PATH, which is easy
# to hit given how deeply nested and long rosidl-generated target names
# can get even under the shortened C:\bld\ prefix above.
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force

# Workaround for https://github.com/RoboStack/ros-humble/pull/141#issuecomment-1941919816
- name: Clean up PATH
if: contains(matrix.os, 'windows')
Expand Down Expand Up @@ -85,8 +107,20 @@ 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

- name: Check patches
shell: bash -l {0}
Expand Down Expand Up @@ -114,9 +148,10 @@ jobs:
shell: bash -l {0}
run: |
# rm -rf ${{ matrix.folder_cache }}/ros-jazzy-mrt-cmake-modules* || true
mkdir -p ${{ matrix.folder_cache }}
rm -rf ${{ matrix.folder_cache }}/ros2-python-qt-binding* || true
rm -rf ${{ matrix.folder_cache }}/ros2-qt-gui-cpp* || true
pixi run rattler-index fs ${CONDA_BLD_PATH:-output} --force
pixi run rattler-index fs ${{ matrix.folder_cache }}/.. --force
exit 0

- name: See packages restored by cache
Expand All @@ -125,9 +160,44 @@ jobs:
ls ${{ matrix.folder_cache }} || true

- name: Build recipes
id: build-recipes
shell: bash -l {0}
run: |
set +e
EXTRA_BUILD_ARGS=""
if [ "${{ matrix.platform }}" == "win-64" ]; then
# Drop the timestamp suffix from the per-package build work dir
# (rattler-build_<name>_<timestamp> -> rattler-build_<name>) to claw
# back headroom under Windows' MAX_PATH for long package names, e.g.
# rosbag2_performance_benchmarking_msgs's generated rosidl Python
# typesupport targets (see error C1083 "Cannot open compiler
# generated file: ''").
EXTRA_BUILD_ARGS="--no-build-id"
fi
# --channel-priority disabled: resolvo would otherwise refuse a just-built local package once any other-channel build of the same name exists.
pixi run rattler-build build --recipe-dir recipes --target-platform ${{ matrix.platform }} -m ./conda_build_config.yaml -c conda-forge -c robostack-jazzy --skip-existing --channel-priority disabled $EXTRA_BUILD_ARGS 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 conda-forge -c robostack-jazzy --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 @@ -137,7 +207,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 @@ -149,7 +220,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
Loading
Loading