From 582bbb212e3397158f182ceb51055542d0925a09 Mon Sep 17 00:00:00 2001 From: Nathan Brooks Date: Mon, 3 Aug 2026 00:17:19 -0600 Subject: [PATCH 1/3] ci: consolidate 20 per-distro workflows into one matrix, add a blocking Resolute gate Every build workflow in this repo has been `disabled_inactivity` since roughly 2026-03. The split is exact: all 20 workflows carrying a `schedule:` trigger were auto-disabled by GitHub, and all 11 without one are still active. GitHub disables the whole workflow, not just its cron, so this repo has had zero build coverage on any distro for months -- which is how it ended up un-released from rolling by ros/rosdistro#51542 without a red job anywhere. Replaces the 20 per-distro build workflows and both reusable workflows with a single step-based industrial_ci matrix, following the shape moveit_visual_tools and rviz_visual_tools converged on. No `schedule:` triggers, so this cannot silently disable itself again. Matrix on `main`: jazzy, kilted (+ccov), lyrical, rolling. lyrical is a BLOCKING Resolute gate. It is released, so its `main` apt is populated -- ros2_control 6.8.0 and realtime_tools 5.2.0 are both there, and this repo depends on nothing else that is missing on Resolute. rviz_visual_tools#301 made the same call; moveit_visual_tools had to keep lyrical non-blocking only because moveit_core has no Resolute deb. Rolling stays non-blocking on ROS_REPO: testing, since Rolling's `main` apt has no Resolute packages yet. Also: - Coverage moves into the matrix on kilted. The old ci-coverage-build.yml ran ros-tooling/action-ros-ci on a noble runner outside a container and has been broken since the Resolute transition; its own comment proposed exactly this fix. It also only built picknik_reset_fault_controller, so picknik_twist_controller has never had coverage. Attached to kilted rather than rolling so coverage does not stop reporting whenever rolling breaks. - ROS Lint pinned to lyrical -- the newest distro whose build job is blocking -- and moved into a ros:lyrical-ros-base container, since GitHub has no Ubuntu 26.04 runner and setup-ros cannot install lyrical on noble. It now lints the whole repo: the old config named `picknik_controllers`, which is not a package here, and never linted picknik_twist_controller. - Add CONTRIBUTING.md. ament_copyright requires one at the repository root and validates its contents; this is its apache2 template verbatim, matching the repo's LICENSE. - Drop the 8 `.repos` files. All are comment-only placeholders, so no UPSTREAM_WORKSPACE is needed -- and therefore neither is the safe.directory workaround that moveit_visual_tools#157 required. - humble build + ABI workflows are removed from `main` only; the `humble` branch carries its own copies. This is temporary: once `main` has source-level distro guards per moveit2#3751, humble returns as one more matrix entry. Verified locally before pushing: pre-commit clean, and all three ament linters pass inside ros:lyrical-ros-base. Co-Authored-By: Claude Opus 5 (1M context) --- .ci.prepare_codecov | 21 +++ .github/workflows/README.md | 123 ++++++++---------- .github/workflows/build_and_test.yaml | 115 ++++++++++++++++ .github/workflows/ci-coverage-build.yml | 61 --------- .github/workflows/ci-ros-lint.yml | 69 +++++----- .../workflows/humble-abi-compatibility.yml | 20 --- .../workflows/humble-binary-build-main.yml | 26 ---- .../workflows/humble-binary-build-testing.yml | 26 ---- .../humble-semi-binary-build-main.yml | 25 ---- .../humble-semi-binary-build-testing.yml | 25 ---- .github/workflows/humble-source-build.yml | 19 --- .github/workflows/jazzy-binary-build-main.yml | 26 ---- .../workflows/jazzy-binary-build-testing.yml | 26 ---- .../jazzy-semi-binary-build-main.yml | 25 ---- .../jazzy-semi-binary-build-testing.yml | 25 ---- .github/workflows/jazzy-source-build.yml | 19 --- .../workflows/kilted-binary-build-main.yml | 26 ---- .../workflows/kilted-binary-build-testing.yml | 26 ---- .../kilted-semi-binary-build-main.yml | 25 ---- .../kilted-semi-binary-build-testing.yml | 25 ---- .github/workflows/kilted-source-build.yml | 19 --- .../reusable-industrial-ci-with-cache.yml | 96 -------------- .../reusable-ros-tooling-source-build.yml | 49 ------- .../workflows/rolling-binary-build-main.yml | 26 ---- .../rolling-binary-build-testing.yml | 26 ---- .../rolling-semi-binary-build-main.yml | 25 ---- .../rolling-semi-binary-build-testing.yml | 25 ---- .github/workflows/rolling-source-build.yml | 19 --- CONTRIBUTING.md | 13 ++ picknik_controllers-not-released.humble.repos | 6 - picknik_controllers-not-released.jazzy.repos | 6 - picknik_controllers-not-released.kilted.repos | 6 - ...nik_controllers-not-released.rolling.repos | 6 - picknik_controllers.humble.repos | 6 - picknik_controllers.jazzy.repos | 6 - picknik_controllers.kilted.repos | 6 - picknik_controllers.rolling.repos | 6 - 37 files changed, 239 insertions(+), 860 deletions(-) create mode 100755 .ci.prepare_codecov create mode 100644 .github/workflows/build_and_test.yaml delete mode 100644 .github/workflows/ci-coverage-build.yml delete mode 100644 .github/workflows/humble-abi-compatibility.yml delete mode 100644 .github/workflows/humble-binary-build-main.yml delete mode 100644 .github/workflows/humble-binary-build-testing.yml delete mode 100644 .github/workflows/humble-semi-binary-build-main.yml delete mode 100644 .github/workflows/humble-semi-binary-build-testing.yml delete mode 100644 .github/workflows/humble-source-build.yml delete mode 100644 .github/workflows/jazzy-binary-build-main.yml delete mode 100644 .github/workflows/jazzy-binary-build-testing.yml delete mode 100644 .github/workflows/jazzy-semi-binary-build-main.yml delete mode 100644 .github/workflows/jazzy-semi-binary-build-testing.yml delete mode 100644 .github/workflows/jazzy-source-build.yml delete mode 100644 .github/workflows/kilted-binary-build-main.yml delete mode 100644 .github/workflows/kilted-binary-build-testing.yml delete mode 100644 .github/workflows/kilted-semi-binary-build-main.yml delete mode 100644 .github/workflows/kilted-semi-binary-build-testing.yml delete mode 100644 .github/workflows/kilted-source-build.yml delete mode 100644 .github/workflows/reusable-industrial-ci-with-cache.yml delete mode 100644 .github/workflows/reusable-ros-tooling-source-build.yml delete mode 100644 .github/workflows/rolling-binary-build-main.yml delete mode 100644 .github/workflows/rolling-binary-build-testing.yml delete mode 100644 .github/workflows/rolling-semi-binary-build-main.yml delete mode 100644 .github/workflows/rolling-semi-binary-build-testing.yml delete mode 100644 .github/workflows/rolling-source-build.yml create mode 100644 CONTRIBUTING.md delete mode 100644 picknik_controllers-not-released.humble.repos delete mode 100644 picknik_controllers-not-released.jazzy.repos delete mode 100644 picknik_controllers-not-released.kilted.repos delete mode 100644 picknik_controllers-not-released.rolling.repos delete mode 100644 picknik_controllers.humble.repos delete mode 100644 picknik_controllers.jazzy.repos delete mode 100644 picknik_controllers.kilted.repos delete mode 100644 picknik_controllers.rolling.repos diff --git a/.ci.prepare_codecov b/.ci.prepare_codecov new file mode 100755 index 0000000..91119f5 --- /dev/null +++ b/.ci.prepare_codecov @@ -0,0 +1,21 @@ +#!/bin/bash +pushd $BASEDIR + +BLUE='\033[0;34m' +NOCOLOR='\033[0m' + +apt-get install -qq lcov + +echo -e "${BLUE}Capture coverage info${NOCOLOR}" +lcov --capture --directory target_ws --output-file coverage.info + +echo -e "${BLUE}Extract repository files${NOCOLOR}" +lcov --extract coverage.info "$BASEDIR/target_ws/src/$TARGET_REPO_NAME/*" --output-file coverage.info + +echo -e "${BLUE}Filter out test files${NOCOLOR}" +lcov --remove coverage.info '*/test/*' --output-file coverage.info + +echo -e "${BLUE}Output coverage data for debugging${NOCOLOR}" +lcov --list coverage.info + +popd diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 28fbd3b..a696de6 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -1,72 +1,51 @@ - -ROS2 Distro | Branch | Build status | Documentation | Released packages -:---------: | :----: | :----------: | :-----------: | :---------------: -**Rolling** | [`rolling`](https://github.com/PickNikRobotics/picknik_controllers/tree/rolling) | [![Rolling Binary Build](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/rolling-binary-build-main.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/rolling-binary-build-main.yml?branch=main)
[![Rolling Binary Build](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/rolling-binary-build-testing.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/rolling-binary-build-testing.yml?branch=main)
[![Rolling Semi-Binary Build](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/rolling-semi-binary-build-main.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/rolling-semi-binary-build-main.yml?branch=main)
[![Rolling Semi-Binary Build](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/rolling-semi-binary-build-testing.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/rolling-semi-binary-build-testing.yml?branch=main)
[![Rolling Source Build](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/rolling-source-build.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/rolling-source-build.yml?branch=main) | [![Doxygen Doc Deployment](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/doxygen-deploy.yml/badge.svg)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/doxygen-deploy.yml)
[Generated Doc](https://PickNikRobotics.github.io/picknik_controllers_Documentation/rolling/html/index.html) | [picknik_controllers](https://index.ros.org/p/picknik_controllers/#rolling) - -## Build status - - -### Explanation of different build types - -**NOTE**: There are three build stages checking current and future compatibility of the package. - -[Detailed build status](.github/workflows/README.md) - -1. Binary builds - against released packages (main and testing) in ROS distributions. Shows that direct local build is possible. - - Uses repos file: `$NAME$-not-released..repos` - -1. Semi-binary builds - against released core ROS packages (main and testing), but the immediate dependencies are pulled from source. - Shows that local build with dependencies is possible and if fails there we can expect that after the next package sync we will not be able to build. - - Uses repos file: `$NAME$.repos` - -1. Source build - also core ROS packages are build from source. It shows potential issues in the mid future. - -ROS2 Distro | Branch | Build status | Documentation | Released packages -:---------: | :----: | :----------: | :-----------: | :---------------: -**Humble** | [`humble`](https://github.com/PickNikRobotics/picknik_controllers/tree/humble) | [![Humble Binary Build](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/humble-binary-build-main.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/humble-binary-build-main.yml?branch=main)
[![Humble Binary Build](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/humble-binary-build-testing.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/humble-binary-build-testing.yml?branch=main)
[![Humble Semi-Binary Build](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/humble-semi-binary-build-main.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/humble-semi-binary-build-main.yml?branch=main)
[![Humble Semi-Binary Build](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/humble-semi-binary-build-testing.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/humble-semi-binary-build-testing.yml?branch=main)
[![Humble Source Build](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/humble-source-build.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/humble-source-build.yml?branch=main) | [![Doxygen Doc Deployment](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/doxygen-deploy.yml/badge.svg)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/doxygen-deploy.yml)
[Generated Doc](https://PickNikRobotics.github.io/picknik_controllers_Documentation/humble/html/index.html) | [picknik_controllers](https://index.ros.org/p/picknik_controllers/#humble) - -## Build status - - -### Explanation of different build types - -**NOTE**: There are three build stages checking current and future compatibility of the package. - -[Detailed build status](.github/workflows/README.md) - -1. Binary builds - against released packages (main and testing) in ROS distributions. Shows that direct local build is possible. - - Uses repos file: `$NAME$-not-released..repos` - -1. Semi-binary builds - against released core ROS packages (main and testing), but the immediate dependencies are pulled from source. - Shows that local build with dependencies is possible and if fails there we can expect that after the next package sync we will not be able to build. - - Uses repos file: `$NAME$.repos` - -1. Source build - also core ROS packages are build from source. It shows potential issues in the mid future. - -ROS2 Distro | Branch | Build status | Documentation | Released packages -:---------: | :----: | :----------: | :-----------: | :---------------: -**Iron** | [`iron`](https://github.com/PickNikRobotics/picknik_controllers/tree/iron) | [![Iron Binary Build](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/iron-binary-build-main.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/iron-binary-build-main.yml?branch=main)
[![Iron Binary Build](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/iron-binary-build-testing.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/iron-binary-build-testing.yml?branch=main)
[![Iron Semi-Binary Build](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/iron-semi-binary-build-main.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/iron-semi-binary-build-main.yml?branch=main)
[![Iron Semi-Binary Build](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/iron-semi-binary-build-testing.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/iron-semi-binary-build-testing.yml?branch=main)
[![Iron Source Build](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/iron-source-build.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/iron-source-build.yml?branch=main) | [![Doxygen Doc Deployment](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/doxygen-deploy.yml/badge.svg)](https://github.com/PickNikRobotics/picknik_controllers/actions/workflows/doxygen-deploy.yml)
[Generated Doc](https://PickNikRobotics.github.io/picknik_controllers_Documentation/iron/html/index.html) | [picknik_controllers](https://index.ros.org/p/picknik_controllers/#iron) - -## Build status - - -### Explanation of different build types - -**NOTE**: There are three build stages checking current and future compatibility of the package. - -[Detailed build status](.github/workflows/README.md) - -1. Binary builds - against released packages (main and testing) in ROS distributions. Shows that direct local build is possible. - - Uses repos file: `$NAME$-not-released..repos` - -1. Semi-binary builds - against released core ROS packages (main and testing), but the immediate dependencies are pulled from source. - Shows that local build with dependencies is possible and if fails there we can expect that after the next package sync we will not be able to build. - - Uses repos file: `$NAME$.repos` - -1. Source build - also core ROS packages are build from source. It shows potential issues in the mid future. +# CI overview + +| Workflow | Trigger | Blocking | What it covers | +|---|---|---|---| +| [`build_and_test.yaml`](build_and_test.yaml) | PR to `main`, push to `main`, manual | see below | Build + test on every distro `main` is released to | +| [`ci-format.yml`](ci-format.yml) | PR, manual | yes | `pre-commit` across all files | +| [`ci-ros-lint.yml`](ci-ros-lint.yml) | PR to `main`, manual | yes | `ament_copyright`, `ament_lint_cmake`, `ament_cpplint` on **lyrical** | +| [`jazzy-abi-compatibility.yml`](jazzy-abi-compatibility.yml) | PR to `main` | yes | ABI diff vs. the base branch | +| [`kilted-abi-compatibility.yml`](kilted-abi-compatibility.yml) | PR to `main` | yes | ABI diff vs. the base branch | +| [`rolling-abi-compatibility.yml`](rolling-abi-compatibility.yml) | PR to `main` | no | ABI diff vs. the base branch | +| [`prerelease-check.yml`](prerelease-check.yml) | manual | n/a | `industrial_ci` `PRERELEASE: true` — buildfarm dry-run before tagging | + +## Build matrix + +`build_and_test.yaml` runs one `industrial_ci` job per distro: + +| Job | apt repo | Base OS | Blocking | +|---|---|---|---| +| `jazzy-main` | `main` | noble | yes | +| `kilted-main + ccov` | `main` | noble | yes | +| `lyrical-main` | `main` | **resolute** | **yes** | +| `rolling-testing` | `testing` | **resolute** | no | + +`lyrical` is the Resolute gate. It is a released distro, so its `main` apt is +populated and every dependency this repo has is available there. Rolling is +non-blocking because Rolling's `main` apt has no Resolute packages yet, so it +tracks `testing` instead. + +Coverage runs on `kilted` rather than on `rolling`: coverage attached to a +non-blocking job silently stops reporting whenever that job breaks, and rolling +breakage is precisely what this repo keeps hitting. + +## Branches + +`main` currently serves jazzy, kilted, lyrical and rolling. humble is served by +the [`humble`](https://github.com/PickNikRobotics/picknik_controllers/tree/humble) +branch, which carries its own copy of these workflows. + +The intent is for `main` to serve **all** active distros using the source-level +compatibility guards described in +[moveit2#3751](https://github.com/moveit/moveit2/pull/3751). When that lands, +re-adding humble here is a single matrix entry — no new workflow files. + +## No `schedule:` triggers + +Deliberate. GitHub auto-disables cron-triggered workflows after 60 days of repo +inactivity, and it disables the **whole** workflow, not just the cron trigger. +That is what silently took all 20 of this repo's previous build workflows offline +between 2026-03 and 2026-08 — every workflow with a `schedule:` was disabled, and +every workflow without one survived. Nightly dependency-rot detection is not worth +losing PR coverage to. diff --git a/.github/workflows/build_and_test.yaml b/.github/workflows/build_and_test.yaml new file mode 100644 index 0000000..17d8412 --- /dev/null +++ b/.github/workflows/build_and_test.yaml @@ -0,0 +1,115 @@ +# This config uses industrial_ci (https://github.com/ros-industrial/industrial_ci.git). +# For troubleshooting, see readme (https://github.com/ros-industrial/industrial_ci/blob/master/README.rst) +# +# Replaces 20 per-distro workflow files and 2 reusable workflows. Deliberately +# has NO `schedule:` trigger: GitHub auto-disables cron-triggered workflows after +# 60 days of repo inactivity, which is what silently took every build job in this +# repo offline between 2026-03 and 2026-08. + +name: Build and Test + +on: + workflow_dispatch: + pull_request: + branches: + - main + push: + branches: + - main + +jobs: + industrial_ci: + strategy: + # Without this, one failing job cancels its siblings before they report, + # so a job broken by the environment discards results that were still good. + fail-fast: false + matrix: + env: + # humble is NOT built here. `main` dropped humble support in 49a5270 + # after the ros2_control API break; humble is served by the `humble` + # branch and its own workflow. + # + # This is meant to be temporary. Once `main` carries source-level + # compatibility guards per moveit2#3751, humble comes back as one more + # entry in this list and the `humble` branch retires. The matrix is + # shaped so that is a one-line change, not a restructure. + - ROS_DISTRO: jazzy + ROS_REPO: main + - ROS_DISTRO: kilted + ROS_REPO: main + CCOV: true + # lyrical is Ubuntu Resolute AND released, so its `main` apt is + # populated -- ros2_control 6.8.0 and realtime_tools 5.2.0 are both + # there. Every dependency this repo has is available, so this is a + # BLOCKING Resolute gate. That is the job that would have caught the + # break which got us un-released from rolling. + - ROS_DISTRO: lyrical + ROS_REPO: main + OS_CODE_NAME: resolute + # Rolling's `main` apt has no Resolute packages yet, so track + # `testing`. Pin OS_CODE_NAME rather than trusting industrial_ci's + # default, which has moved once already. Non-blocking until Rolling + # promotes to main apt; lyrical above is the gate that must stay green. + - ROS_DISTRO: rolling + ROS_REPO: testing + OS_CODE_NAME: resolute + NONBLOCKING: true + + env: + AFTER_RUN_TARGET_TEST: ${{ matrix.env.CCOV && './.ci.prepare_codecov' || '' }} + TARGET_CMAKE_ARGS: > + -DCMAKE_BUILD_TYPE=${{ matrix.env.CCOV && 'Debug' || 'Release'}} + ${{ matrix.env.CCOV && '-DCMAKE_CXX_FLAGS="--coverage" --no-warn-unused-cli' || '' }} + CCACHE_DIR: ${{ github.workspace }}/.ccache + BASEDIR: ${{ github.workspace }}/.work + CACHE_PREFIX: ${{ matrix.env.ROS_DISTRO }}-${{ matrix.env.ROS_REPO }}${{ matrix.env.CCOV && '-ccov' || '' }} + + name: "${{ matrix.env.ROS_DISTRO }}-${{ matrix.env.ROS_REPO }}${{ matrix.env.CCOV && ' + ccov' || ''}}" + runs-on: ubuntu-latest + # Valid here because this is a step-based job. It is silently ignored on a + # job that calls a reusable workflow via `uses:` -- the trap that broke + # ros2_robotiq_gripper's workflow file until #129. + continue-on-error: ${{ matrix.env.NONBLOCKING || false }} + steps: + - uses: actions/checkout@v4 + # The target directory cache doesn't include the source directory because + # that comes from the checkout. See "prepare target_ws for cache" below. + - name: cache target_ws + if: ${{ ! matrix.env.CCOV }} + uses: actions/cache@v4 + with: + save-always: true + path: ${{ env.BASEDIR }}/target_ws + key: target_ws-${{ env.CACHE_PREFIX }}-${{ hashFiles('**/CMakeLists.txt', '**/package.xml') }}-${{ github.run_id }} + restore-keys: | + target_ws-${{ env.CACHE_PREFIX }}-${{ hashFiles('**/CMakeLists.txt', '**/package.xml') }} + - name: cache ccache + uses: actions/cache@v4 + with: + save-always: true + path: ${{ env.CCACHE_DIR }} + key: ccache-${{ env.CACHE_PREFIX }}-${{ github.sha }}-${{ github.run_id }} + restore-keys: | + ccache-${{ env.CACHE_PREFIX }}-${{ github.sha }} + ccache-${{ env.CACHE_PREFIX }} + - name: industrial_ci + uses: ros-industrial/industrial_ci@master + env: ${{ matrix.env }} + - name: upload test artifacts (on failure) + uses: actions/upload-artifact@v4 + if: failure() + with: + name: test-results-${{ matrix.env.ROS_DISTRO }}-${{ matrix.env.ROS_REPO }} + path: ${{ env.BASEDIR }}/target_ws/**/test_results/**/*.xml + - name: upload codecov report + uses: codecov/codecov-action@v4 + if: ${{ matrix.env.CCOV }} + with: + files: ${{ env.BASEDIR }}/coverage.info + - name: prepare target_ws for cache + if: ${{ always() && ! matrix.env.CCOV }} + run: | + du -sh ${{ env.BASEDIR }}/target_ws + sudo find ${{ env.BASEDIR }}/target_ws -wholename '*/test_results/*' -delete + sudo rm -rf ${{ env.BASEDIR }}/target_ws/src + du -sh ${{ env.BASEDIR }}/target_ws diff --git a/.github/workflows/ci-coverage-build.yml b/.github/workflows/ci-coverage-build.yml deleted file mode 100644 index ec9bf50..0000000 --- a/.github/workflows/ci-coverage-build.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: Coverage Build -on: - workflow_dispatch: - branches: - - main - pull_request: - branches: - - main - -jobs: - coverage: - name: coverage build - runs-on: ubuntu-24.04 - # Non-blocking while Rolling completes its Noble → Resolute base-OS transition. - # - # Observed 2026-07 on Ubuntu 24.04 (noble) runners: rosdep can't resolve - # `realtime_tools` for noble, so `apt-get install` skips ros2_control's runtime - # deps; the subsequent `colcon build` then fails at - # `find_package(controller_interface REQUIRED)` in CMakeLists.txt. Upstream root - # cause is that Rolling has migrated to Resolute and its dep chain no longer - # resolves against noble apt. Not fixable at the workflow level here. - # - # Revisit when either (a) `ros-tooling/action-ros-ci` releases a version that - # switches its runner base to Resolute, or (b) we wrap this workflow in - # `industrial_ci` with `OS_CODE_NAME: resolute` (matching moveit2's approach). - continue-on-error: true - strategy: - fail-fast: false - env: - ROS_DISTRO: rolling - steps: - - uses: ros-tooling/setup-ros@v0.7 - with: - required-ros-distributions: ${{ env.ROS_DISTRO }} - - uses: actions/checkout@v7 - - uses: ros-tooling/action-ros-ci@v0.4 - with: - target-ros2-distro: ${{ env.ROS_DISTRO }} - import-token: ${{ secrets.GITHUB_TOKEN }} - # build all packages listed in the meta package - package-name: - picknik_reset_fault_controller - - vcs-repo-file-url: | - https://raw.githubusercontent.com/${{ github.repository }}/${{ github.sha }}/picknik_controllers-not-released.${{ env.ROS_DISTRO }}.repos - colcon-defaults: | - { - "build": { - "mixin": ["coverage-gcc"] - } - } - colcon-mixin-repository: https://raw.githubusercontent.com/colcon/colcon-mixin-repository/master/index.yaml - - uses: codecov/codecov-action@v7.0.0 - with: - file: ros_ws/lcov/total_coverage.info - flags: unittests - name: codecov-umbrella - - uses: actions/upload-artifact@v7 - with: - name: colcon-logs-coverage-rolling - path: ros_ws/log diff --git a/.github/workflows/ci-ros-lint.yml b/.github/workflows/ci-ros-lint.yml index 85c0f47..3aeab6b 100644 --- a/.github/workflows/ci-ros-lint.yml +++ b/.github/workflows/ci-ros-lint.yml @@ -1,41 +1,50 @@ name: ROS Lint + on: + workflow_dispatch: pull_request: + branches: + - main jobs: ament_lint: name: ament_${{ matrix.linter }} - runs-on: ubuntu-24.04 - strategy: - fail-fast: false - matrix: - linter: [copyright, lint_cmake] - steps: - - uses: actions/checkout@v7 - - uses: ros-tooling/setup-ros@v0.7 - - uses: ros-tooling/action-ros-lint@v0.1 - with: - distribution: rolling - linter: ${{ matrix.linter }} - package-name: - picknik_reset_fault_controller - - - ament_lint_100: - name: ament_${{ matrix.linter }} - runs-on: ubuntu-24.04 + runs-on: ubuntu-latest + # Pinned to lyrical: it is the newest distro whose build job in + # build_and_test.yaml is BLOCKING, so the linters match the toolchain that + # actually gates merges. rolling is newer but non-blocking, and linting + # against a distro we do not gate on would put lint failures on a job nobody + # is obliged to fix. + # + # Runs in a container rather than on the runner because lyrical is Ubuntu + # Resolute and GitHub has no 26.04 runner yet. ros-tooling/setup-ros on a + # noble runner cannot install lyrical -- that exact mismatch is what broke + # the old coverage job, and this avoids repeating it. + container: ros:lyrical-ros-base strategy: fail-fast: false matrix: - linter: [cpplint] + include: + - linter: copyright + apt: ament-copyright + args: "" + - linter: lint_cmake + apt: ament-lint-cmake + args: "" + - linter: cpplint + apt: ament-cpplint + args: "--linelength=100 --filter=-whitespace/newline" steps: - - uses: actions/checkout@v7 - - uses: ros-tooling/setup-ros@v0.7 - - uses: ros-tooling/action-ros-lint@v0.1 - with: - distribution: rolling - linter: cpplint - arguments: "--linelength=100 --filter=-whitespace/newline" - package-name: - picknik_reset_fault_controller - picknik_controllers + - uses: actions/checkout@v4 + - name: install ament_${{ matrix.linter }} + run: | + apt-get update -qq + apt-get install -y -qq ros-lyrical-${{ matrix.apt }} + # Lints the repository root rather than a package list. The previous config + # named `picknik_controllers`, which is not a package in this repo, and + # never linted picknik_twist_controller at all. + - name: ament_${{ matrix.linter }} + shell: bash + run: | + source /opt/ros/lyrical/setup.bash + ament_${{ matrix.linter }} ${{ matrix.args }} . diff --git a/.github/workflows/humble-abi-compatibility.yml b/.github/workflows/humble-abi-compatibility.yml deleted file mode 100644 index 3c7244a..0000000 --- a/.github/workflows/humble-abi-compatibility.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Humble - ABI Compatibility Check -on: - workflow_dispatch: - branches: - - humble - pull_request: - branches: - - humble - -jobs: - abi_check: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v7 - - uses: ros-industrial/industrial_ci@master - env: - ROS_DISTRO: humble - ROS_REPO: main - ABICHECK_URL: github:${{ github.repository }}#${{ github.base_ref }} - NOT_TEST_BUILD: true diff --git a/.github/workflows/humble-binary-build-main.yml b/.github/workflows/humble-binary-build-main.yml deleted file mode 100644 index 793ddcd..0000000 --- a/.github/workflows/humble-binary-build-main.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Humble Binary Build - humble -# author: Denis Štogl -# description: 'Build & test all dependencies from released (binary) packages.' - -on: - workflow_dispatch: - branches: - - humble - pull_request: - branches: - - humble - push: - branches: - - humble - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '03 1 * * *' - -jobs: - binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: humble - ros_repo: main - upstream_workspace: picknik_controllers-not-released.humble.repos - ref_for_scheduled_build: humble diff --git a/.github/workflows/humble-binary-build-testing.yml b/.github/workflows/humble-binary-build-testing.yml deleted file mode 100644 index 17f1b70..0000000 --- a/.github/workflows/humble-binary-build-testing.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Humble Binary Build - testing -# author: Denis Štogl -# description: 'Build & test all dependencies from released (binary) packages.' - -on: - workflow_dispatch: - branches: - - humble - pull_request: - branches: - - humble - push: - branches: - - humble - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '03 1 * * *' - -jobs: - binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: humble - ros_repo: testing - upstream_workspace: picknik_controllers-not-released.humble.repos - ref_for_scheduled_build: humble diff --git a/.github/workflows/humble-semi-binary-build-main.yml b/.github/workflows/humble-semi-binary-build-main.yml deleted file mode 100644 index dd3f73f..0000000 --- a/.github/workflows/humble-semi-binary-build-main.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Humble Semi-Binary Build - humble -# description: 'Build & test that compiles the humble dependencies from source.' - -on: - workflow_dispatch: - branches: - - humble - pull_request: - branches: - - humble - push: - branches: - - humble - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '33 1 * * *' - -jobs: - semi_binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: humble - ros_repo: main - upstream_workspace: picknik_controllers.humble.repos - ref_for_scheduled_build: humble diff --git a/.github/workflows/humble-semi-binary-build-testing.yml b/.github/workflows/humble-semi-binary-build-testing.yml deleted file mode 100644 index 6346bb2..0000000 --- a/.github/workflows/humble-semi-binary-build-testing.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Humble Semi-Binary Build - testing -# description: 'Build & test that compiles the humble dependencies from source.' - -on: - workflow_dispatch: - branches: - - humble - pull_request: - branches: - - humble - push: - branches: - - humble - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '33 1 * * *' - -jobs: - semi_binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: humble - ros_repo: testing - upstream_workspace: picknik_controllers.humble.repos - ref_for_scheduled_build: humble diff --git a/.github/workflows/humble-source-build.yml b/.github/workflows/humble-source-build.yml deleted file mode 100644 index ff0fd62..0000000 --- a/.github/workflows/humble-source-build.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Humble Source Build -on: - workflow_dispatch: - branches: - - humble - push: - branches: - - humble - schedule: - # Run every day to detect flakiness and broken dependencies - - cron: '03 3 * * *' - -jobs: - source: - uses: ./.github/workflows/reusable-ros-tooling-source-build.yml - with: - ros_distro: humble - ref: humble - ros2_repo_branch: humble diff --git a/.github/workflows/jazzy-binary-build-main.yml b/.github/workflows/jazzy-binary-build-main.yml deleted file mode 100644 index e7efd00..0000000 --- a/.github/workflows/jazzy-binary-build-main.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Jazzy Binary Build - main -# author: Denis Štogl -# description: 'Build & test all dependencies from released (binary) packages.' - -on: - workflow_dispatch: - branches: - - main - pull_request: - branches: - - main - push: - branches: - - main - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '03 1 * * *' - -jobs: - binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: jazzy - ros_repo: main - upstream_workspace: picknik_controllers-not-released.jazzy.repos - ref_for_scheduled_build: main diff --git a/.github/workflows/jazzy-binary-build-testing.yml b/.github/workflows/jazzy-binary-build-testing.yml deleted file mode 100644 index 72e6706..0000000 --- a/.github/workflows/jazzy-binary-build-testing.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Jazzy Binary Build - testing -# author: Denis Štogl -# description: 'Build & test all dependencies from released (binary) packages.' - -on: - workflow_dispatch: - branches: - - main - pull_request: - branches: - - main - push: - branches: - - main - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '03 1 * * *' - -jobs: - binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: jazzy - ros_repo: testing - upstream_workspace: picknik_controllers-not-released.jazzy.repos - ref_for_scheduled_build: main diff --git a/.github/workflows/jazzy-semi-binary-build-main.yml b/.github/workflows/jazzy-semi-binary-build-main.yml deleted file mode 100644 index 1f64272..0000000 --- a/.github/workflows/jazzy-semi-binary-build-main.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Jazzy Semi-Binary Build - main -# description: 'Build & test that compiles the main dependencies from source.' - -on: - workflow_dispatch: - branches: - - main - pull_request: - branches: - - main - push: - branches: - - main - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '33 1 * * *' - -jobs: - semi_binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: jazzy - ros_repo: main - upstream_workspace: picknik_controllers.jazzy.repos - ref_for_scheduled_build: main diff --git a/.github/workflows/jazzy-semi-binary-build-testing.yml b/.github/workflows/jazzy-semi-binary-build-testing.yml deleted file mode 100644 index 018e753..0000000 --- a/.github/workflows/jazzy-semi-binary-build-testing.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Jazzy Semi-Binary Build - testing -# description: 'Build & test that compiles the main dependencies from source.' - -on: - workflow_dispatch: - branches: - - main - pull_request: - branches: - - main - push: - branches: - - main - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '33 1 * * *' - -jobs: - semi_binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: jazzy - ros_repo: testing - upstream_workspace: picknik_controllers.jazzy.repos - ref_for_scheduled_build: main diff --git a/.github/workflows/jazzy-source-build.yml b/.github/workflows/jazzy-source-build.yml deleted file mode 100644 index d651912..0000000 --- a/.github/workflows/jazzy-source-build.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Jazzy Source Build -on: - workflow_dispatch: - branches: - - main - push: - branches: - - main - schedule: - # Run every day to detect flakiness and broken dependencies - - cron: '03 3 * * *' - -jobs: - source: - uses: ./.github/workflows/reusable-ros-tooling-source-build.yml - with: - ros_distro: jazzy - ref: main - ros2_repo_branch: jazzy diff --git a/.github/workflows/kilted-binary-build-main.yml b/.github/workflows/kilted-binary-build-main.yml deleted file mode 100644 index 2bb336e..0000000 --- a/.github/workflows/kilted-binary-build-main.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Kilted Binary Build - main -# author: Denis Štogl -# description: 'Build & test all dependencies from released (binary) packages.' - -on: - workflow_dispatch: - branches: - - main - pull_request: - branches: - - main - push: - branches: - - main - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '03 1 * * *' - -jobs: - binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: kilted - ros_repo: main - upstream_workspace: picknik_controllers-not-released.kilted.repos - ref_for_scheduled_build: main diff --git a/.github/workflows/kilted-binary-build-testing.yml b/.github/workflows/kilted-binary-build-testing.yml deleted file mode 100644 index 84435a4..0000000 --- a/.github/workflows/kilted-binary-build-testing.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Kilted Binary Build - testing -# author: Denis Štogl -# description: 'Build & test all dependencies from released (binary) packages.' - -on: - workflow_dispatch: - branches: - - main - pull_request: - branches: - - main - push: - branches: - - main - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '03 1 * * *' - -jobs: - binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: kilted - ros_repo: testing - upstream_workspace: picknik_controllers-not-released.kilted.repos - ref_for_scheduled_build: main diff --git a/.github/workflows/kilted-semi-binary-build-main.yml b/.github/workflows/kilted-semi-binary-build-main.yml deleted file mode 100644 index 044fbca..0000000 --- a/.github/workflows/kilted-semi-binary-build-main.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Kilted Semi-Binary Build - main -# description: 'Build & test that compiles the main dependencies from source.' - -on: - workflow_dispatch: - branches: - - main - pull_request: - branches: - - main - push: - branches: - - main - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '33 1 * * *' - -jobs: - semi_binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: kilted - ros_repo: main - upstream_workspace: picknik_controllers.kilted.repos - ref_for_scheduled_build: main diff --git a/.github/workflows/kilted-semi-binary-build-testing.yml b/.github/workflows/kilted-semi-binary-build-testing.yml deleted file mode 100644 index bf0c20f..0000000 --- a/.github/workflows/kilted-semi-binary-build-testing.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Kilted Semi-Binary Build - testing -# description: 'Build & test that compiles the main dependencies from source.' - -on: - workflow_dispatch: - branches: - - main - pull_request: - branches: - - main - push: - branches: - - main - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '33 1 * * *' - -jobs: - semi_binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: kilted - ros_repo: testing - upstream_workspace: picknik_controllers.kilted.repos - ref_for_scheduled_build: main diff --git a/.github/workflows/kilted-source-build.yml b/.github/workflows/kilted-source-build.yml deleted file mode 100644 index 3f019f2..0000000 --- a/.github/workflows/kilted-source-build.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Kilted Source Build -on: - workflow_dispatch: - branches: - - main - push: - branches: - - main - schedule: - # Run every day to detect flakiness and broken dependencies - - cron: '03 3 * * *' - -jobs: - source: - uses: ./.github/workflows/reusable-ros-tooling-source-build.yml - with: - ros_distro: kilted - ref: main - ros2_repo_branch: kilted diff --git a/.github/workflows/reusable-industrial-ci-with-cache.yml b/.github/workflows/reusable-industrial-ci-with-cache.yml deleted file mode 100644 index af44c65..0000000 --- a/.github/workflows/reusable-industrial-ci-with-cache.yml +++ /dev/null @@ -1,96 +0,0 @@ -name: Reusable industrial_ci Workflow with Cache -# Reusable action to simplify dealing with ROS/ROS2 industrial_ci builds with cache -# author: Denis Štogl - -on: - workflow_call: - inputs: - ref_for_scheduled_build: - description: 'Reference on which the repo should be checkout for scheduled build. Usually is this name of a branch or a tag.' - default: '' - required: false - type: string - - upstream_workspace: - description: 'UPSTREAM_WORKSPACE variable for industrial_ci. Usually path to local .repos file.' - required: true - type: string - ros_distro: - description: 'ROS_DISTRO variable for industrial_ci' - required: true - type: string - ros_repo: - description: 'ROS_REPO to run for industrial_ci. Possible values: "main", "testing"' - default: 'main' - required: false - type: string - os_code_name: - description: 'OS_CODE_NAME variable for industrial_ci' - default: '' - required: false - type: string - before_install_upstream_dependencies: - description: 'BEFORE_INSTALL_UPSTREAM_DEPENDENCIES variable for industrial_ci' - default: '' - required: false - type: string - - ccache_dir: - description: 'Local path to store cache (from "github.workspace"). For standard industrial_ci configuration do not have to be changed' - default: '.ccache' - required: false - type: string - basedir: - description: 'Local path to workspace base directory to cache (from "github.workspace"). For standard industrial_ci configuration do not have to be changed' - default: '.work' - required: false - type: string - - -jobs: - reusable_industrial_ci_with_cache: - name: ${{ inputs.ros_distro }} ${{ inputs.ros_repo }} ${{ inputs.os_code_name }} - runs-on: ubuntu-latest - env: - CCACHE_DIR: ${{ github.workspace }}/${{ inputs.ccache_dir }} - BASEDIR: ${{ github.workspace }}/${{ inputs.basedir }} - CACHE_PREFIX: ${{ inputs.ros_distro }}-${{ inputs.upstream_workspace }}-${{ inputs.ros_repo }}-${{ github.job }} - steps: - - name: Checkout ${{ inputs.ref }} when build is not scheduled - if: ${{ github.event_name != 'schedule' }} - uses: actions/checkout@v7 - - name: Checkout ${{ inputs.ref }} on scheduled build - if: ${{ github.event_name == 'schedule' }} - uses: actions/checkout@v7 - with: - ref: ${{ inputs.ref_for_scheduled_build }} - - name: cache target_ws - if: ${{ ! matrix.env.CCOV }} - uses: pat-s/always-upload-cache@v3 - with: - path: ${{ env.BASEDIR }}/target_ws - key: target_ws-${{ env.CACHE_PREFIX }}-${{ hashFiles('**/CMakeLists.txt', '**/package.xml') }}-${{ github.run_id }} - restore-keys: | - target_ws-${{ env.CACHE_PREFIX }}-${{ hashFiles('**/CMakeLists.txt', '**/package.xml') }} - - name: cache ccache - uses: pat-s/always-upload-cache@v3 - with: - path: ${{ env.CCACHE_DIR }} - key: ccache-${{ env.CACHE_PREFIX }}-${{ github.sha }}-${{ github.run_id }} - restore-keys: | - ccache-${{ env.CACHE_PREFIX }}-${{ github.sha }} - ccache-${{ env.CACHE_PREFIX }} - - uses: 'ros-industrial/industrial_ci@master' - env: - UPSTREAM_WORKSPACE: ${{ inputs.upstream_workspace }} - ROS_DISTRO: ${{ inputs.ros_distro }} - ROS_REPO: ${{ inputs.ros_repo }} - OS_CODE_NAME: ${{ inputs.os_code_name }} - BEFORE_INSTALL_UPSTREAM_DEPENDENCIES: ${{ inputs.before_install_upstream_dependencies }} - - name: prepare target_ws for cache - if: ${{ always() && ! matrix.env.CCOV }} - run: | - du -sh ${{ env.BASEDIR }}/target_ws - sudo find ${{ env.BASEDIR }}/target_ws -wholename '*/test_results/*' -delete - sudo rm -rf ${{ env.BASEDIR }}/target_ws/src - du -sh ${{ env.BASEDIR }}/target_ws diff --git a/.github/workflows/reusable-ros-tooling-source-build.yml b/.github/workflows/reusable-ros-tooling-source-build.yml deleted file mode 100644 index 20c619b..0000000 --- a/.github/workflows/reusable-ros-tooling-source-build.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: Reusable industrial_ci Workflow with Cache -# Reusable action to simplify dealing with ROS/ROS2 industrial_ci builds with cache -# author: Denis Štogl - -on: - workflow_call: - inputs: - ros_distro: - description: 'ROS2 distribution name' - required: true - type: string - ref: - description: 'Reference on which the repo should be checkout. Usually is this name of a branch or a tag.' - required: true - type: string - ros2_repo_branch: - description: 'Branch in the ros2/ros2 repository from which ".repos" should be used. Possible values: master (Rolling), humble, jazzy.' - default: 'master' - required: false - type: string - -jobs: - reusable_ros_tooling_source_build: - name: ${{ inputs.ros_distro }} ubuntu-24.04 - runs-on: ubuntu-24.04 - strategy: - fail-fast: false - steps: - - uses: ros-tooling/setup-ros@v0.7 - with: - required-ros-distributions: ${{ inputs.ros_distro }} - - uses: actions/checkout@v7 - with: - ref: ${{ inputs.ref }} - - uses: ros-tooling/action-ros-ci@v0.4 - with: - target-ros2-distro: ${{ inputs.ros_distro }} - # build all packages listed in the meta package - package-name: - picknik_reset_fault_controller - - vcs-repo-file-url: | - https://raw.githubusercontent.com/ros2/ros2/${{ inputs.ros2_repo_branch }}/ros2.repos - https://raw.githubusercontent.com/${{ github.repository }}/${{ github.sha }}/picknik_controllers.${{ inputs.ros_distro }}.repos?token=${{ secrets.GITHUB_TOKEN }} - colcon-mixin-repository: https://raw.githubusercontent.com/colcon/colcon-mixin-repository/master/index.yaml - - uses: actions/upload-artifact@v7 - with: - name: colcon-logs-ubuntu-24.04 - path: ros_ws/log diff --git a/.github/workflows/rolling-binary-build-main.yml b/.github/workflows/rolling-binary-build-main.yml deleted file mode 100644 index 9d29b60..0000000 --- a/.github/workflows/rolling-binary-build-main.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Rolling Binary Build - main -# author: Denis Štogl -# description: 'Build & test all dependencies from released (binary) packages.' - -on: - workflow_dispatch: - branches: - - main - pull_request: - branches: - - main - push: - branches: - - main - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '03 1 * * *' - -jobs: - binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: rolling - ros_repo: main - upstream_workspace: picknik_controllers-not-released.rolling.repos - ref_for_scheduled_build: main diff --git a/.github/workflows/rolling-binary-build-testing.yml b/.github/workflows/rolling-binary-build-testing.yml deleted file mode 100644 index bf9ace9..0000000 --- a/.github/workflows/rolling-binary-build-testing.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Rolling Binary Build - testing -# author: Denis Štogl -# description: 'Build & test all dependencies from released (binary) packages.' - -on: - workflow_dispatch: - branches: - - main - pull_request: - branches: - - main - push: - branches: - - main - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '03 1 * * *' - -jobs: - binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: rolling - ros_repo: testing - upstream_workspace: picknik_controllers-not-released.rolling.repos - ref_for_scheduled_build: main diff --git a/.github/workflows/rolling-semi-binary-build-main.yml b/.github/workflows/rolling-semi-binary-build-main.yml deleted file mode 100644 index 7eb34ae..0000000 --- a/.github/workflows/rolling-semi-binary-build-main.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Rolling Semi-Binary Build - main -# description: 'Build & test that compiles the main dependencies from source.' - -on: - workflow_dispatch: - branches: - - main - pull_request: - branches: - - main - push: - branches: - - main - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '33 1 * * *' - -jobs: - semi_binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: rolling - ros_repo: main - upstream_workspace: picknik_controllers.rolling.repos - ref_for_scheduled_build: main diff --git a/.github/workflows/rolling-semi-binary-build-testing.yml b/.github/workflows/rolling-semi-binary-build-testing.yml deleted file mode 100644 index e5754af..0000000 --- a/.github/workflows/rolling-semi-binary-build-testing.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Rolling Semi-Binary Build - testing -# description: 'Build & test that compiles the main dependencies from source.' - -on: - workflow_dispatch: - branches: - - main - pull_request: - branches: - - main - push: - branches: - - main - schedule: - # Run every morning to detect flakiness and broken dependencies - - cron: '33 1 * * *' - -jobs: - semi_binary: - uses: ./.github/workflows/reusable-industrial-ci-with-cache.yml - with: - ros_distro: rolling - ros_repo: testing - upstream_workspace: picknik_controllers.rolling.repos - ref_for_scheduled_build: main diff --git a/.github/workflows/rolling-source-build.yml b/.github/workflows/rolling-source-build.yml deleted file mode 100644 index 6306dc6..0000000 --- a/.github/workflows/rolling-source-build.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Rolling Source Build -on: - workflow_dispatch: - branches: - - main - push: - branches: - - main - schedule: - # Run every day to detect flakiness and broken dependencies - - cron: '03 3 * * *' - -jobs: - source: - uses: ./.github/workflows/reusable-ros-tooling-source-build.yml - with: - ros_distro: rolling - ref: main - ros2_repo_branch: rolling diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..6f63de9 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,13 @@ +Any contribution that you make to this repository will +be under the Apache 2 License, as dictated by that +[license](http://www.apache.org/licenses/LICENSE-2.0.html): + +~~~ +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. +~~~ diff --git a/picknik_controllers-not-released.humble.repos b/picknik_controllers-not-released.humble.repos deleted file mode 100644 index 1b3910e..0000000 --- a/picknik_controllers-not-released.humble.repos +++ /dev/null @@ -1,6 +0,0 @@ -repositories: - ## EXAMPLE DEPENDENCY -# : -# type: git -# url: git@github.com:/.git -# version: master diff --git a/picknik_controllers-not-released.jazzy.repos b/picknik_controllers-not-released.jazzy.repos deleted file mode 100644 index 1b3910e..0000000 --- a/picknik_controllers-not-released.jazzy.repos +++ /dev/null @@ -1,6 +0,0 @@ -repositories: - ## EXAMPLE DEPENDENCY -# : -# type: git -# url: git@github.com:/.git -# version: master diff --git a/picknik_controllers-not-released.kilted.repos b/picknik_controllers-not-released.kilted.repos deleted file mode 100644 index 1b3910e..0000000 --- a/picknik_controllers-not-released.kilted.repos +++ /dev/null @@ -1,6 +0,0 @@ -repositories: - ## EXAMPLE DEPENDENCY -# : -# type: git -# url: git@github.com:/.git -# version: master diff --git a/picknik_controllers-not-released.rolling.repos b/picknik_controllers-not-released.rolling.repos deleted file mode 100644 index 1b3910e..0000000 --- a/picknik_controllers-not-released.rolling.repos +++ /dev/null @@ -1,6 +0,0 @@ -repositories: - ## EXAMPLE DEPENDENCY -# : -# type: git -# url: git@github.com:/.git -# version: master diff --git a/picknik_controllers.humble.repos b/picknik_controllers.humble.repos deleted file mode 100644 index 1b3910e..0000000 --- a/picknik_controllers.humble.repos +++ /dev/null @@ -1,6 +0,0 @@ -repositories: - ## EXAMPLE DEPENDENCY -# : -# type: git -# url: git@github.com:/.git -# version: master diff --git a/picknik_controllers.jazzy.repos b/picknik_controllers.jazzy.repos deleted file mode 100644 index 1b3910e..0000000 --- a/picknik_controllers.jazzy.repos +++ /dev/null @@ -1,6 +0,0 @@ -repositories: - ## EXAMPLE DEPENDENCY -# : -# type: git -# url: git@github.com:/.git -# version: master diff --git a/picknik_controllers.kilted.repos b/picknik_controllers.kilted.repos deleted file mode 100644 index 1b3910e..0000000 --- a/picknik_controllers.kilted.repos +++ /dev/null @@ -1,6 +0,0 @@ -repositories: - ## EXAMPLE DEPENDENCY -# : -# type: git -# url: git@github.com:/.git -# version: master diff --git a/picknik_controllers.rolling.repos b/picknik_controllers.rolling.repos deleted file mode 100644 index 1b3910e..0000000 --- a/picknik_controllers.rolling.repos +++ /dev/null @@ -1,6 +0,0 @@ -repositories: - ## EXAMPLE DEPENDENCY -# : -# type: git -# url: git@github.com:/.git -# version: master From eb1a6fd10c6ea62dc8c41b8ec8a9bd5cbe6eaf93 Mon Sep 17 00:00:00 2001 From: Nathan Brooks Date: Mon, 3 Aug 2026 00:19:46 -0600 Subject: [PATCH 2/3] ci: give each ABI check job a distinct name All three ABI workflows used the bare job id `abi_check` with no `name:`, so all three reported as a check literally called `abi_check`. Branch protection matches required status checks on the name string, so three identically-named checks cannot be told apart -- there is no way to require jazzy's and kilted's while leaving rolling's optional. Names them jazzy-abi / kilted-abi / rolling-abi to match the build jobs' style. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/jazzy-abi-compatibility.yml | 1 + .github/workflows/kilted-abi-compatibility.yml | 1 + .github/workflows/rolling-abi-compatibility.yml | 1 + 3 files changed, 3 insertions(+) diff --git a/.github/workflows/jazzy-abi-compatibility.yml b/.github/workflows/jazzy-abi-compatibility.yml index 9f05516..55280be 100644 --- a/.github/workflows/jazzy-abi-compatibility.yml +++ b/.github/workflows/jazzy-abi-compatibility.yml @@ -9,6 +9,7 @@ on: jobs: abi_check: + name: jazzy-abi runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 diff --git a/.github/workflows/kilted-abi-compatibility.yml b/.github/workflows/kilted-abi-compatibility.yml index 7107e13..1d1f496 100644 --- a/.github/workflows/kilted-abi-compatibility.yml +++ b/.github/workflows/kilted-abi-compatibility.yml @@ -9,6 +9,7 @@ on: jobs: abi_check: + name: kilted-abi runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 diff --git a/.github/workflows/rolling-abi-compatibility.yml b/.github/workflows/rolling-abi-compatibility.yml index 6aca22e..e5e918e 100644 --- a/.github/workflows/rolling-abi-compatibility.yml +++ b/.github/workflows/rolling-abi-compatibility.yml @@ -9,6 +9,7 @@ on: jobs: abi_check: + name: rolling-abi runs-on: ubuntu-latest # Non-blocking while Rolling completes its Noble → Resolute base-OS transition. # Some Rolling-on-Resolute packages currently only exist in ros2-testing apt. From 5741677f363b8cb843809c5e04596e8c14ef4713 Mon Sep 17 00:00:00 2001 From: Nathan Brooks Date: Mon, 3 Aug 2026 00:28:31 -0600 Subject: [PATCH 3/3] ci: restore the three-tier dependency-breakage ladder, wired up this time The previous commit collapsed the matrix to tier 1 and lost the point of the original layout: the binary / semi-binary / source split is an escalating lookahead for *incoming* upstream breakage, not redundancy. Restores it. Tier 1 -- binary, `main` apt: can a user build this today? jazzy, kilted (+ccov), lyrical. Only these gate merges. Tier 2 -- binary, `testing` apt: what breaks at the next sync? jazzy, kilted, lyrical, rolling. Non-blocking on purpose -- an upstream regression staged for release is something to see, not something that should block an unrelated PR. This repo has already had a "7 PRs blocked on an ecosystem break" episode. Tier 3 -- semi-binary: what breaks in the mid future? Core ROS from debs, but ros2_control and realtime_tools built from their development branches. Tier 3 has never actually worked here. `picknik_controllers.rolling.repos` was an entirely commented-out placeholder, so the semi-binary job was byte-identical to the binary job -- the middle rung reported green while testing nothing. It is now populated with the two immediate non-core dependencies, which makes this the tier that would have caught LoanedCommandInterface::get_value() being removed, weeks before it surfaced as a buildfarm release failure. Carries the `AFTER_INIT` safe.directory workaround, which is required once an upstream_ws cache exists (moveit_visual_tools#157 hit this) and was correctly unnecessary while there was no real UPSTREAM_WORKSPACE. The old source-build tier stays dropped. It was permanently red for a reason unrelated to its value -- it fetched its .repos with the deprecated `?token=` URL syntax and 404'd every run -- and rebuilding all of core ROS to test two controllers is poor value when tier 3 covers the deps that can realistically break us. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/README.md | 86 +++++++++++++++++++++----- .github/workflows/build_and_test.yaml | 87 +++++++++++++++++++++++---- picknik_controllers.rolling.repos | 19 ++++++ 3 files changed, 163 insertions(+), 29 deletions(-) create mode 100644 picknik_controllers.rolling.repos diff --git a/.github/workflows/README.md b/.github/workflows/README.md index a696de6..3d92e0e 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -10,25 +10,74 @@ | [`rolling-abi-compatibility.yml`](rolling-abi-compatibility.yml) | PR to `main` | no | ABI diff vs. the base branch | | [`prerelease-check.yml`](prerelease-check.yml) | manual | n/a | `industrial_ci` `PRERELEASE: true` — buildfarm dry-run before tagging | -## Build matrix +## The three build tiers -`build_and_test.yaml` runs one `industrial_ci` job per distro: +`build_and_test.yaml` keeps the escalating-lookahead ladder from the original +stogl-robotics layout — each tier looks further into the future than the last — +but as one matrix instead of 20 files. -| Job | apt repo | Base OS | Blocking | -|---|---|---|---| -| `jazzy-main` | `main` | noble | yes | -| `kilted-main + ccov` | `main` | noble | yes | -| `lyrical-main` | `main` | **resolute** | **yes** | -| `rolling-testing` | `testing` | **resolute** | no | +### Tier 1 — binary: released debs (`main` apt) + +*"Can a user build this today?"* **These are the only jobs that gate merges.** + +| Job | Base OS | +|---|---| +| `jazzy-main` | noble | +| `kilted-main + ccov` | noble | +| **`lyrical-main`** | **resolute** | `lyrical` is the Resolute gate. It is a released distro, so its `main` apt is -populated and every dependency this repo has is available there. Rolling is -non-blocking because Rolling's `main` apt has no Resolute packages yet, so it -tracks `testing` instead. +populated, and every dependency this repo has is available there — +`ros2_control` 6.8.0, `realtime_tools` 5.2.0. This is the job that would have +caught the break that got us un-released from rolling. + +### Tier 2 — binary against `testing` apt + +*"What breaks at the next sync?"* `jazzy-testing`, `kilted-testing`, +`lyrical-testing`, `rolling-testing`. All non-blocking. + +Rolling appears only at this tier, because Rolling's `main` apt has no Resolute +packages yet. + +Non-blocking is deliberate: an upstream regression staged for release is +something we want to *see*, not something that should block an unrelated PR. +This repo has already been through one "7 PRs blocked on an ecosystem break" +episode. + +### Tier 3 — semi-binary: immediate dependencies from source -Coverage runs on `kilted` rather than on `rolling`: coverage attached to a -non-blocking job silently stops reporting whenever that job breaks, and rolling -breakage is precisely what this repo keeps hitting. +*"What breaks in the mid future?"* `rolling-testing + upstream-source`. +Non-blocking. + +Core ROS still comes from debs, but our immediate dependencies — `ros2_control` +and `realtime_tools` — are built from their development branches, listed in +[`picknik_controllers.rolling.repos`](../../picknik_controllers.rolling.repos). +This fails weeks before a breaking upstream change reaches any apt repo. + +**This tier previously reported green without testing anything.** Its `.repos` +file was an entirely commented-out placeholder, which made the semi-binary job +byte-identical to the binary job. Wiring it up is what makes the ladder real. +It is the tier that would have caught +`LoanedCommandInterface::get_value()` being removed, months before it surfaced +as a buildfarm release failure. + +Adding the same lookahead for another distro is one more matrix entry plus a +`picknik_controllers..repos`. + +### What was dropped + +The old **source-build** tier (core ROS itself from source, via +`ros-tooling/action-ros-ci`) is gone. It was permanently red regardless of +tier value: it fetched its `.repos` with the deprecated `?token=` URL syntax +and got an HTTP 404 on every run. Rebuilding all of core ROS to test two +controllers is also poor value — tier 3 already covers the dependencies that +can realistically break us. + +## Coverage + +Runs on `kilted` (tier 1), not on rolling. Coverage attached to a non-blocking +job silently stops reporting whenever that job breaks, and rolling breakage is +precisely what this repo keeps hitting. ## Branches @@ -47,5 +96,10 @@ Deliberate. GitHub auto-disables cron-triggered workflows after 60 days of repo inactivity, and it disables the **whole** workflow, not just the cron trigger. That is what silently took all 20 of this repo's previous build workflows offline between 2026-03 and 2026-08 — every workflow with a `schedule:` was disabled, and -every workflow without one survived. Nightly dependency-rot detection is not worth -losing PR coverage to. +every workflow without one survived. + +This does cost nightly dependency-rot detection, which is what the cron was for. +The tiers above still catch the same breakages, just on PR and push rather than +on a timer. If a timer is wanted back, it should live somewhere that cannot +disable the PR gate with it — a separate repository-dispatch or a scheduled +workflow that only runs the non-blocking tiers. diff --git a/.github/workflows/build_and_test.yaml b/.github/workflows/build_and_test.yaml index 17d8412..8f7deb9 100644 --- a/.github/workflows/build_and_test.yaml +++ b/.github/workflows/build_and_test.yaml @@ -1,10 +1,15 @@ # This config uses industrial_ci (https://github.com/ros-industrial/industrial_ci.git). # For troubleshooting, see readme (https://github.com/ros-industrial/industrial_ci/blob/master/README.rst) # -# Replaces 20 per-distro workflow files and 2 reusable workflows. Deliberately -# has NO `schedule:` trigger: GitHub auto-disables cron-triggered workflows after -# 60 days of repo inactivity, which is what silently took every build job in this -# repo offline between 2026-03 and 2026-08. +# Replaces 20 per-distro workflow files and 2 reusable workflows with one matrix. +# +# Deliberately has NO `schedule:` trigger. GitHub auto-disables cron-triggered +# workflows after 60 days of repo inactivity, and it disables the whole workflow, +# not just the cron -- which is what silently took every build job in this repo +# offline between 2026-03 and 2026-08. +# +# The three-tier lookahead from the original stogl-robotics layout is preserved +# and, for the first time, actually functional. See .github/workflows/README.md. name: Build and Test @@ -25,9 +30,15 @@ jobs: fail-fast: false matrix: env: + # --------------------------------------------------------------- + # Tier 1 -- binary: build against released debs in `main` apt. + # "Can a user build this today?" These are the jobs that gate merges. + # --------------------------------------------------------------- + # # humble is NOT built here. `main` dropped humble support in 49a5270 - # after the ros2_control API break; humble is served by the `humble` - # branch and its own workflow. + # after the ros2_control API break -- humble's hardware_interface has + # no `get_optional()`. humble is served by the `humble` branch and its + # own workflow. # # This is meant to be temporary. Once `main` carries source-level # compatibility guards per moveit2#3751, humble comes back as one more @@ -46,13 +57,46 @@ jobs: - ROS_DISTRO: lyrical ROS_REPO: main OS_CODE_NAME: resolute - # Rolling's `main` apt has no Resolute packages yet, so track - # `testing`. Pin OS_CODE_NAME rather than trusting industrial_ci's - # default, which has moved once already. Non-blocking until Rolling - # promotes to main apt; lyrical above is the gate that must stay green. + + # --------------------------------------------------------------- + # Tier 2 -- binary against `testing` apt: what breaks at the NEXT + # sync. Non-blocking on purpose: an upstream regression staged for + # release is something we want to see, not something that should + # block an unrelated PR. This repo has already been through a + # "7 PRs blocked on an ecosystem break" episode. + # --------------------------------------------------------------- + - ROS_DISTRO: jazzy + ROS_REPO: testing + NONBLOCKING: true + - ROS_DISTRO: kilted + ROS_REPO: testing + NONBLOCKING: true + - ROS_DISTRO: lyrical + ROS_REPO: testing + OS_CODE_NAME: resolute + NONBLOCKING: true + # Rolling's `main` apt has no Resolute packages yet, so rolling only + # exists at this tier. Pin OS_CODE_NAME rather than trusting + # industrial_ci's default, which has moved once already. + - ROS_DISTRO: rolling + ROS_REPO: testing + OS_CODE_NAME: resolute + NONBLOCKING: true + + # --------------------------------------------------------------- + # Tier 3 -- semi-binary: core ROS from debs, but our *immediate* + # dependencies (ros2_control, realtime_tools) built from their + # development branches. This is the mid-future signal: it fails weeks + # before a breaking upstream change reaches any apt repo. + # + # This is the tier that would have caught the removal of + # LoanedCommandInterface::get_value() ahead of time instead of at + # buildfarm-release time. + # --------------------------------------------------------------- - ROS_DISTRO: rolling ROS_REPO: testing OS_CODE_NAME: resolute + UPSTREAM_WORKSPACE: picknik_controllers.rolling.repos NONBLOCKING: true env: @@ -60,11 +104,19 @@ jobs: TARGET_CMAKE_ARGS: > -DCMAKE_BUILD_TYPE=${{ matrix.env.CCOV && 'Debug' || 'Release'}} ${{ matrix.env.CCOV && '-DCMAKE_CXX_FLAGS="--coverage" --no-warn-unused-cli' || '' }} + # Only meaningful for the tier-3 job. `upstream_ws` is restored from cache + # with different ownership than the container user, so vcs trips git's + # dubious-ownership check. Written directly rather than via `git config` + # because git is not installed yet at AFTER_INIT on a bare OS image. + AFTER_INIT: printf '[safe]\n\tdirectory = *\n' >> ~/.gitconfig + # Refresh the cached upstream checkout. Drift is desirable here -- tracking + # the upstream development branches is the entire point of tier 3. + AFTER_SETUP_UPSTREAM_WORKSPACE: ${{ matrix.env.UPSTREAM_WORKSPACE && 'vcs pull $BASEDIR/upstream_ws/src' || '' }} CCACHE_DIR: ${{ github.workspace }}/.ccache BASEDIR: ${{ github.workspace }}/.work - CACHE_PREFIX: ${{ matrix.env.ROS_DISTRO }}-${{ matrix.env.ROS_REPO }}${{ matrix.env.CCOV && '-ccov' || '' }} + CACHE_PREFIX: ${{ matrix.env.ROS_DISTRO }}-${{ matrix.env.ROS_REPO }}${{ matrix.env.UPSTREAM_WORKSPACE && '-upstream' || '' }}${{ matrix.env.CCOV && '-ccov' || '' }} - name: "${{ matrix.env.ROS_DISTRO }}-${{ matrix.env.ROS_REPO }}${{ matrix.env.CCOV && ' + ccov' || ''}}" + name: "${{ matrix.env.ROS_DISTRO }}-${{ matrix.env.ROS_REPO }}${{ matrix.env.UPSTREAM_WORKSPACE && ' + upstream-source' || '' }}${{ matrix.env.CCOV && ' + ccov' || ''}}" runs-on: ubuntu-latest # Valid here because this is a step-based job. It is silently ignored on a # job that calls a reusable workflow via `uses:` -- the trap that broke @@ -72,6 +124,15 @@ jobs: continue-on-error: ${{ matrix.env.NONBLOCKING || false }} steps: - uses: actions/checkout@v4 + - name: cache upstream_ws + if: ${{ matrix.env.UPSTREAM_WORKSPACE }} + uses: actions/cache@v4 + with: + save-always: true + path: ${{ env.BASEDIR }}/upstream_ws + key: upstream_ws-${{ env.CACHE_PREFIX }}-${{ hashFiles(matrix.env.UPSTREAM_WORKSPACE) }}-${{ github.run_id }} + restore-keys: | + upstream_ws-${{ env.CACHE_PREFIX }}-${{ hashFiles(matrix.env.UPSTREAM_WORKSPACE) }} # The target directory cache doesn't include the source directory because # that comes from the checkout. See "prepare target_ws for cache" below. - name: cache target_ws @@ -99,7 +160,7 @@ jobs: uses: actions/upload-artifact@v4 if: failure() with: - name: test-results-${{ matrix.env.ROS_DISTRO }}-${{ matrix.env.ROS_REPO }} + name: test-results-${{ matrix.env.ROS_DISTRO }}-${{ matrix.env.ROS_REPO }}${{ matrix.env.UPSTREAM_WORKSPACE && '-upstream' || '' }} path: ${{ env.BASEDIR }}/target_ws/**/test_results/**/*.xml - name: upload codecov report uses: codecov/codecov-action@v4 diff --git a/picknik_controllers.rolling.repos b/picknik_controllers.rolling.repos new file mode 100644 index 0000000..ca35d4b --- /dev/null +++ b/picknik_controllers.rolling.repos @@ -0,0 +1,19 @@ +# Immediate dependencies of picknik_reset_fault_controller and +# picknik_twist_controller, pulled from their development branches for the +# tier-3 "semi-binary" job in .github/workflows/build_and_test.yaml. +# +# Everything else these packages depend on (rclcpp, geometry_msgs, +# example_interfaces) is core ROS and comes from debs. +# +# This file was previously a commented-out placeholder, which made the +# semi-binary job byte-identical to the binary job -- the middle rung of the +# lookahead ladder reported green without testing anything. +repositories: + ros2_control: + type: git + url: https://github.com/ros-controls/ros2_control.git + version: master + realtime_tools: + type: git + url: https://github.com/ros-controls/realtime_tools.git + version: master