feat: nav2 sensor fix OTA demo #231
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: CI | |
| on: | |
| pull_request: | |
| branches: [main] | |
| push: | |
| branches: [main] | |
| repository_dispatch: | |
| types: [ros2_medkit_updated] | |
| permissions: | |
| contents: read | |
| jobs: | |
| lint: | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Check for trailing whitespace | |
| run: | | |
| ! git grep -I --line-number --perl-regexp '\s+$' -- \ | |
| '*.md' '*.py' '*.yaml' '*.yml' || \ | |
| (echo "Found trailing whitespace in the files above" && exit 1) | |
| - name: Check shell scripts with shellcheck | |
| run: | | |
| sudo apt-get update && sudo apt-get install -y shellcheck | |
| find . \( -name "*.sh" -o -name "*.bash" \) -type f | xargs shellcheck | |
| - name: Validate YAML files | |
| run: | | |
| sudo apt-get update && sudo apt-get install -y yamllint | |
| YAMLLINT_CONFIG="{extends: relaxed, rules: {line-length: {max: 120}}}" | |
| find . \( -name "*.yaml" -o -name "*.yml" \) -type f | xargs yamllint -d "$YAMLLINT_CONFIG" | |
| build-and-test-sensor: | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Show triggering source | |
| if: github.event_name == 'repository_dispatch' | |
| run: | | |
| SHA="${{ github.event.client_payload.sha }}" | |
| RUN_URL="${{ github.event.client_payload.run_url }}" | |
| echo "## Triggered by ros2_medkit" >> "$GITHUB_STEP_SUMMARY" | |
| echo "- Commit: \`${SHA:-unknown}\`" >> "$GITHUB_STEP_SUMMARY" | |
| if [ -n "$RUN_URL" ]; then | |
| echo "- Run: [View triggering run]($RUN_URL)" >> "$GITHUB_STEP_SUMMARY" | |
| else | |
| echo "- Run: (URL not provided)" >> "$GITHUB_STEP_SUMMARY" | |
| fi | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Build and start sensor_diagnostics demo | |
| working-directory: demos/sensor_diagnostics | |
| run: docker compose --profile ci up -d --build sensor-demo-ci | |
| - name: Run smoke tests | |
| run: ./tests/smoke_test.sh | |
| - name: Show container logs on failure | |
| if: failure() | |
| working-directory: demos/sensor_diagnostics | |
| run: docker compose --profile ci logs sensor-demo-ci --tail=200 | |
| - name: Teardown | |
| if: always() | |
| working-directory: demos/sensor_diagnostics | |
| run: docker compose --profile ci down | |
| build-and-test-turtlebot: | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Build and start turtlebot3 demo | |
| working-directory: demos/turtlebot3_integration | |
| run: docker compose --profile ci up -d --build turtlebot3-demo-ci | |
| - name: Run smoke tests | |
| run: ./tests/smoke_test_turtlebot3.sh | |
| - name: Show container logs on failure | |
| if: failure() | |
| working-directory: demos/turtlebot3_integration | |
| run: docker compose --profile ci logs turtlebot3-demo-ci --tail=200 | |
| - name: Teardown | |
| if: always() | |
| working-directory: demos/turtlebot3_integration | |
| run: docker compose --profile ci down | |
| build-and-test-moveit: | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Build and start moveit demo | |
| working-directory: demos/moveit_pick_place | |
| run: docker compose --profile ci up -d --build moveit-demo-ci | |
| - name: Run smoke tests | |
| run: ./tests/smoke_test_moveit.sh | |
| - name: Show container logs on failure | |
| if: failure() | |
| working-directory: demos/moveit_pick_place | |
| run: docker compose --profile ci logs moveit-demo-ci --tail=200 | |
| - name: Teardown | |
| if: always() | |
| working-directory: demos/moveit_pick_place | |
| run: docker compose --profile ci down | |
| build-and-test-multi-ecu: | |
| needs: lint | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Show triggering source | |
| if: github.event_name == 'repository_dispatch' | |
| run: | | |
| SHA="${{ github.event.client_payload.sha }}" | |
| RUN_URL="${{ github.event.client_payload.run_url }}" | |
| echo "## Triggered by ros2_medkit" >> "$GITHUB_STEP_SUMMARY" | |
| echo "- Commit: \`${SHA:-unknown}\`" >> "$GITHUB_STEP_SUMMARY" | |
| if [ -n "$RUN_URL" ]; then | |
| echo "- Run: [View triggering run]($RUN_URL)" >> "$GITHUB_STEP_SUMMARY" | |
| else | |
| echo "- Run: (URL not provided)" >> "$GITHUB_STEP_SUMMARY" | |
| fi | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Build and start multi-ECU demo | |
| working-directory: demos/multi_ecu_aggregation | |
| run: docker compose --profile ci up -d --build perception-ecu-ci planning-ecu-ci actuation-ecu-ci | |
| - name: Run smoke tests | |
| run: ./tests/smoke_test_multi_ecu.sh | |
| - name: Show perception ECU logs on failure | |
| if: failure() | |
| working-directory: demos/multi_ecu_aggregation | |
| run: docker compose --profile ci logs perception-ecu-ci --tail=200 | |
| - name: Show planning ECU logs on failure | |
| if: failure() | |
| working-directory: demos/multi_ecu_aggregation | |
| run: docker compose --profile ci logs planning-ecu-ci --tail=200 | |
| - name: Show actuation ECU logs on failure | |
| if: failure() | |
| working-directory: demos/multi_ecu_aggregation | |
| run: docker compose --profile ci logs actuation-ecu-ci --tail=200 | |
| - name: Teardown | |
| if: always() | |
| working-directory: demos/multi_ecu_aggregation | |
| run: docker compose --profile ci down | |
| build-and-test-ota: | |
| needs: lint | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Show triggering source | |
| if: github.event_name == 'repository_dispatch' | |
| run: | | |
| SHA="${{ github.event.client_payload.sha }}" | |
| RUN_URL="${{ github.event.client_payload.run_url }}" | |
| echo "## Triggered by ros2_medkit" >> "$GITHUB_STEP_SUMMARY" | |
| echo "- Commit: \`${SHA:-unknown}\`" >> "$GITHUB_STEP_SUMMARY" | |
| if [ -n "$RUN_URL" ]; then | |
| echo "- Run: [View triggering run]($RUN_URL)" >> "$GITHUB_STEP_SUMMARY" | |
| else | |
| echo "- Run: (URL not provided)" >> "$GITHUB_STEP_SUMMARY" | |
| fi | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Build and start OTA demo | |
| working-directory: demos/ota_nav2_sensor_fix | |
| run: docker compose up -d --build | |
| - name: Run smoke tests | |
| run: ./tests/smoke_test_ota.sh | |
| - name: Show gateway logs on failure | |
| if: failure() | |
| working-directory: demos/ota_nav2_sensor_fix | |
| run: docker compose logs gateway --tail=200 | |
| - name: Show update server logs on failure | |
| if: failure() | |
| working-directory: demos/ota_nav2_sensor_fix | |
| run: docker compose logs ota_update_server --tail=200 | |
| - name: Teardown | |
| if: always() | |
| working-directory: demos/ota_nav2_sensor_fix | |
| run: docker compose down | |
| # Separate job from build-and-test-ota: this one publishes /goal_pose, | |
| # waits for the controller to actually try to drive, asserts the | |
| # reactive SCAN_PHANTOM_RETURN fault appears, and only then runs the | |
| # OTA swap. Catches regressions in the demo narrative (broken_lidar | |
| # subscribing /cmd_vel, fault_manager debounce, fixed_lidar not | |
| # reporting). Slower than the API-only smoke job because it has to | |
| # wait for nav2 lifecycle to settle and for /cmd_vel to actually fire, | |
| # so it's split out and can fail in isolation without blocking the | |
| # quick OTA-endpoint check. | |
| ota-demo-narrative: | |
| needs: lint | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Show triggering source | |
| if: github.event_name == 'repository_dispatch' | |
| run: | | |
| SHA="${{ github.event.client_payload.sha }}" | |
| RUN_URL="${{ github.event.client_payload.run_url }}" | |
| echo "## Triggered by ros2_medkit" >> "$GITHUB_STEP_SUMMARY" | |
| echo "- Commit: \`${SHA:-unknown}\`" >> "$GITHUB_STEP_SUMMARY" | |
| if [ -n "$RUN_URL" ]; then | |
| echo "- Run: [View triggering run]($RUN_URL)" >> "$GITHUB_STEP_SUMMARY" | |
| fi | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Build artifacts (catalog + tarballs) inside ros:jazzy | |
| working-directory: demos/ota_nav2_sensor_fix | |
| run: | | |
| docker run --rm \ | |
| -v "$PWD":/work \ | |
| -w /work \ | |
| ros:jazzy \ | |
| bash -c ' | |
| set -eu | |
| apt-get update | |
| apt-get install -y --no-install-recommends \ | |
| python3-colcon-common-extensions \ | |
| python3-catkin-pkg \ | |
| python3-venv \ | |
| python3-pip \ | |
| build-essential \ | |
| cmake \ | |
| ros-jazzy-rclcpp \ | |
| ros-jazzy-sensor-msgs \ | |
| ros-jazzy-visualization-msgs | |
| cd scripts | |
| python3 -m venv .venv | |
| .venv/bin/pip install --upgrade pip | |
| .venv/bin/pip install pytest | |
| cd .. | |
| ./scripts/build_artifacts.sh | |
| ' | |
| sudo chown -R "$USER:$USER" . | |
| - name: Build and start OTA demo | |
| working-directory: demos/ota_nav2_sensor_fix | |
| run: docker compose up -d --build | |
| - name: Run demo narrative smoke | |
| run: ./tests/smoke_test_demo_narrative.sh | |
| - name: Show gateway logs on failure | |
| if: failure() | |
| working-directory: demos/ota_nav2_sensor_fix | |
| run: docker compose logs gateway --tail=300 | |
| - name: Teardown | |
| if: always() | |
| working-directory: demos/ota_nav2_sensor_fix | |
| run: docker compose down |