mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-07-24 15:27:41 +08:00
Restart the Micro-XRCE-DDS Agent before each integration test so DDS graph state from a previous PX4 instance does not leak into the next test. The MicroXRCEAgent is started once per session, but PX4 reboots between tests. The Agent retains writer entries from the previous PX4, so when the new PX4 reconnects, count_publishers() in px4-ros2-interface-lib's waitForFMU returns >0 immediately against a stale entry. Phase 1 (discovery) returns instantly, then Phase 2 (heartbeat) times out waiting for a message on a subscription matched to a dead writer. This is why ModesTest.denyArming (first test) passes while every later ModesTest fails with "timeout while waiting for FMU heartbeat". Adds an optional pre_test_hook on test_runner.Tester so ROS-specific lifecycle stays out of the shared test_runner. The workflow stops starting the Agent externally; ros_test_runner.py owns the lifecycle. Refs #27328 Signed-off-by: Ramon Roche <mrpollo@gmail.com>
145 lines
5.5 KiB
YAML
145 lines
5.5 KiB
YAML
# NOTE: this workflow is now running on Dronecode / PX4 AWS account.
|
|
# - If you want to keep the tests running in GitHub Actions you need to uncomment the "runs-on: ubuntu-latest" lines
|
|
# and comment the "runs-on: [runs-on,runner=..." lines.
|
|
# - If you would like to duplicate this setup try setting up "RunsOn" on your own AWS account try https://runs-on.com
|
|
|
|
name: ROS Integration Tests
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- 'main'
|
|
paths-ignore:
|
|
- 'docs/**'
|
|
pull_request:
|
|
branches:
|
|
- '**'
|
|
paths-ignore:
|
|
- 'docs/**'
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: [runs-on,runner=8cpu-linux-x64,image=ubuntu24-full-x64,"run-id=${{ github.run_id }}",spot=false,extras=s3-cache]
|
|
container:
|
|
image: px4io/px4-dev-ros2-galactic:2021-09-08
|
|
options: --privileged --ulimit core=-1 --security-opt seccomp=unconfined
|
|
env:
|
|
PX4_SBOM_DISABLE: 1
|
|
steps:
|
|
- uses: runs-on/action@v2
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
fetch-depth: 1
|
|
- name: Configure Git Safe Directory
|
|
run: git config --system --add safe.directory '*'
|
|
|
|
- name: Update ROS Keys
|
|
run: |
|
|
sudo rm /etc/apt/sources.list.d/ros2.list && \
|
|
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg && \
|
|
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
|
|
|
|
- name: Install gazebo
|
|
run: |
|
|
apt update && apt install -y gazebo11 libgazebo11-dev gstreamer1.0-plugins-bad gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly libgstreamer-plugins-base1.0-dev
|
|
|
|
- uses: ./.github/actions/setup-ccache
|
|
id: ccache
|
|
with:
|
|
cache-key-prefix: ccache-ros-integration
|
|
max-size: 400M
|
|
|
|
- name: Cache - Restore Micro-XRCE-DDS Agent
|
|
id: cache-xrce-agent
|
|
uses: actions/cache@v5
|
|
with:
|
|
path: /opt/Micro-XRCE-DDS-Agent
|
|
key: xrce-agent-v2.2.1-fastdds-2.8.2-galactic-2021-09-08
|
|
|
|
- name: Build - Micro-XRCE-DDS Agent (v2.2.1)
|
|
if: steps.cache-xrce-agent.outputs.cache-hit != 'true'
|
|
run: |
|
|
cd /opt
|
|
git clone --recursive https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
|
|
cd Micro-XRCE-DDS-Agent
|
|
git checkout v2.2.1 # recent versions require cmake 3.22, but px4-dev-ros2-galactic:2021-09-08 is on 3.16
|
|
sed -i 's/_fastdds_tag 2.8.x/_fastdds_tag 2.8.2/g' CMakeLists.txt
|
|
mkdir build
|
|
cd build
|
|
cmake ..
|
|
make -j2
|
|
|
|
- name: Cache - Restore PX4 ROS 2 Interface Library Workspace
|
|
id: cache-px4-ros2-ws
|
|
uses: actions/cache@v5
|
|
with:
|
|
path: /opt/px4_ws
|
|
# Bump 'v1' when the cached workspace layout changes in a way
|
|
# that is not captured by the message/service hash below.
|
|
key: px4-ros2-ws-v1-galactic-2021-09-08-${{ hashFiles('msg/*.msg', 'msg/versioned/*.msg', 'srv/*.srv') }}
|
|
|
|
- name: Build - PX4 ROS 2 Interface Library
|
|
if: steps.cache-px4-ros2-ws.outputs.cache-hit != 'true'
|
|
shell: bash
|
|
run: |
|
|
PX4_DIR="$(pwd)"
|
|
. /opt/ros/galactic/setup.bash
|
|
mkdir -p /opt/px4_ws/src
|
|
cd /opt/px4_ws/src
|
|
# On a PR, target the branch we're merging into (main or release/X.Y).
|
|
# On a direct push, fall back to the branch we're running on.
|
|
BRANCH="${GITHUB_BASE_REF:-$GITHUB_REF_NAME}"
|
|
REPO_URL="https://github.com/Auterion/px4-ros2-interface-lib.git"
|
|
if git ls-remote --heads "$REPO_URL" "$BRANCH" | grep -q "$BRANCH"; then
|
|
echo "Cloning px4-ros2-interface-lib with matching branch: $BRANCH"
|
|
git clone --recursive --branch "$BRANCH" "$REPO_URL"
|
|
else
|
|
echo "Branch '$BRANCH' not found in px4-ros2-interface-lib, using default (main)"
|
|
git clone --recursive "$REPO_URL"
|
|
fi
|
|
# Ignore python packages due to compilation issue (can be enabled when updating ROS)
|
|
touch px4-ros2-interface-lib/px4_ros2_py/COLCON_IGNORE || true
|
|
touch px4-ros2-interface-lib/examples/python/COLCON_IGNORE || true
|
|
cd ..
|
|
# Copy messages to ROS workspace
|
|
"${PX4_DIR}/Tools/copy_to_ros_ws.sh" "$(pwd)"
|
|
rm -rf src/translation_node src/px4_msgs_old
|
|
colcon build --symlink-install
|
|
|
|
- uses: ./.github/actions/build-gazebo-sitl
|
|
|
|
- name: Core dump settings
|
|
run: |
|
|
ulimit -c unlimited
|
|
echo "`pwd`/%e.core" > /proc/sys/kernel/core_pattern
|
|
|
|
- name: Run tests
|
|
shell: bash
|
|
run: |
|
|
. /opt/px4_ws/install/setup.bash
|
|
# The Agent is started (and restarted between tests) by ros_test_runner.py
|
|
# so DDS graph state from a previous PX4 instance does not leak into the
|
|
# next test. Make the Agent binary discoverable on PATH.
|
|
export PATH="/opt/Micro-XRCE-DDS-Agent/build:$PATH"
|
|
test/ros_test_runner.py --verbose --model iris --force-color
|
|
timeout-minutes: 45
|
|
|
|
- uses: ./.github/actions/save-ccache
|
|
if: always()
|
|
with:
|
|
cache-primary-key: ${{ steps.ccache.outputs.cache-primary-key }}
|
|
|
|
- name: Upload failed logs
|
|
if: failure()
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: failed-logs.zip
|
|
path: |
|
|
logs/**/**/**/*.log
|
|
logs/**/**/**/*.ulg
|
|
build/px4_sitl_default/tmp_ros_tests/rootfs/log/**/*.ulg
|