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) | [![Rolling Binary Build](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/rolling-binary-build-main.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/rolling-binary-build-main.yml?branch=main)
[![Rolling Binary Build](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/rolling-binary-build-testing.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/rolling-binary-build-testing.yml?branch=main)
[![Rolling Semi-Binary Build](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/rolling-semi-binary-build-main.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/rolling-semi-binary-build-main.yml?branch=main)
[![Rolling Semi-Binary Build](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/rolling-semi-binary-build-testing.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/rolling-semi-binary-build-testing.yml?branch=main)
[![Rolling Source Build](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/rolling-source-build.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/rolling-source-build.yml?branch=main) | [![Doxygen Doc Deployment](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/doxygen-deploy.yml/badge.svg)](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) | [![Humble Binary Build](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/humble-binary-build-main.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/humble-binary-build-main.yml?branch=main)
[![Humble Binary Build](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/humble-binary-build-testing.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/humble-binary-build-testing.yml?branch=main)
[![Humble Semi-Binary Build](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/humble-semi-binary-build-main.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/humble-semi-binary-build-main.yml?branch=main)
[![Humble Semi-Binary Build](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/humble-semi-binary-build-testing.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/humble-semi-binary-build-testing.yml?branch=main)
[![Humble Source Build](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/humble-source-build.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/humble-source-build.yml?branch=main) | [![Doxygen Doc Deployment](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/doxygen-deploy.yml/badge.svg)](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) | [![Iron Binary Build](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/iron-binary-build-main.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/iron-binary-build-main.yml?branch=main)
[![Iron Binary Build](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/iron-binary-build-testing.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/iron-binary-build-testing.yml?branch=main)
[![Iron Semi-Binary Build](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/iron-semi-binary-build-main.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/iron-semi-binary-build-main.yml?branch=main)
[![Iron Semi-Binary Build](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/iron-semi-binary-build-testing.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/iron-semi-binary-build-testing.yml?branch=main)
[![Iron Source Build](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/iron-source-build.yml/badge.svg?branch=main)](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/iron-source-build.yml?branch=main) | [![Doxygen Doc Deployment](https://github.com/PickNikRobotics/ros2_robotiq_gripper/actions/workflows/doxygen-deploy.yml/badge.svg)](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