feat(vda5050): add VDA 5050 msgs + ros2_medkit Service Interface plugin #44
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |