Skip to content

feat(vda5050): add VDA 5050 msgs + ros2_medkit Service Interface plugin #44

feat(vda5050): add VDA 5050 msgs + ros2_medkit Service Interface plugin

feat(vda5050): add VDA 5050 msgs + ros2_medkit Service Interface plugin #44

Workflow file for this run

name: Quality
on:
pull_request:
branches: [main]
push:
branches: [main]
concurrency:
group: quality-${{ github.head_ref || github.sha }}
cancel-in-progress: true
permissions:
contents: read
jobs:
format-lint:
runs-on: ubuntu-latest
container:
image: ubuntu:noble
timeout-minutes: 45
defaults:
run:
shell: bash
steps:
- name: Install Git
run: |
apt-get update
apt-get install -y git
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up ROS 2 Jazzy
uses: ros-tooling/setup-ros@v0.7
with:
required-ros-distributions: jazzy
- name: Install dependencies
run: |
apt-get update
apt-get install -y clang-format ccache
source /opt/ros/jazzy/setup.bash
rosdep update
rosdep install --from-paths src --ignore-src -y
- name: Cache ccache
uses: actions/cache@v4
with:
path: /root/.cache/ccache
key: ccache-jazzy-lint-${{ github.sha }}
restore-keys: |
ccache-jazzy-lint-
- name: Build (minimal, for ament test infrastructure)
env:
CCACHE_DIR: /root/.cache/ccache
CCACHE_MAXSIZE: 500M
CCACHE_SLOPPINESS: pch_defines,time_macros
run: |
source /opt/ros/jazzy/setup.bash
colcon build --symlink-install \
--cmake-args -DCMAKE_BUILD_TYPE=Release \
--event-handlers console_direct+
- name: Run format linters
run: |
source /opt/ros/jazzy/setup.bash
source install/setup.bash
colcon test --return-code-on-test-failure \
--ctest-args -L linter -E clang_tidy \
--event-handlers console_direct+
- name: Show results
if: always()
run: colcon test-result --verbose
clang-tidy:
runs-on: ubuntu-latest
container:
image: ubuntu:noble
timeout-minutes: 45
defaults:
run:
shell: bash
steps:
- name: Install Git
run: |
apt-get update
apt-get install -y git
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Fix git safe directory
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
- name: Set up ROS 2 Jazzy
uses: ros-tooling/setup-ros@v0.7
with:
required-ros-distributions: jazzy
- name: Install ccache and clang-tidy
run: apt-get install -y ccache clang-tidy
- name: Cache ccache
uses: actions/cache@v4
with:
path: /root/.cache/ccache
key: ccache-jazzy-tidy-${{ github.sha }}
restore-keys: |
ccache-jazzy-tidy-
- name: Install clang-tidy-cache (ctcache)
run: |
apt-get install -y python3-pip
pip3 install --break-system-packages git+https://github.com/matus-chochlik/ctcache.git@3880541496c7ce0d2e2830d2f525375078fe0b1f
printf '#!/bin/sh\nexec clang-tidy-cache /usr/bin/clang-tidy "$@"\n' > /usr/local/bin/ctcache-wrapper
chmod +x /usr/local/bin/ctcache-wrapper
- name: Cache ctcache results
uses: actions/cache@v4
with:
path: /root/.ctcache
key: ctcache-jazzy-${{ hashFiles('.clang-tidy') }}-${{ github.sha }}
restore-keys: |
ctcache-jazzy-${{ hashFiles('.clang-tidy') }}-
- name: Install dependencies
run: |
apt-get update
apt-get install -y ros-jazzy-test-msgs
source /opt/ros/jazzy/setup.bash
rosdep update
rosdep install --from-paths src --ignore-src -y
- name: Build (compile database only, no clang-tidy)
env:
CCACHE_DIR: /root/.cache/ccache
CCACHE_MAXSIZE: 500M
CCACHE_SLOPPINESS: pch_defines,time_macros
run: |
source /opt/ros/jazzy/setup.bash
colcon build --symlink-install \
--cmake-args -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DENABLE_CLANG_TIDY=OFF \
--event-handlers console_direct+
ccache -s
- name: Merge compile databases
run: |
# Simple merge: combine per-package databases into build/compile_commands.json
mkdir -p build
python3 -c "
import json, glob, sys
entries = []
for db in glob.glob('build/*/compile_commands.json'):
with open(db) as f:
entries.extend(json.load(f))
with open('build/compile_commands.json', 'w') as f:
json.dump(entries, f, indent=2)
print(f'Merged {len(entries)} entries from {len(glob.glob(\"build/*/compile_commands.json\"))} packages')
"
- name: Determine files to analyze
id: files
run: |
if [ "${{ github.event_name }}" = "pull_request" ]; then
# Incremental: only changed C++ files
changed=$(git diff --name-only --diff-filter=ACMR origin/main...HEAD -- '*.cpp' '*.hpp' | tr '\n' ' ')
if [ -z "$changed" ]; then
echo "No C++ files changed - skipping clang-tidy"
echo "skip=true" >> "$GITHUB_OUTPUT"
else
echo "Analyzing changed files: $changed"
echo "skip=false" >> "$GITHUB_OUTPUT"
echo "files=$changed" >> "$GITHUB_OUTPUT"
fi
else
# Full: all source files
echo "Full analysis on push to main"
echo "skip=false" >> "$GITHUB_OUTPUT"
echo "files=" >> "$GITHUB_OUTPUT"
fi
- name: Run clang-tidy
if: steps.files.outputs.skip != 'true'
env:
CTCACHE_DIR: /root/.ctcache
CHANGED_FILES: ${{ steps.files.outputs.files }}
run: |
mkdir -p /root/.ctcache
source /opt/ros/jazzy/setup.bash
source install/setup.bash
if [ -n "$CHANGED_FILES" ]; then
# Incremental: specific files
run-clang-tidy -p build -clang-tidy-binary ctcache-wrapper \
-header-filter='.*ros2_medkit.*' \
$CHANGED_FILES
else
# Full: analyze all source files under src/ros2_medkit_*/src/
# Intentionally excludes test/ directories (tested via sanitizer jobs)
run-clang-tidy -p build -clang-tidy-binary ctcache-wrapper \
-header-filter='.*ros2_medkit.*' \
'src/ros2_medkit_.*/src/.*\.cpp$'
fi
sanitizer-asan:
runs-on: ubuntu-latest
container:
image: ubuntu:noble
timeout-minutes: 45
defaults:
run:
shell: bash
steps:
- name: Free disk space
run: |
rm -rf /usr/local/lib/android /usr/share/dotnet /opt/ghc || true
apt-get clean
- name: Install Git
run: |
apt-get update
apt-get install -y git
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up ROS 2 Jazzy
uses: ros-tooling/setup-ros@v0.7
with:
required-ros-distributions: jazzy
- name: Install ccache
run: apt-get install -y ccache
- name: Cache ccache
uses: actions/cache@v4
with:
path: /root/.cache/ccache
key: ccache-jazzy-asan-${{ github.sha }}
restore-keys: |
ccache-jazzy-asan-
- name: Install dependencies
run: |
apt-get update
apt-get install -y ros-jazzy-test-msgs
source /opt/ros/jazzy/setup.bash
rosdep update
rosdep install --from-paths src --ignore-src -y
- name: Build with ASan + UBSan
env:
CCACHE_DIR: /root/.cache/ccache
CCACHE_MAXSIZE: 500M
CCACHE_SLOPPINESS: pch_defines,time_macros
run: |
source /opt/ros/jazzy/setup.bash
colcon build --symlink-install \
--cmake-args -DCMAKE_BUILD_TYPE=Debug -DSANITIZER=asan,ubsan \
--event-handlers console_direct+
ccache -s
- name: Extend test timeouts for ASan overhead
run: |
find build/ -name "CTestTestfile.cmake" \
-exec sed -i 's/TIMEOUT "60"/TIMEOUT "180"/g' {} +
- name: Run unit tests with ASan + UBSan
timeout-minutes: 15
env:
# detect_leaks=0: FastDDS allocator leaks on shutdown (not our code)
# new_delete_type_mismatch=0: ROS 2 DDS scalar/array new/delete mismatch
ASAN_OPTIONS: halt_on_error=1:detect_leaks=0:new_delete_type_mismatch=0
UBSAN_OPTIONS: halt_on_error=1:print_stacktrace=1
run: |
source /opt/ros/jazzy/setup.bash
source install/setup.bash
failed=0
for pkg_dir in build/ros2_medkit_*/; do
pkg=$(basename "$pkg_dir")
echo "::group::Testing $pkg"
(cd "$pkg_dir" && ctest -LE "linter|integration" --output-on-failure) || failed=1
echo "::endgroup::"
done
exit $failed
- name: Show test results
if: always()
run: |
for pkg_dir in build/ros2_medkit_*/; do
colcon test-result --test-result-base "$pkg_dir" --verbose 2>/dev/null || true
done
sanitizer-tsan:
runs-on: ubuntu-latest
container:
image: ubuntu:noble
timeout-minutes: 45
defaults:
run:
shell: bash
steps:
- name: Install Git
run: |
apt-get update
apt-get install -y git
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up ROS 2 Jazzy
uses: ros-tooling/setup-ros@v0.7
with:
required-ros-distributions: jazzy
- name: Install ccache
run: apt-get install -y ccache
- name: Cache ccache
uses: actions/cache@v4
with:
path: /root/.cache/ccache
key: ccache-jazzy-tsan-${{ github.sha }}
restore-keys: |
ccache-jazzy-tsan-
- name: Install dependencies
run: |
apt-get update
apt-get install -y ros-jazzy-test-msgs
source /opt/ros/jazzy/setup.bash
rosdep update
rosdep install --from-paths src --ignore-src -y
- name: Build with TSan
env:
CCACHE_DIR: /root/.cache/ccache
CCACHE_MAXSIZE: 500M
CCACHE_SLOPPINESS: pch_defines,time_macros
run: |
source /opt/ros/jazzy/setup.bash
colcon build --symlink-install \
--cmake-args -DCMAKE_BUILD_TYPE=Debug -DSANITIZER=tsan \
--event-handlers console_direct+
ccache -s
- name: Extend test timeouts for TSan overhead
run: |
find build/ -name "CTestTestfile.cmake" \
-exec sed -i 's/TIMEOUT "60"/TIMEOUT "180"/g' {} +
- name: Run unit tests with TSan
timeout-minutes: 15
run: |
export TSAN_OPTIONS="halt_on_error=1:suppressions=$(pwd)/tsan_suppressions.txt"
source /opt/ros/jazzy/setup.bash
source install/setup.bash
failed=0
for pkg_dir in build/ros2_medkit_*/; do
pkg=$(basename "$pkg_dir")
echo "::group::Testing $pkg"
(cd "$pkg_dir" && ctest -LE "linter|integration" --output-on-failure) || failed=1
echo "::endgroup::"
done
exit $failed
- name: Show test results
if: always()
run: |
for pkg_dir in build/ros2_medkit_*/; do
colcon test-result --test-result-base "$pkg_dir" --verbose 2>/dev/null || true
done