Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 2 additions & 1 deletion .github/ISSUE_TEMPLATE/3_robostack_bot.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,15 @@ body:
| `dependency-report` | maintainers | Check the dependencies against the pins and update the distribution's dependency-report issue (closed when nothing conflicts). Runs weekly. |
| `update-build-timings` | maintainers | Record the build times of the last week's build-branch runs in `shared/build_timings/`, which the build workflows use to pack each stage's recipes into jobs by time. Runs weekly. |
| `update-pixi` | maintainers | Upgrade the tooling's dependencies in `pixi.toml` / `pixi.lock` to their newest versions (`pixi upgrade`; not Python or the capped ones) and check. The PR lists the changes. Runs monthly. |
| `sync-pixi-mappings` | maintainers | Copy the rosdep mappings (`robostack.yaml`) to pixi-build-ros and open or update a PR on prefix-dev/pixi. Runs daily. |

On a pull request, `@robostack-bot rebuild-dependents` (maintainers) commits the rebuilds its ABI check suggests to the pull request's branch.
- type: dropdown
id: command
attributes:
label: Command
options: [add-package, update-rosdistro-snapshot, find-stale-packages, update-conda-forge-pinning, rebuild, update-vinca,
dependency-report, update-build-timings, update-pixi]
dependency-report, update-build-timings, update-pixi, sync-pixi-mappings]
validations:
required: true
- type: input
Expand Down
45 changes: 38 additions & 7 deletions .github/workflows/bot.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,18 @@
# nothing conflicts; and a PR with the build times the week's build-branch runs
# recorded (shared/build_timings/, for packing the build jobs by time).
# - monthly (the 1st): a PR upgrading the tooling's pixi dependencies (pixi.toml / pixi.lock).
# - daily, when vars.PIXI_FORK is set: a PR on prefix-dev/pixi copying the rosdep mappings
# (shared/ and distros/*/robostack.yaml) to pixi-build-ros, so that `pixi build` of ROS
# packages maps rosdep keys as RoboStack does. It is pushed to the fork vars.PIXI_FORK
# (<owner>/pixi) with secrets.PIXI_SYNC_TOKEN, a token of that fork's owner: the bot's
# GitHub App can't open PRs on prefix-dev/pixi.
# - on demand (owners, members and collaborators):
# Actions > robostack-bot > Run workflow, an issue from the "robostack-bot command"
# template, or a comment: @robostack-bot <command> [<distro>]
# commands: update-rosdistro-snapshot [<distro>...|all] | find-stale-packages [<distro>...|all] |
# update-conda-forge-pinning [<distro>...|all] | add-package <pkg>... [<distro>...] |
# rebuild <pkg>... [<distro>...|all] [--with-dependents] | update-vinca [<ref>] |
# dependency-report [<distro>...|all] | update-build-timings | update-pixi |
# dependency-report [<distro>...|all] | update-build-timings | update-pixi | sync-pixi-mappings |
# rebuild-dependents (a comment on a pull request: commits the rebuilds its ABI
# check suggests to its branch; not possible for pull requests from forks)
# - package requests (the "Package request" issue form or `@robostack-bot add-package`,
Expand All @@ -38,7 +43,7 @@ on:
command:
type: choice
options: [add-package, update-rosdistro-snapshot, find-stale-packages, update-conda-forge-pinning, rebuild,
update-vinca, dependency-report, update-build-timings, update-pixi]
update-vinca, dependency-report, update-build-timings, update-pixi, sync-pixi-mappings]
distro:
description: Distribution (for the per-distribution commands; empty = all)
required: false
Expand Down Expand Up @@ -89,6 +94,7 @@ jobs:
ASSOCIATION: ${{ github.event.comment.author_association || github.event.issue.author_association }}
PULL_REQUEST: ${{ github.event.issue.pull_request && github.event.issue.number || '' }}
SCHEDULE: ${{ github.event.schedule }}
PIXI_FORK: ${{ vars.PIXI_FORK }}
run: |
case "$EVENT" in
schedule)
Expand All @@ -104,8 +110,9 @@ jobs:
exit 0
fi
# rosdistro syncs, and the conda-forge pinning: one job for all distributions
# (they share it; one with its own pinning is updated in the same pull request)
jobs=$(pixi run -q rs rosdistro-syncs | python3 -c 'import json,sys; print(json.dumps(json.load(sys.stdin) + [{"command":"update-conda-forge-pinning","distro":"","args":"","preview":False}]))') ;;
# (they share it; one with its own pinning is updated in the same pull request);
# the rosdep mappings for pixi-build-ros, once a pixi fork is set up
jobs=$(pixi run -q rs rosdistro-syncs | python3 -c 'import json,os,sys; print(json.dumps(json.load(sys.stdin) + [{"command":"update-conda-forge-pinning","distro":"","args":"","preview":False}] + ([{"command":"sync-pixi-mappings","distro":"","args":"","preview":False}] if os.environ.get("PIXI_FORK") else [])))') ;;
workflow_dispatch) # only people with write access can dispatch
jobs=$(ROBOSTACK_BOT_BODY="@robostack-bot $COMMAND $PACKAGES $DISTRO" ROBOSTACK_BOT_ASSOCIATION=OWNER pixi run -q rs parse-command) ;;
*)
Expand Down Expand Up @@ -146,6 +153,13 @@ jobs:
locked: true # the lock file must match pixi.toml
pixi-version: v0.81.0
cache-write: false # saved from main only (pixi-cache.yaml)
- name: Check out prefix-dev/pixi
if: matrix.command == 'sync-pixi-mappings'
uses: actions/checkout@v6
with:
repository: prefix-dev/pixi
path: _pixi
persist-credentials: false
- name: robostack-bot ${{ matrix.command }} ${{ matrix.distro }}
id: bot
env:
Expand Down Expand Up @@ -178,6 +192,8 @@ jobs:
# shellcheck disable=SC2046 # the --exclude arguments, one word each
pixi upgrade --json $(pixi run -q rs update-pixi --excludes) > "$RUNNER_TEMP/pixi-upgrade.json" &&
pixi run rs update-pixi --changes "$RUNNER_TEMP/pixi-upgrade.json" --summary "$RUNNER_TEMP/summary.md" ;;
# writes pixi-build-ros's copies of the mappings into the pixi checkout
sync-pixi-mappings) pixi run rs sync-pixi-mappings _pixi --summary "$RUNNER_TEMP/summary.md" ;;
# creates / updates the distribution's dependency-report issue
dependency-report) pixi run rs "$DISTRO" dependency-report --summary "$RUNNER_TEMP/summary.md" ;;
esac
Expand All @@ -192,7 +208,9 @@ jobs:
printf '\nCloses #%s\n' "$NUMBER" >> "$RUNNER_TEMP/summary.md"
- name: Open or update the pull request
id: pr
if: steps.bot.outputs.changed == 'true' && !matrix.preview && matrix.command != 'rebuild-dependents'
if: >-
steps.bot.outputs.changed == 'true' && !matrix.preview &&
matrix.command != 'rebuild-dependents' && matrix.command != 'sync-pixi-mappings'
uses: peter-evans/create-pull-request@v8
with:
token: ${{ steps.app.outputs.token || secrets.GHA_PAT || github.token }}
Expand All @@ -206,14 +224,27 @@ jobs:
labels: |
robostack-bot
${{ steps.bot.outputs.labels }}
- name: Open or update the pull request on prefix-dev/pixi
id: pixi_pr
if: steps.bot.outputs.changed == 'true' && matrix.command == 'sync-pixi-mappings'
uses: peter-evans/create-pull-request@v8
with:
path: _pixi
token: ${{ secrets.PIXI_SYNC_TOKEN }}
push-to-fork: ${{ vars.PIXI_FORK }}
branch: robostack-bot/sync-mappings
delete-branch: true
commit-message: "chore(pixi-build-ros): update RoboStack's rosdep mappings"
title: "chore(pixi-build-ros): update RoboStack's rosdep mappings"
body-path: ${{ runner.temp }}/summary.md
- name: Reply on the issue / pull request
if: always() && (github.event_name == 'issue_comment' || github.event_name == 'issues')
env:
GH_TOKEN: ${{ github.token }}
NUMBER: ${{ github.event.issue.number }}
TITLE: ${{ steps.bot.outputs.title || 'failed' }}
PR_URL: ${{ steps.pr.outputs.pull-request-url }}
PR_OPERATION: ${{ steps.pr.outputs.pull-request-operation }}
PR_URL: ${{ steps.pr.outputs.pull-request-url || steps.pixi_pr.outputs.pull-request-url }}
PR_OPERATION: ${{ steps.pr.outputs.pull-request-operation || steps.pixi_pr.outputs.pull-request-operation }}
run: |
{
echo "**robostack-bot ${{ matrix.command }} ${{ matrix.distro }}**: $TITLE"
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ shared/ the same for every distribution
pkg_additional_info.yaml per-package settings that are the same everywhere
patch/dependencies.yaml dependency fixes that are the same everywhere
robostack.yaml rosdep key -> conda package mapping (`robostack: []` drops a key)
(also copied to pixi-build-ros: robostack-bot sync-pixi-mappings)
pinning/ conda-forge pinning version, migrations and overrides
tests/ package tests (ros2-<pkg>.yaml; `if: ros_distro ...` for distro-specific bits)
tools/robostack.py `pixi run rs ...`: every task, for one distribution or the repository
Expand Down Expand Up @@ -152,6 +153,7 @@ waiting for the macOS runners; remove them for a full build before merging.
| `dependency-report [<distro>... \| all]` | maintainers | Runs the dependency check (`check-deps`, linux-64) and keeps one issue per distribution, *`<distro>`: dependency report* (label `dependency-report`), up to date with the conflicts, notes and conda-forge migration status; the issue is closed when nothing conflicts. Runs weekly (Mondays). |
| `update-build-timings` | maintainers | Merges the build times the last week's build-branch runs recorded (`rs <distro> build-ci`, kept as each job's artifact) into `shared/build_timings/<platform>.json` and opens a PR. The build workflows pack each stage's recipes into jobs by these times. Runs weekly (Mondays). Labelled `build:none` (see below). |
| `update-pixi` | maintainers | Runs `pixi upgrade`: the newest versions of the tooling's dependencies in `pixi.toml` and `pixi.lock` (rattler-build, rattler-index, gh, pytest, ...), except Python (moved by hand) and requirements that are only an upper bound (`cmake = "<4.0"`: capped on purpose); the vinca pin is `update-vinca`'s. Runs `rs check`; the PR lists the changes as a table (pixi-diff-to-markdown). Runs monthly (on the 1st). Labelled `build:none` (see below). |
| `sync-pixi-mappings` | maintainers | Copies the rosdep mappings (`shared/robostack.yaml`, and each `distros/<distro>/robostack.yaml` over it) to pixi-build-ros (`crates/pixi_build_ros/robostack.yaml` and `robostack_distros.yaml` in prefix-dev/pixi) and opens or updates a PR there, listing the added, removed and changed keys: `pixi build` of ROS packages then maps rosdep keys as RoboStack does. Mappings are only changed here. Runs daily once `vars.PIXI_FORK` (the fork the PR is pushed to) and `secrets.PIXI_SYNC_TOKEN` (a token of that fork's owner) are set. |

The PRs of `update-vinca`, `update-build-timings` and `update-pixi` don't change packages directly, but touch files outside `distros/`, which would build every distribution: they are labelled `build:none`, so only the checks run (and nothing is built while a build is under way). To build one, remove the label, or replace it with `build:<distro>` labels.

Expand Down
2 changes: 2 additions & 0 deletions distros/humble/pkg_additional_info.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ ament_cmake_gtest: # uses conda-forge's gtest instead of gtest_vendor's sources
build_number: 23
aruco_ros: # its recipe test stops the node for sure (package tests hung on macOS)
build_number: 23
plotjuggler:
build_number: 24
rtabmap_slam: # its recipe test stops the node for sure (package tests hung on macOS)
build_number: 23
spatio_temporal_voxel_layer:
Expand Down
2 changes: 2 additions & 0 deletions distros/jazzy/pkg_additional_info.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ nav2_rviz_plugins:
build_number: 28
octomap_rviz_plugins:
build_number: 28
plotjuggler:
build_number: 30
rtabmap_slam: # its recipe test stops the node for sure (package tests hung on macOS)
build_number: 28
rviz_2d_overlay_plugins:
Expand Down
72 changes: 72 additions & 0 deletions distros/kilted/robostack.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# kilted: its own rosdep mappings, over shared/robostack.yaml:
# Qt 5 (kilted's rviz and rqt need Qt5 / PyQt5), and the xtensor its packages were built
# with. kilted (EOL) isn't built here (no vinca.yaml); this is for pixi-build-ros
# (robostack-bot sync-pixi-mappings).
libqt5-core:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-gui:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-opengl:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-opengl-dev:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-svg:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-svg-dev:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-websockets-dev:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-widgets:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5x11extras5-dev:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
python-qt5-bindings:
robostack: [pyqt, pyqt-builder]
python3-qt5-bindings:
robostack: [pyqt, pyqt-builder]
python3-qt5-bindings-gl:
robostack: [pyqt, pyqt-builder]
qt5-image-formats-plugins:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
qt5-qmake:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
qtbase5-dev:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
xtensor:
robostack: [xtensor ==0.24.7]
6 changes: 6 additions & 0 deletions distros/lyrical/pkg_additional_info.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -127,12 +127,18 @@ gz_sim_vendor:
build_number: 33
gz_transport_vendor:
build_number: 33
launch:
build_number: 34
moveit_ros_visualization:
build_number: 31
moveit_task_constructor_visualization:
build_number: 31
nav2_common:
build_number: 34
nav2_rviz_plugins:
build_number: 31
plotjuggler:
build_number: 34
rtabmap_rviz_plugins:
build_number: 31
rtabmap_slam: # its recipe test stops the node for sure (package tests hung on macOS)
Expand Down
71 changes: 71 additions & 0 deletions distros/noetic/robostack.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# noetic: its own rosdep mappings, over shared/robostack.yaml:
# Qt 5, and the xtensor its packages were built with. noetic isn't built here (no
# vinca.yaml); this is for pixi-build-ros (robostack-bot sync-pixi-mappings).
libqt5-core:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-gui:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-opengl:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-opengl-dev:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-svg:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-svg-dev:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-websockets-dev:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-widgets:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5x11extras5-dev:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
python-qt5-bindings:
robostack: [pyqt, pyqt-builder]
python3-qt5-bindings:
robostack: [pyqt, pyqt-builder]
python3-qt5-bindings-gl:
robostack: [pyqt, pyqt-builder]
qt5-image-formats-plugins:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
qt5-qmake:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
qtbase5-dev:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
xtensor:
robostack: [xtensor ==0.24.7]
8 changes: 8 additions & 0 deletions distros/rolling/pkg_additional_info.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,18 @@ aruco_ros: # its recipe test stops the node for sure (package tests hung on mac
build_number: 33
fuse_viz:
build_number: 33
launch:
build_number: 35
moveit_ros_visualization:
build_number: 33
moveit_task_constructor_visualization:
build_number: 33
nav2_common:
build_number: 35
orbbec_camera:
build_number: 35
plotjuggler:
build_number: 35
rviz_2d_overlay_plugins:
build_number: 33
rviz_common:
Expand Down
4 changes: 2 additions & 2 deletions pixi.toml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ vinca = { git = "https://github.com/RoboStack/vinca.git", rev = "74d1e856d5b00c0

[tasks]
rs = { cmd = "python tools/robostack.py", description = "Run a task for one distribution: `pixi run rs <distro> <task>` (generate-recipes, build, build-one, check-patches, check-deps, create-snapshot, render-pinning, sort, ...)." }
sort = { cmd = "sh -lc 'vinca-sort-vinca-lists $@ shared/vinca.yaml && vinca-sort-yaml-keys $@ shared/robostack.yaml shared/pkg_additional_info.yaml shared/patch/dependencies.yaml && for d in distros/*/; do (cd $d && vinca-sort-vinca-lists $@ vinca.yaml && vinca-sort-yaml-keys $@ pkg_additional_info.yaml rosdistro_additional_recipes.yaml $(ls patch/dependencies.yaml 2>/dev/null)) || exit 1; done' --", description = "Sort the YAML files of all distributions (`--check` to only check)." }
sort = { cmd = "sh -lc 'vinca-sort-vinca-lists $@ shared/vinca.yaml && vinca-sort-yaml-keys $@ shared/robostack.yaml shared/pkg_additional_info.yaml shared/patch/dependencies.yaml && for d in distros/*/; do [ -f $d/vinca.yaml ] || continue; (cd $d && vinca-sort-vinca-lists $@ vinca.yaml && vinca-sort-yaml-keys $@ pkg_additional_info.yaml rosdistro_additional_recipes.yaml $(ls patch/dependencies.yaml 2>/dev/null)) || exit 1; done' --", description = "Sort the YAML files of all distributions (`--check` to only check)." }
test = { cmd = "python -m pytest tools/tests", description = "Unit tests of the repository tooling (tools/tests)." }
abi-check = { cmd = "pixi exec -s python=3.14 -s zstandard -s pyyaml -s pyelftools python tools/abi_check.py", description = "Compare the ABI of package builds with libabigail (Linux only): `pixi run abi-check --distro jazzy --latest-pairs 30`, `--old a.conda --new b.conda`, or `--pr-builds <dir>` (a pull request's builds against the released ones)." }
render-pinning = { cmd = "sh -lc 'for d in distros/*/; do python tools/robostack.py $(basename $d) render-pinning || exit 1; done'", description = "Regenerate every distribution's conda_build_config.yaml from shared/pinning and its distro.yaml." }
render-pinning = { cmd = "sh -lc 'for d in distros/*/; do [ -f $d/vinca.yaml ] || continue; python tools/robostack.py $(basename $d) render-pinning || exit 1; done'", description = "Regenerate every distribution's conda_build_config.yaml from shared/pinning and its distro.yaml." }
Loading
Loading