Compare commits

...

30 Commits

Author SHA1 Message Date
Ramon Roche ad8f95cdcf ci: fix docker context
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 21:22:49 +00:00
Ramon Roche 34ca76b63c ci: dont enter sitl
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:02 +00:00
Ramon Roche cde7ffe7f9 container: px4-sitl image
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:02 +00:00
Ramon Roche 9d98581675 AppImage: XDG compliant paths for romfs contents
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:02 +00:00
Ramon Roche 68d8a7ce4c tools: appimage cleanup on exit
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:02 +00:00
Ramon Roche 7cb36ce47d make: bundle relevant libraries into appimage
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:02 +00:00
Ramon Roche c1069dcd2a ci: run on aws infra
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:02 +00:00
Ramon Roche 2f56d44e6f make: copy bundled libraries
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:02 +00:00
Ramon Roche b4ad8bbaa0 ci: try to bundle missing libraries
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:02 +00:00
Ramon Roche 11318ab861 make: fix build target for appimage
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche 035a829dc5 ci: matrix includes
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche a25d90777e AppImage: adds debug mode
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche 254251f4a6 make: remove unnecessary steps in AppImage 2025-07-03 18:59:01 +00:00
Ramon Roche b93eefcee7 ci: build x86 and arm64 AppImages
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche 5e602788d7 ci: run the actual ubuntu setup script
silly me

Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche b709b2bb29 ci: remov git ownership hack
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche 5b209cf5f4 ci: build on oldest supported architecture
This makes it so its usable in ubuntu 22.04 & 24.04, otherwise we start
running into dependency issues in the system for example:

```
/tmp/.mount_PX4_AuYR3Xk1/usr/bin/px4: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by /tmp/.mount_PX4_AuYR3Xk1/usr/bin/px4)
/tmp/.mount_PX4_AuYR3Xk1/usr/bin/px4: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.32' not found (required by /tmp/.mount_PX4_AuYR3Xk1/usr/bin/px4)
```

Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche 32fe48a02b ci: properly format yml
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche d94939b489 ci: extact image instead of mounting in CI
avoids security issues in the runner

Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche bc96acb6b3 ci: run modprobe on additional step
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche 68b22f16cf ci: inline install
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche cc384d44c7 ci: adds missing fuse dep
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche 89cd709952 ci: needs libfuse2
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche 5db88fb2bc ci: not sure why i left this here
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche 5e1e2c9e29 ci: fix actions permissions scope
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche ce85cffbee ci: update tools and fix git ownership
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche f1a8606e74 tools: adds appimagetool to setup/ubuntu.sh
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche aec1fddc8a ci: create image on ci
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche b35ffa99bb tools: container for all
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
Ramon Roche 6ac80069c2 build: make appimage
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2025-07-03 18:59:01 +00:00
11 changed files with 444 additions and 13 deletions
+44
View File
@@ -0,0 +1,44 @@
name: Build PX4 SITL AppImage
on:
pull_request:
branches:
- main
permissions:
contents: read
actions: write
jobs:
build-appimage:
name: "AppImage ${{ matrix.arch }}"
strategy:
fail-fast: false
matrix:
include:
- arch: amd64
runner: x64
- arch: arm64
runner: arm64
runs-on: [runs-on,"runner=4cpu-linux-${{ matrix.runner }}","image=ubuntu22-full-${{ matrix.runner }}","run-id=${{ github.run_id }}"]
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
- name: Install Dependencies
run: ./Tools/setup/ubuntu.sh
- name: Build PX4 SITL and AppImage
env:
# avoid FUSE by extracting the AppImage inplace
APPIMAGE_EXTRACT_AND_RUN: "1"
run: |
make appimage
- name: Upload AppImage artifact
uses: actions/upload-artifact@v4
with:
name: px4-sitl-appimage-${{ matrix.arch }}
path: build/*.AppImage
+189
View File
@@ -0,0 +1,189 @@
name: SITL Container
on:
push:
branches:
- 'main'
- 'stable'
- 'beta'
- 'release/**'
tags:
- 'v*'
pull_request:
branches:
- '**'
workflow_dispatch:
inputs:
px4_version:
description: 'Container tag (e.g. v1.16.0)'
required: true
type: string
deploy_to_registry:
description: 'Whether to push built images to the registry'
required: false
type: boolean
default: false
jobs:
setup:
name: Set Tags and Variables
permissions:
contents: read
runs-on: [runs-on,"runner=1cpu-linux-x64","image=ubuntu24-full-x64","run-id=${{ github.run_id }}",spot=false,extras=s3-cache]
outputs:
px4_version: ${{ steps.px4_version.outputs.px4_version }}
meta_tags: ${{ steps.meta.outputs.tags }}
meta_labels: ${{ steps.meta.outputs.labels }}
steps:
- uses: runs-on/action@v1
- uses: actions/checkout@v4
with:
fetch-tags: true
submodules: false
fetch-depth: 0
# If manual dispatch, take the userprovided input
- name: Set PX4 Tag Version
id: px4_version
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo "px4_version=${{ github.event.inputs.px4_version }}" >> $GITHUB_OUTPUT
else
echo "px4_version=$(git describe --tags --match 'v[0-9]*')" >> $GITHUB_OUTPUT
fi
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: |
ghcr.io/PX4/px4-sitl
px4io/px4-sitl
tags: |
type=raw,enable=true,value=${{ steps.px4_version.outputs.px4_version }},priority=1000
build:
name: Build (${{ matrix.arch }})
permissions:
contents: read
packages: write
needs: setup
strategy:
matrix:
include:
- platform: linux/arm64
arch: arm64
runner: arm64
- platform: linux/amd64
arch: amd64
runner: x64
runs-on: [runs-on,"runner=8cpu-linux-${{ matrix.runner }}","image=ubuntu24-full-${{ matrix.runner }}","run-id=${{ github.run_id }}",spot=false,extras=s3-cache]
steps:
- uses: runs-on/action@v1
- uses: actions/checkout@v4
with:
fetch-tags: true
submodules: false
fetch-depth: 0
- name: Install PX4 Dependencies
run: ./Tools/setup/ubuntu.sh
- name: Build PX4 SITL
run: make px4_sitl_default
- name: Login to Docker Hub
uses: docker/login-action@v3
if: ${{ startsWith(github.ref, 'refs/tags/') || (github.event_name == 'workflow_dispatch' && github.event.inputs.deploy_to_registry) }}
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
if: ${{ startsWith(github.ref, 'refs/tags/') || (github.event_name == 'workflow_dispatch' && github.event.inputs.deploy_to_registry) }}
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
driver: docker-container
platforms: ${{ matrix.platform }}
- name: Build and Load Container Image
uses: docker/build-push-action@v6
id: docker
with:
context: .
file: Tools/sitl-container/Dockerfile
tags: |
ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}-${{ matrix.arch }}
px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}-${{ matrix.arch }}
labels: ${{ needs.setup.outputs.meta_labels }}
platforms: ${{ matrix.platform }}
load: false
push: ${{ startsWith(github.ref, 'refs/tags/') || (github.event_name == 'workflow_dispatch' && github.event.inputs.deploy_to_registry) }}
provenance: false
cache-from: type=gha,version=1
cache-to: type=gha,version=1,mode=max
deploy:
name: Deploy To Registry
permissions:
contents: read
packages: write
runs-on: [runs-on,"runner=8cpu-linux-x64","image=ubuntu24-full-x64","run-id=${{ github.run_id }}",spot=false,extras=s3-cache]
needs: [build, setup]
if: ${{ startsWith(github.ref, 'refs/tags/') || (github.event_name == 'workflow_dispatch' && github.event.inputs.deploy_to_registry) }}
steps:
- uses: runs-on/action@v1
- uses: actions/checkout@v4
with:
fetch-tags: true
submodules: false
fetch-depth: 0
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Verify Images Exist Before Creating Manifest
run: |
docker manifest inspect px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}-arm64 || echo "⚠️ Warning: No ARM64 image found!"
docker manifest inspect px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}-amd64 || echo "⚠️ Warning: No AMD64 image found!"
docker manifest inspect ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}-arm64 || echo "⚠️ Warning: No ARM64 image found!"
docker manifest inspect ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}-amd64 || echo "⚠️ Warning: No AMD64 image found!"
- name: Create and Push Multi-Arch Manifest for Docker Hub
run: |
docker manifest create px4io/px4-sitl:${{ needs.setup.outputs.px4_version }} \
--amend px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}-arm64 \
--amend px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}-amd64
docker manifest annotate px4io/px4-sitl:${{ needs.setup.outputs.px4_version }} px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}-arm64 --arch arm64
docker manifest annotate px4io/px4-sitl:${{ needs.setup.outputs.px4_version }} px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}-amd64 --arch amd64
docker manifest push px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}
- name: Create and Push Multi-Arch Manifest for GHCR
run: |
docker manifest create ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }} \
--amend ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}-arm64 \
--amend ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}-amd64
docker manifest annotate ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }} ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}-arm64 --arch arm64
docker manifest annotate ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }} ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}-amd64 --arch amd64
docker manifest push ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}
+36
View File
@@ -264,6 +264,42 @@ px4fmu_firmware: \
check_px4_fmu-v5x_default \
sizes
# Create a one-file AppImage for PX4 SITL
PX4_VERSION := $(shell git describe --tags --match "v[0-9]*" 2>/dev/null || echo "v0.0.0")
.PHONY: AppImage
appimage: build/px4_sitl_default/bin/px4 build/px4_sitl_default/romfs_files.tar
@$(MAKE) px4_sitl_default
@$(RM) -rf build/px4.AppDir
@mkdir -p \
build/px4.AppDir/usr/bin \
build/px4.AppDir/usr/lib \
build/px4.AppDir/usr/share/px4/romfs/etc \
build/px4.AppDir/usr/share/px4/romfs/bin
@cp build/px4_sitl_default/bin/px4 build/px4.AppDir/usr/bin/
@echo "${PX4_VERSION}" > build/px4.AppDir/version.txt
# bundle required Gazebo transport libs (archagnostic lookup)
echo "→ Gathering shared-lib dependencies for px4..."
@ldd build/px4_sitl_default/bin/px4 \
| awk '/=>/ { print $$3 }' \
| grep -E '^/' \
| grep -Ev '/lib(c|gcc|stdc\+\+)\.so' \
| sort -u \
| while read lib; do \
echo " → bundling $$lib"; \
cp "$$lib" build/px4.AppDir/usr/lib/; \
done
@tar xf build/px4_sitl_default/romfs_files.tar -C build/px4.AppDir/usr/share/px4/romfs/etc
@cp build/px4_sitl_default/bin/px4-* build/px4.AppDir/usr/share/px4/romfs/bin/
@cp Tools/appimage/px4.desktop build/px4.AppDir/
@cp Tools/appimage/px4.svg build/px4.AppDir/
@cp Tools/appimage/AppRun build/px4.AppDir/
@chmod +x build/px4.AppDir/AppRun
@cd build && appimagetool px4.AppDir
misc_qgc_extra_firmware: \
check_nxp_fmuk66-v3_default \
check_mro_x21_default \
+61
View File
@@ -0,0 +1,61 @@
#!/usr/bin/env bash
set -e
DEBUG=false
for arg; do
case "$arg" in
--debug)
DEBUG=true
shift
;;
*)
break
;;
esac
done
if $DEBUG; then
echo "[DEBUG] Running in debug mode" >&2
fi
CUR_VER=$(<"$APPDIR/version.txt")
$DEBUG && echo "[DEBUG] PX4_VERSION = $CUR_VER" >&2
# figure out a stable logs directory
STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}"
DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}"
ROMFS_DIR="$DATA_HOME/px4/romfs"
mkdir -p "$DATA_HOME/px4" "$STATE_HOME/px4"
$DEBUG && echo "[DEBUG] STATE_HOME = $STATE_HOME" >&2
$DEBUG && echo "[DEBUG] DATA_HOME = $STATE_HOME" >&2
# Read last unpacked version
LAST_VER_FILE="$STATE_HOME/px4/version"
LAST_VER=""
[ -f "$LAST_VER_FILE" ] && LAST_VER=$(<"$LAST_VER_FILE")
# if versions differ, refresh the payload
if [ "$CUR_VER" != "$LAST_VER" ]; then
$DEBUG && echo "[DEBUG] Version changed ($LAST_VER → $CUR_VER); updating ROMFS..." >&2
rm -fr "$ROMFS_DIR"
mkdir -p "$ROMFS_DIR"
cp -a "$APPDIR/usr/share/px4/romfs/." "$ROMFS_DIR"
echo "$CUR_VER" > "$LAST_VER_FILE"
else
if $DEBUG; then
echo "[DEBUG] Using cached ROMFS version $CUR_VER" >&2
fi
fi
LOG_DIR="$STATE_HOME/px4/logs"
mkdir -p "$LOG_DIR"
$DEBUG && echo "[DEBUG] LOG_DIR = $LOG_DIR" >&2
# pick up bundled libs first
export LD_LIBRARY_PATH="$APPDIR/usr/lib:$LD_LIBRARY_PATH"
export PATH="$ROMFS_DIR/bin:$ROMFS_DIR:$PATH"
$DEBUG && echo "[DEBUG] Launching: $APPDIR/usr/bin/px4 -w $ROMFS_DIR $*" >&2
exec "$APPDIR/usr/bin/px4" -w "$ROMFS_DIR" "$@"
+6
View File
@@ -0,0 +1,6 @@
[Desktop Entry]
Type=Application
Name=PX4 Autopilot SITL
Exec=px4 %F
Icon=px4
Categories=Development;
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 25 KiB

-13
View File
@@ -1,18 +1,5 @@
#! /bin/bash
if [ -z ${PX4_DOCKER_REPO+x} ]; then
echo "guessing PX4_DOCKER_REPO based on input";
if [[ $@ =~ .*clang.* ]] || [[ $@ =~ .*scan-build.* ]]; then
# clang tools
PX4_DOCKER_REPO="px4io/px4-dev-clang:2021-02-04"
elif [[ $@ =~ .*tests* ]]; then
# run all tests with simulation
PX4_DOCKER_REPO="px4io/px4-dev-simulation-bionic:2021-12-11"
fi
else
echo "PX4_DOCKER_REPO is set to '$PX4_DOCKER_REPO'";
fi
# otherwise default to nuttx
if [ -z ${PX4_DOCKER_REPO+x} ]; then
PX4_DOCKER_REPO="px4io/px4-dev:v1.16.0-rc1-258-g0369abd556"
+11
View File
@@ -126,9 +126,11 @@ if [[ $INSTALL_NUTTX == "true" ]]; then
genromfs \
gettext \
gperf \
fuse \
kconfig-frontends \
libelf-dev \
libexpat-dev \
libfuse2 \
libgmp-dev \
libisl-dev \
libmpc-dev \
@@ -156,6 +158,11 @@ if [[ $INSTALL_NUTTX == "true" ]]; then
gcc-arm-none-eabi \
gcc-multilib \
;
# Install the appimagetool for building AppImages
sudo wget -O /usr/local/bin/appimagetool \
https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage
sudo chmod +x /usr/local/bin/appimagetool
fi
if [[ "${INSTALL_ARCH}" == "aarch64" ]]; then
@@ -163,6 +170,10 @@ if [[ $INSTALL_NUTTX == "true" ]]; then
g++-aarch64-linux-gnu \
g++-arm-linux-gnueabihf \
;
# Install the appimagetool for building AppImages
sudo wget -O /usr/local/bin/appimagetool \
https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-aarch64.AppImage
sudo chmod +x /usr/local/bin/appimagetool
fi
if [ -n "$USER" ]; then
+55
View File
@@ -0,0 +1,55 @@
FROM ubuntu:24.04
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
curl \
gnupg \
lsb-release \
libbsd0 \
libcom-err2 \
libc6 \
libgcc-s1 \
libgssapi-krb5-2 \
libk5crypto3 \
libkeyutils1 \
libkrb5-3 \
libkrb5support0 \
libmd0 \
libnorm1 \
libpgm-5.3-0 \
libprotobuf32 \
libprotobuf-lite32t64 \
libsodium23 \
libstdc++6 \
libuuid1 \
libzmq5 \
wget \
zlib1g \
&& rm -fr /var/lib/apt/lists/*
RUN curl -sSL https://packages.osrfoundation.org/gazebo.key \
| gpg --dearmor -o /usr/share/keyrings/gazebo-archive-keyring.gpg \
&& echo "deb [signed-by=/usr/share/keyrings/gazebo-archive-keyring.gpg] \
http://packages.osrfoundation.org/gazebo/ubuntu-stable \
$(lsb_release -cs) main" \
> /etc/apt/sources.list.d/gazebo-stable.list \
&& apt-get update \
&& apt-get install -y --no-install-recommends \
libgz-msgs10 \
libgz-transport13 \
libgz-utils2 \
&& rm -fr /var/lib/apt/lists/*
COPY build/px4_sitl_default/bin /opt/px4/bin
COPY build/px4_sitl_default/etc /opt/px4/etc
WORKDIR /opt/px4
COPY Tools/sitl-container/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
EXPOSE 14540/udp 14550/udp 8888/udp
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD []
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
sudo docker run \
--rm -it \
--device /dev/fuse --cap-add SYS_ADMIN \
-p 14540:14540/udp \
-p 14550:14550/udp \
-p 8888:8888/udp \
px4-sitl:local
+11
View File
@@ -0,0 +1,11 @@
#!/bin/sh
set -e
PX4_BIN=/opt/px4/bin/px4
# if no args passed, default to SITL none
if [ $# -eq 0 ]; then
exec "$PX4_BIN"
else
exec "$PX4_BIN" "$@"
fi