diff --git a/.github/workflows/README.md b/.github/workflows/README.md
index 103f7ad..e2c1ed3 100644
--- a/.github/workflows/README.md
+++ b/.github/workflows/README.md
@@ -1,72 +1,64 @@
+# CI overview
-ROS2 Distro | Branch | Build status | Documentation | Released packages
-:---------: | :----: | :----------: | :-----------: | :---------------:
-**Rolling** | [`rolling`](https://github.com/PickNikRobotics/ros2_robotiq_gripper/tree/rolling) | [](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/rolling-binary-build-main.yml?branch=main)
[](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/rolling-binary-build-testing.yml?branch=main)
[](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/rolling-semi-binary-build-main.yml?branch=main)
[](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/rolling-semi-binary-build-testing.yml?branch=main)
[](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/rolling-source-build.yml?branch=main) | [](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/doxygen-deploy.yml)
[Generated Doc](https://PickNikRobotics.github.io/ros2_robotiq_gripper_Documentation/rolling/html/index.html) | [ros2_robotiq_gripper](https://index.ros.org/p/ros2_robotiq_gripper/#rolling)
+| Workflow | Trigger | Blocking | What it covers |
+|---|---|---|---|
+| [`build_and_test.yaml`](build_and_test.yaml) | PR to `main`, push, nightly, manual | see below | binary + semi-binary tiers across every distro `main` serves |
+| [`rolling-source-build.yml`](rolling-source-build.yml) | push, nightly, manual | no | source tier — core ROS from source |
+| [`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** |
+| [`ci-coverage-build.yml`](ci-coverage-build.yml) | PR to `main`, manual | no | coverage — currently broken, see below |
+| [`prerelease-check.yml`](prerelease-check.yml) | manual | n/a | `industrial_ci` `PRERELEASE: true` — buildfarm dry-run before tagging |
-## Build status
+## The tiers
+Two knobs, not one ladder.
-### Explanation of different build types
+**How much is built from source:**
-**NOTE**: There are three build stages checking current and future compatibility of the package.
+| Tier | Core ROS | Our immediate deps | `.repos` used |
+|---|---|---|---|
+| binary | deb | **deb** | `ros2_robotiq_gripper-not-released..repos` |
+| semi-binary | deb | **source** (dev branches) | `ros2_robotiq_gripper.rolling.repos` |
+| source | **source** | source | `ros2.repos` + the above |
-[Detailed build status](.github/workflows/README.md)
+**Which apt repo the debs come from:** `main` (what users install today) or `testing` (staged for the next sync).
-1. Binary builds - against released packages (main and testing) in ROS distributions. Shows that direct local build is possible.
+Both `.repos` files carry `serial`, because [wjwwood/serial was never released to ROS 2](https://github.com/PickNikRobotics/ros2_robotiq_gripper/issues/21) — there is no rosdep key, so it has to be a source checkout even in the binary tier. That is also why `robotiq_driver` is not in the released package set; only `robotiq_controllers` and `robotiq_description` are bloomed.
- Uses repos file: `$NAME$-not-released..repos`
+## Matrix
-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.
+| Job | apt | Base OS | Blocking |
+|---|---|---|---|
+| `jazzy-main` | main | noble | ✅ |
+| `kilted-main` | main | noble | ✅ |
+| **`lyrical-main`** | main | **resolute** | **✅** |
+| `rolling-main` | main | resolute | ❌ |
+| `jazzy-testing` | testing | noble | ❌ |
+| `kilted-testing` | testing | noble | ❌ |
+| `lyrical-testing` | testing | resolute | ❌ |
+| `rolling-testing` | testing | resolute | ✅ |
+| `rolling-main + upstream-source` | main | resolute | ❌ |
+| `rolling-testing + upstream-source` | testing | resolute | ❌ |
- Uses repos file: `$NAME$.repos`
+**lyrical is the Resolute gate.** It is Ubuntu Resolute *and* released, so its `main` apt is populated (`ros2_control` 6.8.0). This repo is released to five distros but CI only ever built rolling — jazzy, kilted and lyrical all shipped untested, and lyrical is the one whose buildfarm is currently failing.
-1. Source build - also core ROS packages are build from source. It shows potential issues in the mid future.
+`rolling-main` is non-blocking because Rolling's `main` apt has no Resolute packages yet — the state [#129](https://github.com/PickNikRobotics/ros2_robotiq_gripper/pull/129) established. It will go green on its own once those promote out of `ros2-testing`.
-ROS2 Distro | Branch | Build status | Documentation | Released packages
-:---------: | :----: | :----------: | :-----------: | :---------------:
-**Humble** | [`humble`](https://github.com/PickNikRobotics/ros2_robotiq_gripper/tree/humble) | [](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/humble-binary-build-main.yml?branch=main)
[](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/humble-binary-build-testing.yml?branch=main)
[](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/humble-semi-binary-build-main.yml?branch=main)
[](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/humble-semi-binary-build-testing.yml?branch=main)
[](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/humble-source-build.yml?branch=main) | [](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/doxygen-deploy.yml)
[Generated Doc](https://PickNikRobotics.github.io/ros2_robotiq_gripper_Documentation/humble/html/index.html) | [ros2_robotiq_gripper](https://index.ros.org/p/ros2_robotiq_gripper/#humble)
+`rolling-testing` stays blocking: it is green today and has been this repo's de-facto Resolute gate.
-## Build status
+humble is absent because humble's `hardware_interface` has no `get_optional()`, which `main` requires. humble is served by the [`humble`](https://github.com/PickNikRobotics/ros2_robotiq_gripper/tree/humble) branch. Once `main` carries source-level distro guards per [moveit2#3751](https://github.com/moveit/moveit2/pull/3751), humble returns as one more matrix entry.
+## Why the semi-binary jobs are now non-blocking
-### Explanation of different build types
+They used to be blocking, but only because the tier was inert: `ros2_robotiq_gripper.rolling.repos` was byte-identical to the `-not-released` one, so semi-binary was an exact duplicate of binary and could never fail independently.
-**NOTE**: There are three build stages checking current and future compatibility of the package.
+It now builds `ros2_control` from `master`, which is the difference the tier exists for — `ros2_control` is released, so binary gets it from apt while semi-binary gets the development branch. That means it can go red on upstream's schedule rather than ours, which should not block a PR here.
-[Detailed build status](.github/workflows/README.md)
+This is the tier that would have caught `LoanedCommandInterface::get_value()` being removed, instead of it surfacing as a buildfarm release failure ([#109](https://github.com/PickNikRobotics/ros2_robotiq_gripper/issues/109)).
-1. Binary builds - against released packages (main and testing) in ROS distributions. Shows that direct local build is possible.
+## Known-broken, tracked separately
- Uses repos file: `$NAME$-not-released..repos`
+- **`ci-coverage-build.yml`** runs `ros-tooling/action-ros-ci` directly on a noble runner, outside a container, and has failed since Rolling moved to Resolute. Its own comment proposes the fix: move it inside `industrial_ci` with `OS_CODE_NAME: resolute`.
+- **`rolling-source-build.yml`** fetches its `.repos` with the deprecated `?token=` URL syntax and gets an HTTP 404 on every run, so the source tier has never actually executed. One-line fix (drop the token — this is a public repo).
-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/ros2_robotiq_gripper/tree/iron) | [](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/iron-binary-build-main.yml?branch=main)
[](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/iron-binary-build-testing.yml?branch=main)
[](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/iron-semi-binary-build-main.yml?branch=main)
[](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/iron-semi-binary-build-testing.yml?branch=main)
[](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/iron-source-build.yml?branch=main) | [](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/doxygen-deploy.yml)
[Generated Doc](https://PickNikRobotics.github.io/ros2_robotiq_gripper_Documentation/iron/html/index.html) | [ros2_robotiq_gripper](https://index.ros.org/p/ros2_robotiq_gripper/#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.
+Both are left alone here to keep this change scoped to distro coverage.
diff --git a/.github/workflows/build_and_test.yaml b/.github/workflows/build_and_test.yaml
new file mode 100644
index 0000000..02d63b7
--- /dev/null
+++ b/.github/workflows/build_and_test.yaml
@@ -0,0 +1,189 @@
+# 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 the four rolling binary/semi-binary workflow files and the
+# reusable-industrial-ci-with-cache.yml they called. The binary and semi-binary
+# tiers are preserved as-is -- this only widens distro coverage.
+#
+# This repo is released to humble, jazzy, kilted, lyrical and rolling, but CI
+# only ever built rolling. jazzy, kilted and lyrical shipped untested, and
+# lyrical is the one that matters right now: it is Ubuntu Resolute AND released,
+# and robotiq_controllers is currently red on its buildfarm.
+#
+# The source-build tier keeps its own workflow (rolling-source-build.yml); it
+# uses ros-tooling/action-ros-ci rather than industrial_ci.
+
+name: Build and Test
+
+on:
+ workflow_dispatch:
+ pull_request:
+ branches:
+ - main
+ push:
+ branches:
+ - main
+ schedule:
+ # Preserves the nightly cadence of the workflows this file replaces. Unlike
+ # picknik_controllers -- where cron-triggered workflows were silently
+ # auto-disabled after 60 days of repo inactivity, taking PR coverage with
+ # them -- these nightly runs are live and are currently the only working
+ # Resolute signal we have, so they are kept.
+ #
+ # The auto-disable risk is real but no longer silent: with these job names in
+ # the branch's required status checks, a disabled workflow makes PRs
+ # unmergeable rather than quietly unchecked.
+ - cron: '03 1 * * *'
+
+jobs:
+ industrial_ci:
+ strategy:
+ # Without this, one failing job cancels its siblings before they report.
+ fail-fast: false
+ matrix:
+ env:
+ # =============================================================
+ # binary -- our packages from source, everything else from debs.
+ # "Can a user build this today?"
+ # =============================================================
+ #
+ # humble is NOT built here. humble's hardware_interface has no
+ # get_optional(), which `main` requires; humble is served by the
+ # `humble` branch. Once `main` carries source-level distro guards per
+ # moveit2#3751, humble returns as one more entry in this list.
+ - ROS_DISTRO: jazzy
+ ROS_REPO: main
+ UPSTREAM_WORKSPACE: ros2_robotiq_gripper-not-released.jazzy.repos
+ - ROS_DISTRO: kilted
+ ROS_REPO: main
+ UPSTREAM_WORKSPACE: ros2_robotiq_gripper-not-released.kilted.repos
+ # lyrical is Ubuntu Resolute AND released, so its `main` apt is
+ # populated -- ros2_control 6.8.0 is there. This is the blocking
+ # Resolute gate, and the job that covers the distro whose buildfarm is
+ # currently failing.
+ - ROS_DISTRO: lyrical
+ ROS_REPO: main
+ OS_CODE_NAME: resolute
+ UPSTREAM_WORKSPACE: ros2_robotiq_gripper-not-released.lyrical.repos
+ # Rolling's `main` apt has no Resolute packages yet, so this stays
+ # non-blocking -- the state #129 established. It will go green on its
+ # own once those packages promote from ros2-testing to main.
+ - ROS_DISTRO: rolling
+ ROS_REPO: main
+ OS_CODE_NAME: resolute
+ UPSTREAM_WORKSPACE: ros2_robotiq_gripper-not-released.rolling.repos
+ NONBLOCKING: true
+
+ # binary against `testing` apt -- "what breaks at the next sync?"
+ # Non-blocking for the released distros: an upstream regression staged
+ # for release is something to see, not something that should block an
+ # unrelated PR. rolling-testing stays BLOCKING because it is green
+ # today and is this repo's established Resolute gate.
+ - ROS_DISTRO: jazzy
+ ROS_REPO: testing
+ UPSTREAM_WORKSPACE: ros2_robotiq_gripper-not-released.jazzy.repos
+ NONBLOCKING: true
+ - ROS_DISTRO: kilted
+ ROS_REPO: testing
+ UPSTREAM_WORKSPACE: ros2_robotiq_gripper-not-released.kilted.repos
+ NONBLOCKING: true
+ - ROS_DISTRO: lyrical
+ ROS_REPO: testing
+ OS_CODE_NAME: resolute
+ UPSTREAM_WORKSPACE: ros2_robotiq_gripper-not-released.lyrical.repos
+ NONBLOCKING: true
+ - ROS_DISTRO: rolling
+ ROS_REPO: testing
+ OS_CODE_NAME: resolute
+ UPSTREAM_WORKSPACE: ros2_robotiq_gripper-not-released.rolling.repos
+
+ # =============================================================
+ # semi-binary -- as before, rolling only. Core ROS from debs, but our
+ # immediate dependencies built from their development branches.
+ # "Is an upstream dep about to break us?"
+ #
+ # Both of these are non-blocking. They were blocking before, but only
+ # because the tier was inert: ros2_robotiq_gripper.rolling.repos was
+ # byte-identical to the -not-released one, so semi-binary was a
+ # duplicate of binary. Now that it genuinely tracks ros2_control's
+ # development branch it can go red on upstream's schedule rather than
+ # ours, which is not something that should block a PR here.
+ # =============================================================
+ - ROS_DISTRO: rolling
+ ROS_REPO: main
+ OS_CODE_NAME: resolute
+ UPSTREAM_WORKSPACE: ros2_robotiq_gripper.rolling.repos
+ SEMI_BINARY: true
+ NONBLOCKING: true
+ - ROS_DISTRO: rolling
+ ROS_REPO: testing
+ OS_CODE_NAME: resolute
+ UPSTREAM_WORKSPACE: ros2_robotiq_gripper.rolling.repos
+ SEMI_BINARY: true
+ NONBLOCKING: true
+
+ env:
+ # upstream_ws is restored from cache with different ownership than the
+ # container user, so vcs trips git's dubious-ownership check. Written
+ # directly because git is not installed yet at AFTER_INIT on a bare OS
+ # image (moveit_visual_tools#157 hit both halves of this).
+ AFTER_INIT: printf '[safe]\n\tdirectory = *\n' >> ~/.gitconfig
+ # Refresh the cached upstream checkout. For the semi-binary jobs drift is
+ # the point -- tracking upstream development branches is what the tier is
+ # for.
+ AFTER_SETUP_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.SEMI_BINARY && '-semi' || '' }}
+
+ name: "${{ matrix.env.ROS_DISTRO }}-${{ matrix.env.ROS_REPO }}${{ matrix.env.SEMI_BINARY && ' + upstream-source' || '' }}"
+ runs-on: ubuntu-latest
+ # Valid here because this is a step-based job. At the caller level of a
+ # `uses:` job it is silently ignored and invalidates the whole workflow --
+ # the trap #129 had to work around by plumbing it through as an input.
+ continue-on-error: ${{ matrix.env.NONBLOCKING || false }}
+ steps:
+ - uses: actions/checkout@v4
+ - name: cache upstream_ws
+ 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
+ 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 }}${{ matrix.env.SEMI_BINARY && '-semi' || '' }}
+ path: ${{ env.BASEDIR }}/target_ws/**/test_results/**/*.xml
+ - name: prepare target_ws for cache
+ if: ${{ always() }}
+ 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-ros-lint.yml b/.github/workflows/ci-ros-lint.yml
index 5092ab0..c72996f 100644
--- a/.github/workflows/ci-ros-lint.yml
+++ b/.github/workflows/ci-ros-lint.yml
@@ -1,41 +1,52 @@
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: robotiq_driver
- robotiq_controllers
- robotiq_description
-
- ament_lint_121:
- 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 its `main`-apt job is
+ # non-blocking while Rolling finishes the Resolute transition, 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 -- the same mismatch that has kept
+ # ci-coverage-build.yml red since the Resolute transition.
+ 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: ""
+ # Line length stays at 121 to match this repo's existing convention.
+ - linter: cpplint
+ apt: ament-cpplint
+ args: "--linelength=121 --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=121 --filter=-whitespace/newline"
- package-name: robotiq_driver
- robotiq_controllers
- robotiq_description
+ - uses: actions/checkout@v4
+ - name: install ament_${{ matrix.linter }}
+ run: |
+ apt-get update -qq
+ apt-get install -y -qq ros-lyrical-${{ matrix.apt }}
+ # Same three packages the previous config listed. robotiq_hardware_tests is
+ # excluded, as before.
+ - name: ament_${{ matrix.linter }}
+ shell: bash
+ run: |
+ source /opt/ros/lyrical/setup.bash
+ ament_${{ matrix.linter }} ${{ matrix.args }} \
+ robotiq_driver robotiq_controllers robotiq_description
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 c5f73f7..0000000
--- a/.github/workflows/reusable-industrial-ci-with-cache.yml
+++ /dev/null
@@ -1,101 +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
- continue_on_error:
- description: 'Whether job failure should be treated as workflow success. Useful for tracking-only jobs (e.g. Rolling on main apt during a base-OS transition).'
- default: false
- required: false
- type: boolean
-
-jobs:
- reusable_industrial_ci_with_cache:
- name: ${{ inputs.ros_distro }} ${{ inputs.ros_repo }} ${{ inputs.os_code_name }}
- runs-on: ubuntu-22.04
- continue-on-error: ${{ inputs.continue_on_error }}
- 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@v4
- - name: Checkout ${{ inputs.ref }} on scheduled build
- if: ${{ github.event_name == 'schedule' }}
- uses: actions/checkout@v4
- with:
- ref: ${{ inputs.ref_for_scheduled_build }}
- - name: cache target_ws
- if: ${{ ! matrix.env.CCOV }}
- uses: pat-s/always-upload-cache@v2.1.5
- 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@v2.1.5
- 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/rolling-binary-build-main.yml b/.github/workflows/rolling-binary-build-main.yml
deleted file mode 100644
index 1aadca6..0000000
--- a/.github/workflows/rolling-binary-build-main.yml
+++ /dev/null
@@ -1,31 +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: ros2_robotiq_gripper-not-released.rolling.repos
- ref_for_scheduled_build: main
- # Non-blocking while Rolling main apt catches up to the Noble → Resolute
- # base-OS transition. The rolling-binary-build-testing companion currently
- # passes (Rolling-on-Resolute packages live in ros2-testing apt); this job
- # will turn green on its own once those packages promote to main apt.
- continue_on_error: true
diff --git a/.github/workflows/rolling-binary-build-testing.yml b/.github/workflows/rolling-binary-build-testing.yml
deleted file mode 100644
index 6dde565..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: ros2_robotiq_gripper-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 3bd74aa..0000000
--- a/.github/workflows/rolling-semi-binary-build-main.yml
+++ /dev/null
@@ -1,30 +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: ros2_robotiq_gripper.rolling.repos
- ref_for_scheduled_build: main
- # Non-blocking while Rolling main apt catches up to the Noble → Resolute
- # base-OS transition. The rolling-semi-binary-build-testing companion
- # currently passes (Rolling-on-Resolute packages live in ros2-testing apt);
- # this job will turn green on its own once those packages promote to main.
- continue_on_error: true
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 185c981..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: ros2_robotiq_gripper.rolling.repos
- ref_for_scheduled_build: main
diff --git a/ros2_robotiq_gripper-not-released.jazzy.repos b/ros2_robotiq_gripper-not-released.jazzy.repos
new file mode 100644
index 0000000..22c492f
--- /dev/null
+++ b/ros2_robotiq_gripper-not-released.jazzy.repos
@@ -0,0 +1,12 @@
+# Dependencies that are not released as debs on any distro, so they must be
+# built from source even for the "binary" CI tier.
+#
+# wjwwood/serial was never released to ROS 2 (see issue #21), so there is no
+# rosdep key for it. robotiq_driver depends on it directly. This is also why
+# robotiq_driver is absent from the released package set -- only
+# robotiq_controllers and robotiq_description are bloomed.
+repositories:
+ serial:
+ type: git
+ url: https://github.com/tylerjw/serial.git
+ version: ros2
diff --git a/ros2_robotiq_gripper-not-released.kilted.repos b/ros2_robotiq_gripper-not-released.kilted.repos
new file mode 100644
index 0000000..22c492f
--- /dev/null
+++ b/ros2_robotiq_gripper-not-released.kilted.repos
@@ -0,0 +1,12 @@
+# Dependencies that are not released as debs on any distro, so they must be
+# built from source even for the "binary" CI tier.
+#
+# wjwwood/serial was never released to ROS 2 (see issue #21), so there is no
+# rosdep key for it. robotiq_driver depends on it directly. This is also why
+# robotiq_driver is absent from the released package set -- only
+# robotiq_controllers and robotiq_description are bloomed.
+repositories:
+ serial:
+ type: git
+ url: https://github.com/tylerjw/serial.git
+ version: ros2
diff --git a/ros2_robotiq_gripper-not-released.lyrical.repos b/ros2_robotiq_gripper-not-released.lyrical.repos
new file mode 100644
index 0000000..22c492f
--- /dev/null
+++ b/ros2_robotiq_gripper-not-released.lyrical.repos
@@ -0,0 +1,12 @@
+# Dependencies that are not released as debs on any distro, so they must be
+# built from source even for the "binary" CI tier.
+#
+# wjwwood/serial was never released to ROS 2 (see issue #21), so there is no
+# rosdep key for it. robotiq_driver depends on it directly. This is also why
+# robotiq_driver is absent from the released package set -- only
+# robotiq_controllers and robotiq_description are bloomed.
+repositories:
+ serial:
+ type: git
+ url: https://github.com/tylerjw/serial.git
+ version: ros2
diff --git a/ros2_robotiq_gripper.rolling.repos b/ros2_robotiq_gripper.rolling.repos
index 510d9bc..94f0f84 100644
--- a/ros2_robotiq_gripper.rolling.repos
+++ b/ros2_robotiq_gripper.rolling.repos
@@ -1,5 +1,25 @@
+# Sources for the "semi-binary" CI tier: core ROS still comes from debs, but our
+# immediate dependencies are built from their development branches. A failure
+# here means an upstream change is going to break us at the next sync.
+#
+# Until now this file was byte-identical to
+# ros2_robotiq_gripper-not-released.rolling.repos, which made the semi-binary
+# jobs exact duplicates of the binary jobs -- the tier reported green without
+# testing anything beyond what binary already covered. That happened because
+# `serial` is unreleased and so has to appear in both files, and no *released*
+# dependency was ever added here.
+#
+# ros2_control is the one that matters: it is released, so the binary tier gets
+# it from apt while this tier builds it from master. That difference is the
+# entire point of the tier. It is what would have caught
+# LoanedCommandInterface::get_value() being removed -- which instead surfaced as
+# a buildfarm release failure (issue #109).
repositories:
serial:
type: git
url: https://github.com/tylerjw/serial.git
version: ros2
+ ros2_control:
+ type: git
+ url: https://github.com/ros-controls/ros2_control.git
+ version: master