From 9edfd75cfd9444b244b83eecef335bda4371d340 Mon Sep 17 00:00:00 2001 From: Nathan Brooks Date: Sun, 2 Aug 2026 22:24:40 -0600 Subject: [PATCH 1/8] ci: cover kilted and lyrical, and add a real Resolute rolling job The ros2 branch is released to four distros but the matrix tests two: jazzy 0.1.5-1 jazzy-source kilted 0.1.5-1 NOT tested lyrical 0.1.5-3 NOT tested rolling 0.1.5-2 rolling-source -- see below (humble is released from its own branch and is not affected.) The rolling-source jobs do not test Resolute. With a prebuilt image, ROS_DISTRO: rolling does not imply Resolute -- the OS comes from the image, and moveit/moveit2:rolling-source is Ubuntu noble, built 2026-01-24, with MoveIt compiled inside it. Rolling moved to Resolute, so those jobs have been green while testing a distro/OS pairing that no longer ships. The tag will not refresh either: moveit2's docker.yaml has 12 successes to 85 failures, last success 2026-06-24. Rather than convert them, add bare-OS jobs alongside -- the same shape moveit2's own ci.yaml uses, where a non-blocking "rolling-resolute" job sits next to the prebuilt rolling-ci ones. That keeps ccov, clang-tidy and asan running against MoveIt main while giving the branch a Resolute signal it did not have. kilted-main noble blocking lyrical-main resolute non-blocking rolling-testing resolute non-blocking lyrical and rolling will both fail initially: E: Unable to locate package ros-lyrical-moveit-core Only moveit_common, moveit_configs_utils, moveit_msgs and moveit_resources are published for Resolute; moveit_core is not, which blocks every downstream package there on lyrical as well as rolling. Both jobs are non-blocking and start passing once moveit2 is released for Resolute. DOCKER_IMAGE moves out of the static job env into a step gated on `! matrix.env.OS_CODE_NAME`, since bare-OS jobs must leave it unset. CACHE_PREFIX and the job name fall back to - where IMAGE is absent. UNDERLAY already handled this correctly. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/ci.yaml | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8d01df822..87d23b418 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -34,22 +34,35 @@ jobs: -e LSAN_OPTIONS="suppressions=$PWD/.github/workflows/lsan.suppressions,fast_unwind_on_malloc=0" -e ASAN_OPTIONS="new_delete_type_mismatch=0,alloc_dealloc_mismatch=0" TARGET_CMAKE_ARGS: -DCMAKE_CXX_FLAGS="-fsanitize=address -fno-omit-frame-pointer -O1 -g" + - ROS_DISTRO: kilted + ROS_REPO: main + # moveit_core has no Resolute deb yet, so these two cannot pass until + # moveit2 is released for Resolute. Keep them non-blocking until then; + # they are the only jobs here that exercise Resolute at all. + - ROS_DISTRO: lyrical + ROS_REPO: main + OS_CODE_NAME: resolute + NONBLOCKING: true + - ROS_DISTRO: rolling + ROS_REPO: testing + OS_CODE_NAME: resolute + NONBLOCKING: true env: CLANG_TIDY_ARGS: -quiet -export-fixes ${{ github.workspace }}/.work/clang-tidy-fixes.yaml - DOCKER_IMAGE: moveit/moveit2:${{ matrix.env.IMAGE }} UNDERLAY: ${{ endsWith(matrix.env.IMAGE, '-source') && '/root/ws_moveit/install' || ''}} TARGET_CMAKE_ARGS: -DCMAKE_BUILD_TYPE=Release CCACHE_DIR: ${{ github.workspace }}/.ccache BASEDIR: ${{ github.workspace }}/.work - CACHE_PREFIX: "${{ matrix.env.IMAGE }}${{ contains(matrix.env.TARGET_CMAKE_ARGS, '--coverage') && '-ccov' || '' }}" + CACHE_PREFIX: "${{ matrix.env.IMAGE || format('{0}-{1}', matrix.env.ROS_DISTRO, matrix.env.ROS_REPO) }}${{ contains(matrix.env.TARGET_CMAKE_ARGS, '--coverage') && '-ccov' || '' }}" # perform full clang-tidy check only on manual trigger (workflow_dispatch), PRs do check changed files, otherwise nothing CLANG_TIDY_BASE_REF: ${{ github.event_name != 'workflow_dispatch' && (github.base_ref || github.ref) || '' }} CC: ${{ matrix.env.CLANG_TIDY && 'clang' }} CXX: ${{ matrix.env.CLANG_TIDY && 'clang++ -std=c++17' }} - name: "${{ matrix.env.IMAGE }}${{ matrix.env.NAME && ' • ' || ''}}${{ matrix.env.NAME }}${{ matrix.env.CLANG_TIDY && ' • clang-tidy' || '' }}" + name: "${{ matrix.env.IMAGE || format('{0}-{1}', matrix.env.ROS_DISTRO, matrix.env.ROS_REPO) }}${{ matrix.env.NAME && ' • ' || ''}}${{ matrix.env.NAME }}${{ matrix.env.CLANG_TIDY && ' • clang-tidy' || '' }}" runs-on: ubuntu-latest + continue-on-error: ${{ matrix.env.NONBLOCKING || false }} steps: - uses: actions/checkout@v6 with: @@ -66,6 +79,12 @@ jobs: env: GHA_CACHE_SAVE: always + # Jobs building on a bare OS image (OS_CODE_NAME set) must leave + # DOCKER_IMAGE unset so industrial_ci builds the base itself. + - name: Set prebuilt DOCKER_IMAGE + if: ${{ ! matrix.env.OS_CODE_NAME }} + run: echo "DOCKER_IMAGE=moveit/moveit2:${{ matrix.env.IMAGE }}" >> "$GITHUB_ENV" + - id: ici name: Run industrial_ci uses: rhaschke/industrial_ci@master From 163cb00b397b6d0089929e8e96162310e9b7ba12 Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Fri, 14 Aug 2026 03:23:45 +0200 Subject: [PATCH 2/8] cleanup --- .github/workflows/ci.yaml | 32 +++++++------------------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 87d23b418..71101885a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -19,12 +19,11 @@ jobs: fail-fast: false matrix: env: - - IMAGE: jazzy-source + - IMAGE: rolling-release NAME: ccov TARGET_CMAKE_ARGS: -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="--coverage" - - IMAGE: rolling-source CLANG_TIDY: pedantic - - IMAGE: rolling-source + - IMAGE: rolling-release NAME: asan # Add fast_unwind_on_malloc=0 to fix stacktraces being too short or do not make sense # see https://github.com/google/sanitizers/wiki/AddressSanitizer @@ -34,35 +33,24 @@ jobs: -e LSAN_OPTIONS="suppressions=$PWD/.github/workflows/lsan.suppressions,fast_unwind_on_malloc=0" -e ASAN_OPTIONS="new_delete_type_mismatch=0,alloc_dealloc_mismatch=0" TARGET_CMAKE_ARGS: -DCMAKE_CXX_FLAGS="-fsanitize=address -fno-omit-frame-pointer -O1 -g" - - ROS_DISTRO: kilted - ROS_REPO: main - # moveit_core has no Resolute deb yet, so these two cannot pass until - # moveit2 is released for Resolute. Keep them non-blocking until then; - # they are the only jobs here that exercise Resolute at all. - - ROS_DISTRO: lyrical - ROS_REPO: main - OS_CODE_NAME: resolute - NONBLOCKING: true - - ROS_DISTRO: rolling - ROS_REPO: testing - OS_CODE_NAME: resolute - NONBLOCKING: true + - IMAGE: lyrical-release + - IMAGE: jazzy-release env: CLANG_TIDY_ARGS: -quiet -export-fixes ${{ github.workspace }}/.work/clang-tidy-fixes.yaml + DOCKER_IMAGE: moveit/moveit2:${{ matrix.env.IMAGE }} UNDERLAY: ${{ endsWith(matrix.env.IMAGE, '-source') && '/root/ws_moveit/install' || ''}} TARGET_CMAKE_ARGS: -DCMAKE_BUILD_TYPE=Release CCACHE_DIR: ${{ github.workspace }}/.ccache BASEDIR: ${{ github.workspace }}/.work - CACHE_PREFIX: "${{ matrix.env.IMAGE || format('{0}-{1}', matrix.env.ROS_DISTRO, matrix.env.ROS_REPO) }}${{ contains(matrix.env.TARGET_CMAKE_ARGS, '--coverage') && '-ccov' || '' }}" + CACHE_PREFIX: "${{ matrix.env.IMAGE }}${{ contains(matrix.env.TARGET_CMAKE_ARGS, '--coverage') && '-ccov' || '' }}" # perform full clang-tidy check only on manual trigger (workflow_dispatch), PRs do check changed files, otherwise nothing CLANG_TIDY_BASE_REF: ${{ github.event_name != 'workflow_dispatch' && (github.base_ref || github.ref) || '' }} CC: ${{ matrix.env.CLANG_TIDY && 'clang' }} CXX: ${{ matrix.env.CLANG_TIDY && 'clang++ -std=c++17' }} - name: "${{ matrix.env.IMAGE || format('{0}-{1}', matrix.env.ROS_DISTRO, matrix.env.ROS_REPO) }}${{ matrix.env.NAME && ' • ' || ''}}${{ matrix.env.NAME }}${{ matrix.env.CLANG_TIDY && ' • clang-tidy' || '' }}" + name: "${{ matrix.env.IMAGE }}${{ matrix.env.NAME && ' • ' || ''}}${{ matrix.env.NAME }}${{ matrix.env.CLANG_TIDY && ' • clang-tidy' || '' }}" runs-on: ubuntu-latest - continue-on-error: ${{ matrix.env.NONBLOCKING || false }} steps: - uses: actions/checkout@v6 with: @@ -79,12 +67,6 @@ jobs: env: GHA_CACHE_SAVE: always - # Jobs building on a bare OS image (OS_CODE_NAME set) must leave - # DOCKER_IMAGE unset so industrial_ci builds the base itself. - - name: Set prebuilt DOCKER_IMAGE - if: ${{ ! matrix.env.OS_CODE_NAME }} - run: echo "DOCKER_IMAGE=moveit/moveit2:${{ matrix.env.IMAGE }}" >> "$GITHUB_ENV" - - id: ici name: Run industrial_ci uses: rhaschke/industrial_ci@master From 7ad2e081596570bcd54149becef1e04a20815aed Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Fri, 14 Aug 2026 04:13:48 +0200 Subject: [PATCH 3/8] Update GHA --- .github/workflows/ci.yaml | 4 ++-- .github/workflows/format.yaml | 6 +++--- .github/workflows/prerelease.yaml | 2 +- .pre-commit-config.yaml | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 71101885a..8bd2d966b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -52,7 +52,7 @@ jobs: name: "${{ matrix.env.IMAGE }}${{ matrix.env.NAME && ' • ' || ''}}${{ matrix.env.NAME }}${{ matrix.env.CLANG_TIDY && ' • clang-tidy' || '' }}" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: submodules: recursive @@ -107,7 +107,7 @@ jobs: lcov_capture_args: --ignore-errors=source,gcov,mismatch,negative ignore: '"*/target_ws/build/*" "*/target_ws/install/*" "*/test/*"' - name: Upload codecov report - uses: codecov/codecov-action@v6 + uses: codecov/codecov-action@v7 if: contains(matrix.env.TARGET_CMAKE_ARGS, '--coverage') && steps.ici.outputs.target_test_results == '0' with: files: ${{ env.BASEDIR }}/target_ws/coverage.info diff --git a/.github/workflows/format.yaml b/.github/workflows/format.yaml index 15cca2942..e5913ea7b 100644 --- a/.github/workflows/format.yaml +++ b/.github/workflows/format.yaml @@ -13,11 +13,11 @@ jobs: name: pre-commit runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: submodules: recursive - - name: Install clang-format-14 - run: sudo apt-get install clang-format-14 + - name: Install clang-format + run: sudo apt-get install clang-format - uses: pre-commit/action@v3.0.1 id: precommit - name: Upload pre-commit changes diff --git a/.github/workflows/prerelease.yaml b/.github/workflows/prerelease.yaml index 900db7253..110e588ed 100644 --- a/.github/workflows/prerelease.yaml +++ b/.github/workflows/prerelease.yaml @@ -34,7 +34,7 @@ jobs: # free up a lot of stuff from /usr/local sudo rm -rf /usr/local df -h - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: submodules: recursive - name: industrial_ci diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cde915455..844abaa7f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -39,7 +39,7 @@ repos: - id: clang-format name: clang-format description: Format files with ClangFormat. - entry: clang-format-14 + entry: clang-format language: system files: \.(c|cc|cxx|cpp|frag|glsl|h|hpp|hxx|ih|ispc|ipp|java|js|m|proto|vert)$ args: ["-fallback-style=none", "-i"] From ad2caa623ccc67a1da5f9eec611f9ce28ae0359d Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Fri, 14 Aug 2026 04:24:15 +0200 Subject: [PATCH 4/8] test-depend on ompl and stomp only --- core/package.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/package.xml b/core/package.xml index 9a437cb92..adf480887 100644 --- a/core/package.xml +++ b/core/package.xml @@ -37,7 +37,8 @@ launch_testing_ament_cmake moveit_resources_fanuc_moveit_config - moveit_planners + moveit_planners_ompl + moveit_planners_stomp ament_cmake From c4542545d64ab84653fe47165294a028f2aa033b Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Fri, 14 Aug 2026 04:35:11 +0200 Subject: [PATCH 5/8] clang-format adaptations --- core/include/moveit/task_constructor/stages/noop.h | 2 +- core/python/bindings/src/properties.cpp | 2 +- core/src/container.cpp | 5 ++--- core/test/test_move_relative.cpp | 10 ++++------ 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/core/include/moveit/task_constructor/stages/noop.h b/core/include/moveit/task_constructor/stages/noop.h index 9f770c773..71e3e8418 100644 --- a/core/include/moveit/task_constructor/stages/noop.h +++ b/core/include/moveit/task_constructor/stages/noop.h @@ -50,7 +50,7 @@ namespace stages { class NoOp : public PropagatingEitherWay { public: - NoOp(const std::string& name = "no-op") : PropagatingEitherWay(name){}; + NoOp(const std::string& name = "no-op") : PropagatingEitherWay(name) {}; private: bool compute(const InterfaceState& state, planning_scene::PlanningScenePtr& scene, SubTrajectory& /*trajectory*/, diff --git a/core/python/bindings/src/properties.cpp b/core/python/bindings/src/properties.cpp index 20d4ff674..a96b292e0 100644 --- a/core/python/bindings/src/properties.cpp +++ b/core/python/bindings/src/properties.cpp @@ -158,7 +158,7 @@ bool PropertyConverterBase::insert(const std::type_index& type_index, const std: return REGISTRY_SINGLETON.insert(type_index, ros_msg_name, to, from); } -__attribute__((visibility("default"))) // export this symbol as visible in the shared library +__attribute__((visibility("default"))) // export this symbol as visible in the shared library void export_properties(py::module& m) { // clang-format off py::classh(m, "Property", "Holds an arbitrarily typed value and a default value") diff --git a/core/src/container.cpp b/core/src/container.cpp index febc00fb9..797a6fb61 100644 --- a/core/src/container.cpp +++ b/core/src/container.cpp @@ -58,9 +58,8 @@ namespace task_constructor { // for debugging of how children interfaces evolve over time __attribute__((unused)) // silent unused-function warning -static void -printChildrenInterfaces(const ContainerBasePrivate& container, bool success, const Stage& creator, - std::ostream& os = std::cerr) { +static void printChildrenInterfaces(const ContainerBasePrivate& container, bool success, const Stage& creator, + std::ostream& os = std::cerr) { static unsigned int id = 0; const unsigned int width = 10; // indentation of name os << '\n' << (success ? '+' : '-') << ' ' << creator.name() << ' '; diff --git a/core/test/test_move_relative.cpp b/core/test/test_move_relative.cpp index f34abc80f..f606ff6d6 100644 --- a/core/test/test_move_relative.cpp +++ b/core/test/test_move_relative.cpp @@ -173,17 +173,15 @@ TEST_F(PandaMoveRelativeCartesian, cartesianRotateAttachedIKFrame) { TEST_F(PandaMoveRelativeJoint, jointOutsideBound) { // move joint inside limit auto initial_jpos = scene->getCurrentState().getJointPositions("panda_joint7"); - move->setDirection([initial_jpos] { - return std::map{ { "panda_joint7", 2.0 - *initial_jpos } }; - }()); + move->setDirection( + [initial_jpos] { return std::map{ { "panda_joint7", 2.0 - *initial_jpos } }; }()); EXPECT_TRUE(this->t.plan()) << "Plan should succeed, joint inside limit"; this->t.reset(); // move joint outside limit: 2.8973 - move->setDirection([initial_jpos] { - return std::map{ { "panda_joint7", 3.0 - *initial_jpos } }; - }()); + move->setDirection( + [initial_jpos] { return std::map{ { "panda_joint7", 3.0 - *initial_jpos } }; }()); EXPECT_FALSE(this->t.plan()) << "Plan should fail, joint outside limit"; } From f24e03ac44001c66228bbb0d15e6b860b1500b9a Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Fri, 14 Aug 2026 04:37:58 +0200 Subject: [PATCH 6/8] CI: run format workflow on Ubuntu 26.04 --- .github/workflows/format.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/format.yaml b/.github/workflows/format.yaml index e5913ea7b..1c2c984af 100644 --- a/.github/workflows/format.yaml +++ b/.github/workflows/format.yaml @@ -11,7 +11,7 @@ on: jobs: pre-commit: name: pre-commit - runs-on: ubuntu-latest + runs-on: ubuntu-26.04 steps: - uses: actions/checkout@v7 with: From 747890061960dcc5466c26218c6eb208fee172c6 Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Fri, 14 Aug 2026 04:43:56 +0200 Subject: [PATCH 7/8] Drop stomp dependency too --- core/package.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/core/package.xml b/core/package.xml index adf480887..5ab15d972 100644 --- a/core/package.xml +++ b/core/package.xml @@ -38,7 +38,6 @@ moveit_resources_fanuc_moveit_config moveit_planners_ompl - moveit_planners_stomp ament_cmake From 1cdb88ddbc5d0eca4f1ff9e389ed62fa67241bfe Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Fri, 14 Aug 2026 04:47:00 +0200 Subject: [PATCH 8/8] Add kilted build --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8bd2d966b..6ba775f1c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -34,6 +34,7 @@ jobs: -e ASAN_OPTIONS="new_delete_type_mismatch=0,alloc_dealloc_mismatch=0" TARGET_CMAKE_ARGS: -DCMAKE_CXX_FLAGS="-fsanitize=address -fno-omit-frame-pointer -O1 -g" - IMAGE: lyrical-release + - IMAGE: kilted-release - IMAGE: jazzy-release env: