From 731d754a1525b152e33c6f9724d8f064956f73a6 Mon Sep 17 00:00:00 2001 From: Ramon Roche Date: Wed, 11 Feb 2026 20:50:47 -0800 Subject: [PATCH] ci: enable VOXL2 CI builds with private Docker container Remove modalai_voxl2 and qurt from CI exclusion lists and add container overrides to use the private ghcr.io/px4/px4-dev-voxl2 image which contains the Qualcomm Hexagon SDK. - Add voxl2 build group with x64 runner for cross-compilation - Add GHCR credentials to workflow for private container pull - Add packages:read permission to workflow - Auto-build libfc_sensor.so stub during cmake configure - Handle missing .px4/.elf gracefully in artifact packaging Signed-off-by: Ramon Roche --- .github/workflows/build_all_targets.yml | 4 ++++ Tools/ci/generate_board_targets_json.py | 30 +++++++++++++++++++++---- Tools/ci/package_build_artifacts.sh | 4 ++-- boards/modalai/voxl2/cmake/init.cmake | 16 +++++++++++++ 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build_all_targets.yml b/.github/workflows/build_all_targets.yml index 56e6a6ee1a..cf02ac2e77 100644 --- a/.github/workflows/build_all_targets.yml +++ b/.github/workflows/build_all_targets.yml @@ -29,6 +29,7 @@ concurrency: permissions: contents: write actions: read + packages: read jobs: group_targets: @@ -94,6 +95,9 @@ jobs: fail-fast: false container: image: ${{ matrix.container }} + credentials: + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} steps: - uses: runs-on/action@v2 - uses: actions/checkout@v4 diff --git a/Tools/ci/generate_board_targets_json.py b/Tools/ci/generate_board_targets_json.py index b251d74b51..214edd8186 100755 --- a/Tools/ci/generate_board_targets_json.py +++ b/Tools/ci/generate_board_targets_json.py @@ -36,11 +36,20 @@ if args.filter: target_filter.append(target) default_container = 'ghcr.io/px4/px4-dev:v1.16.0-rc1-258-g0369abd556' +voxl2_container = 'ghcr.io/px4/px4-dev-voxl2:v1.5' build_configs = [] grouped_targets = {} -excluded_boards = ['modalai_voxl2', 'px4_ros2', 'espressif_esp32'] # TODO: fix and enable +excluded_boards = ['px4_ros2', 'espressif_esp32'] # TODO: fix and enable excluded_manufacturers = ['atlflight'] -excluded_platforms = ['qurt'] +excluded_platforms = [] + +# Container overrides for platforms/boards that need a non-default container +platform_container_overrides = { + 'qurt': voxl2_container, +} +board_container_overrides = { + 'modalai_voxl2': voxl2_container, +} excluded_labels = [ 'stackcheck', 'nolockstep', 'replay', 'test', @@ -88,7 +97,20 @@ def process_target(px4board_file, target_name): if platform not in excluded_platforms: container = default_container - if platform == 'posix': + + # Extract board name (manufacturer_board) from target name + board_name = '_'.join(target_name.split('_')[:2]) + + # Apply container overrides for specific platforms or boards + if platform in platform_container_overrides: + container = platform_container_overrides[platform] + if board_name in board_container_overrides: + container = board_container_overrides[board_name] + + # Boards with container overrides get their own group + if board_name in board_container_overrides or platform in platform_container_overrides: + group = 'voxl2' + elif platform == 'posix': group = 'base' if toolchain: if toolchain.startswith('aarch64'): @@ -203,7 +225,7 @@ if (args.group): if(verbose): print(f'=:Architectures: [{grouped_targets.keys()}]') for arch in grouped_targets: - runner = 'x64' if arch == 'nuttx' else 'arm64' + runner = 'x64' if arch in ('nuttx', 'voxl2') else 'arm64' if(verbose): print(f'=:Processing: [{arch}]') temp_group = [] diff --git a/Tools/ci/package_build_artifacts.sh b/Tools/ci/package_build_artifacts.sh index f5ebb73fa0..aaf978b19f 100755 --- a/Tools/ci/package_build_artifacts.sh +++ b/Tools/ci/package_build_artifacts.sh @@ -1,8 +1,8 @@ #!/bin/bash mkdir artifacts -cp **/**/*.px4 artifacts/ -cp **/**/*.elf artifacts/ +cp **/**/*.px4 artifacts/ 2>/dev/null || true +cp **/**/*.elf artifacts/ 2>/dev/null || true for build_dir_path in build/*/ ; do build_dir_path=${build_dir_path::${#build_dir_path}-1} build_dir=${build_dir_path#*/} diff --git a/boards/modalai/voxl2/cmake/init.cmake b/boards/modalai/voxl2/cmake/init.cmake index 357d1d45ec..04f4b65a88 100644 --- a/boards/modalai/voxl2/cmake/init.cmake +++ b/boards/modalai/voxl2/cmake/init.cmake @@ -32,3 +32,19 @@ ############################################################################ include_directories(${PX4_BOARD_DIR}/libfc-sensor-api/inc) + +# Build libfc_sensor.so stub library automatically if not already built +set(FC_SENSOR_LIB ${PX4_BOARD_DIR}/libfc-sensor-api/build/libfc_sensor.so) +if(NOT EXISTS ${FC_SENSOR_LIB}) + execute_process( + COMMAND ${CMAKE_COMMAND} -E make_directory ${PX4_BOARD_DIR}/libfc-sensor-api/build + ) + execute_process( + COMMAND ${CMAKE_COMMAND} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} .. + WORKING_DIRECTORY ${PX4_BOARD_DIR}/libfc-sensor-api/build + ) + execute_process( + COMMAND ${CMAKE_COMMAND} --build . + WORKING_DIRECTORY ${PX4_BOARD_DIR}/libfc-sensor-api/build + ) +endif()