Skip to content
Merged
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
36 changes: 32 additions & 4 deletions .claude/skills/robostack-versions/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ description: Update ROS package versions (rosdistro snapshot) and conda-forge pi

robostack-bot does the routine part: `update-rosdistro-snapshot` (daily, when a new
rosdistro sync is tagged) and
`update-conda-forge-pinning` (weekly, or on request) open PRs that already contain the
bumps below. Do it by hand when the bot fails or something extra is needed.
`update-conda-forge-pinning` (daily, when the pinning version or the usable migrations
change, or on request) open PRs that already contain the bumps below. Do it by hand when the bot fails or something extra is needed.

## What is pinned where

Expand Down Expand Up @@ -50,7 +50,8 @@ pixi run rs <d> create-snapshot
## Update the conda-forge pinning

```bash
pixi run rs update-pinning # = bot command, for all distributions that follow shared/
pixi run rs <d> update-pinning # = bot command: latest pinning + rebuild plan for <d>
pixi run rs update-pinning # the same for every distribution
pixi run rs <d> render-pinning # after editing shared/pinning or distro.yaml
pixi run rs <d> check-deps # solve all non-ROS deps + mutex constraints, nothing built
```
Expand All @@ -65,9 +66,36 @@ pixi run rs <d> check-deps # solve all non-ROS deps + mutex constraints
Exit code 1 means something conflicts. Status of migrations:
https://conda-forge.org/status/.

`check-deps` takes the requirements of every selected package from vinca (`--source
recipes` uses `recipes/` instead, which with skip-existing only holds unbuilt packages).

### What the pinning PR rebuilds

`update-pinning` moves the distribution's pinning (its own `distro.yaml` version, or
the shared one it follows) forward and compares the old and new
`conda_build_config.yaml` with `vinca-rebuild-plan`: packages with a changed pin among their build or
host requirements, plus everything that depends on them (host or run, transitively),
are rebuilt; the rest keep their published builds.

- **Partial rebuild** (the usual case): those packages get `build_number` = highest
released build + 1 in `distros/<d>/pkg_additional_info.yaml`, and when the mutex
`run_constraints` changed, the mutex gets a new build at the same version
(`mutex_package.build_number`), so all other published packages stay installable.
- **Full rebuild** (more than half of the packages affected): the bump below.

The PR lists the packages and why, the migrations used / waiting for our dependencies'
feedstocks, and a linux-64 `check-deps` result; it is labelled `dependency-conflict`
when the new pins can't be installed together.

```bash
pixi run vinca-rebuild-plan --old <old cbc> --new distros/<d>/conda_build_config.yaml \
--vinca-dir distros/<d>/work # the plan by hand (after `rs <d> prepare`)
```

## Rebuild bump (full rebuild)

When the snapshot or the pins change, everything is rebuilt:
When the snapshot changes (or a pinning change affects most packages), everything is
rebuilt:

1. `build_number` in `distros/<d>/vinca.yaml` = the highest build number of the
distribution's released packages + 1, so every package gets a new build.
Expand Down
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/3_robostack_bot.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ body:
| `add-package` | anyone | Add ROS packages to the shared package selection (built by every distribution that has them); the PR lists what will be built. A maintainer reviews and merges it. |
| `update-rosdistro-snapshot` | maintainers | Refresh `rosdistro_snapshot.yaml` to the latest rosdistro sync (master for rolling) and bump the build number (highest released + 1, per-package build numbers removed) and mutex: a full rebuild. The PR lists the version bumps. Runs daily when a new sync is tagged. |
| `find-stale-packages` | maintainers | List published packages built against pins that no longer match, with the build-number snippet to rebuild them. Replies only. |
| `update-conda-forge-pinning` | maintainers | Move the shared conda-forge pinning to the latest version; re-renders `conda_build_config.yaml` and bumps the build number and mutex of the distributions whose pins changed. Runs weekly. |
| `update-conda-forge-pinning` | maintainers | Move the distribution's conda-forge pinning to the latest version, with the migrations that are done for its dependencies; rebuilds only the packages that use a changed pin and what depends on them (a full rebuild when that is most of them). The PR lists the packages, the migrations and a dependency check. Runs daily. |
- type: dropdown
id: command
attributes:
Expand All @@ -32,7 +32,7 @@ body:
id: distributions
attributes:
label: Distributions
description: "`all`: every distribution (for add-package: every one that has the package). Ignored by update-conda-forge-pinning."
description: "`all`: every distribution (for add-package: every one that has the package)."
multiple: true
options: [all, rolling, lyrical, jazzy, humble]
default: 0
Expand Down
19 changes: 11 additions & 8 deletions .github/workflows/bot.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@
#
# - daily: a snapshot PR for every distribution with a new rosdistro sync (the ROS
# release team tags each sync, e.g. jazzy/2026-10-05; `rosdistro_sync: manual` in
# distro.yaml opts out, like rolling); Mondays also the shared conda-forge pinning.
# distro.yaml opts out, like rolling), and a conda-forge pinning PR when there's a new
# pinning version or a migration became usable (only packages using a changed pin, and
# what depends on them, are rebuilt; the PR is labelled dependency-conflict when the
# new pins can't be installed together).
# - 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 | add-package <pkg>... [<distro>...]
# update-conda-forge-pinning [<distro>...|all] | add-package <pkg>... [<distro>...]
# - package requests (the "Package request" issue form or `@robostack-bot add-package`,
# from anyone): the bot opens a PR that adds the packages; maintainers review it.
# Every other command is for owners, members and collaborators.
Expand Down Expand Up @@ -72,10 +75,8 @@ jobs:
run: |
case "$EVENT" in
schedule)
jobs=$(pixi run -q rs rosdistro-syncs)
if [ "$(date -u +%u)" = 1 ]; then
jobs=$(echo "$jobs" | python3 -c 'import json,sys; print(json.dumps(json.load(sys.stdin) + [{"command":"update-conda-forge-pinning","distro":"","args":"","preview":False}]))')
fi ;;
# rosdistro syncs, and the conda-forge pinning of every distribution
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":d,"args":"","preview":False} for d in sys.argv[1:]]))' $(ls distros)) ;;
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 @@ -132,7 +133,7 @@ jobs:
pixi run rs add-package $ARGS "${extra[@]}" --summary "$RUNNER_TEMP/summary.md" ;;
update-rosdistro-snapshot) pixi run rs "$DISTRO" update-snapshot --summary "$RUNNER_TEMP/summary.md" ;;
find-stale-packages) pixi run rs "$DISTRO" find-stale --summary "$RUNNER_TEMP/summary.md" ;;
update-conda-forge-pinning) pixi run rs update-pinning --summary "$RUNNER_TEMP/summary.md" ;;
update-conda-forge-pinning) pixi run rs "$DISTRO" update-pinning --summary "$RUNNER_TEMP/summary.md" ;;
esac
status=$?
cat "$RUNNER_TEMP/summary.md" >> "$GITHUB_STEP_SUMMARY" 2>/dev/null
Expand All @@ -153,7 +154,9 @@ jobs:
commit-message: ${{ steps.bot.outputs.title }}
title: ${{ steps.bot.outputs.title }}
body-path: ${{ runner.temp }}/summary.md
labels: robostack-bot
labels: |
robostack-bot
${{ steps.bot.outputs.labels }}
- name: Reply on the issue / pull request
if: always() && (github.event_name == 'issue_comment' || github.event_name == 'issues')
env:
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ of a distribution uses `full_rebuild: true` there. A new build number goes into
| `add-package <pkg>... [<distro>...]` | anyone | Adds ROS packages to the shared selection in `shared/vinca.yaml`, in sorted position; every distribution that has them builds them. Opens a PR listing, for the given (default: every) distribution, what will be built on linux-64 (and what is already published as a dependency). Valid ROS package names only, at most 10 per request. |
| `update-rosdistro-snapshot [<distro>... \| all]` | maintainers | Snapshots the distribution's latest rosdistro sync (the release team's tag, e.g. `jazzy/2026-10-05`, recorded as `rosdistro_sync` in `distro.yaml`; rosdistro master for `rosdistro_sync: manual`, like rolling), then sets `build_number` to the highest build of the distribution's released packages + 1, bumps the mutex minor version and removes all per-package build numbers: a full rebuild. The PR links the sync's announcement and lists the version bumps. Runs daily for distributions with a new sync. |
| `find-stale-packages [<distro>... \| all]` | maintainers | Published packages built against pins that no longer match, with the build-number snippet to rebuild them. Replies only. |
| `update-conda-forge-pinning` | maintainers | Moves `shared/pinning/conda_forge.yaml` to the latest conda-forge pinning (migrations selected for the dependencies of all distributions) and re-renders the distributions that follow it. Those whose pins changed get the same build number and mutex bump, and their mutex `run_constraints` of the form `<pkg> <version>.*` follow the new pins. Runs weekly. |
| `update-conda-forge-pinning [<distro>... \| all]` | maintainers | Moves the distribution's conda-forge pinning (`conda_forge_pinning_version` / `conda_forge_migrations` in `distro.yaml`, or `shared/pinning/conda_forge.yaml` for distributions that follow it) to the latest version, with the migrations that are done for the distribution's dependencies, and re-renders `conda_build_config.yaml`. Only packages that use a changed pin, and everything depending on them, are rebuilt (per-package build numbers, a new build of the mutex at the same version); more than half affected means a full rebuild. Mutex `run_constraints` of the form `<pkg> <version>.*` follow the new pins. The PR lists the rebuilt packages, the migrations used and those waiting for feedstocks, and the dependency check; it is labelled `dependency-conflict` when the pins can't be installed together. Runs daily, one PR per distribution. |

There are three ways to trigger a command:
- a *Package request* or *robostack-bot command* issue;
Expand Down
6 changes: 1 addition & 5 deletions distros/humble/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,4 @@ full_rebuild: false
#
# Remember that dependents are not rebuilt automatically: evict them as well if
# they must pick up the change.
evict_cache:
# built from ROS sources under the conda-forge names before shared/vinca.yaml
# skipped them; the conda-forge packages must be used instead
- cpp-expected
- sophus
evict_cache: []
8 changes: 1 addition & 7 deletions distros/jazzy/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,4 @@ full_rebuild: false
#
# Remember that dependents are not rebuilt automatically: evict them as well if
# they must pick up the change.
evict_cache:
# built from ROS sources under the conda-forge names before shared/vinca.yaml
# skipped them; the conda-forge packages must be used instead
- cpp-expected
- sophus
# empty win-64 build from a cancelled run
- rmw_fastrtps_shared_cpp
evict_cache: []
5 changes: 1 addition & 4 deletions distros/lyrical/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,4 @@ full_rebuild: false
#
# Remember that dependents are not rebuilt automatically: evict them as well if
# they must pick up the change.
evict_cache:
- ros_image_to_qimage # rebuilt with Qt6
- openvdb_vendor # rebuilt with the OpenVDB module path fix
- nlohmann_json_schema_validator_vendor # rebuilt with exported symbols on Windows
evict_cache: []
12 changes: 6 additions & 6 deletions pixi.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion pixi.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ git = "*"
[pypi-dependencies]
# One vinca for all distributions.
# Tobias-Fischer/vinca robostack-integration (RoboStack/vinca#162 + extends, test selectors, gha fix) until merged upstream
vinca = { git = "https://github.com/Tobias-Fischer/vinca.git", rev = "ed3493cb303e571fd78dd8812869e5b44726acb0" }
vinca = { git = "https://github.com/Tobias-Fischer/vinca.git", rev = "b5c524bfc06221d8f9345ad851f7d4d9fd9b79b6" }
# For local development, temporarily use (and regenerate pixi.lock):
# vinca = { path = "../vinca", editable = true }

Expand Down
Loading
Loading