Skip to content

Merge pull request #351 from cosmic-utils/feat/persist-aspect-ratio #745

Merge pull request #351 from cosmic-utils/feat/persist-aspect-ratio

Merge pull request #351 from cosmic-utils/feat/persist-aspect-ratio #745

Workflow file for this run

name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:
inputs:
build_aarch64_flatpak:
description: 'Build aarch64 Flatpak (slow, ~6 hours with QEMU)'
required: false
default: false
type: boolean
build_armhf_flatpak:
description: 'Build armhf Flatpak (slow, uses QEMU)'
required: false
default: false
type: boolean
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
CARGO_TERM_COLOR: always
jobs:
check:
name: Check & Test
runs-on: ubuntu-latest
steps:
- name: Free disk space
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-tags: true
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
components: rustfmt, clippy
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
pkg-config \
libglib2.0-dev \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libgstreamer-plugins-bad1.0-dev \
gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly \
gstreamer1.0-libav \
libwayland-dev \
libxkbcommon-dev \
libinput-dev \
libudev-dev \
libseat-dev \
libclang-dev \
cmake \
nasm \
meson \
ninja-build \
python3-jinja2 \
python3-yaml \
python3-ply \
libyaml-dev
- name: Build and install libcamera 0.7.0
run: |
git clone --depth 1 --branch v0.7.0 https://git.libcamera.org/libcamera/libcamera.git /tmp/libcamera
cd /tmp/libcamera
meson setup build -Dprefix=/usr -Dpipelines=uvcvideo,simple -Dipas=simple -Dgstreamer=disabled -Dtest=false -Dcam=disabled -Dqcam=disabled -Dlc-compliance=disabled -Dtracing=disabled -Ddocumentation=disabled -Dpycamera=disabled
ninja -C build
sudo ninja -C build install
sudo ldconfig
- name: Install just
uses: extractions/setup-just@v3
- name: Cache cargo registry
uses: actions/cache@v5
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- name: Run checks
run: just check
# Cross-compiled debug builds to verify compilation on all target architectures
build:
name: Build (${{ matrix.arch }})
runs-on: ubuntu-latest
needs: check
strategy:
fail-fast: false
matrix:
include:
- arch: x86_64
target: x86_64-unknown-linux-gnu
use_cross: false
- arch: aarch64
target: aarch64-unknown-linux-gnu
use_cross: true
- arch: armhf
target: armv7-unknown-linux-gnueabihf
use_cross: true
- arch: riscv64
target: riscv64gc-unknown-linux-gnu
use_cross: true
- arch: x86_64-musl
target: x86_64-unknown-linux-musl
use_cross: true
- arch: aarch64-musl
target: aarch64-unknown-linux-musl
use_cross: true
steps:
- name: Free disk space
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-tags: true
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
targets: ${{ matrix.target }}
- name: Install system dependencies (native build)
if: ${{ !matrix.use_cross }}
run: |
sudo apt-get update
sudo apt-get install -y \
pkg-config \
libglib2.0-dev \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libgstreamer-plugins-bad1.0-dev \
libwayland-dev \
libxkbcommon-dev \
libinput-dev \
libudev-dev \
libseat-dev \
libclang-dev \
cmake \
nasm \
meson \
ninja-build \
python3-jinja2 \
python3-yaml \
python3-ply \
libyaml-dev
- name: Build and install libcamera 0.7.0 (native build)
if: ${{ !matrix.use_cross }}
run: |
git clone --depth 1 --branch v0.7.0 https://git.libcamera.org/libcamera/libcamera.git /tmp/libcamera
cd /tmp/libcamera
meson setup build -Dprefix=/usr -Dpipelines=uvcvideo,simple -Dipas=simple -Dgstreamer=disabled -Dtest=false -Dcam=disabled -Dqcam=disabled -Dlc-compliance=disabled -Dtracing=disabled -Ddocumentation=disabled -Dpycamera=disabled
ninja -C build
sudo ninja -C build install
sudo ldconfig
- name: Install cross
if: ${{ matrix.use_cross }}
run: cargo install cross --git https://github.com/cross-rs/cross
- name: Install podman
if: ${{ matrix.use_cross }}
run: sudo apt-get update && sudo apt-get install -y podman
- name: Install just
uses: extractions/setup-just@v3
- name: Build debug binary
env:
CROSS_CONTAINER_ENGINE: podman
run: |
if [ "${{ matrix.use_cross }}" = "true" ]; then
CROSS_BUILD_OPTS="--build-arg RUST_VERSION=$(rustc -V | cut -d' ' -f2)" \
cross build --target ${{ matrix.target }}
else
just build-debug --target ${{ matrix.target }}
fi
apkbuild:
name: APKBUILD
runs-on: ubuntu-latest
needs: check
container:
image: alpine:edge
steps:
- name: Install build dependencies
run: |
apk add --no-cache \
alpine-sdk sudo git atools \
cargo \
clang-libclang \
cmake \
cosmic-icons \
eudev-dev \
glib-dev \
gst-plugins-bad-dev \
gst-plugins-base-dev \
gstreamer-dev \
just \
libcamera-dev \
libinput-dev \
libseat-dev \
libxkbcommon-dev \
nasm \
pkgconf \
samurai \
wayland-dev
- name: Set up abuild
run: |
adduser -D builder
addgroup builder abuild
echo "builder ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
sudo -Hu builder abuild-keygen -a -n
cp /home/builder/.abuild/*.rsa.pub /etc/apk/keys/
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-tags: true
- name: Generate APKBUILD and source tarball
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
VERSION=$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)"/\1/')
# Create source tarball matching GitHub's archive format
git archive --format=tar.gz --prefix=camera-$VERSION/ HEAD > /tmp/camera-$VERSION.tar.gz
CHECKSUM=$(sha512sum /tmp/camera-$VERSION.tar.gz | awk '{print $1}')
# Place tarball in distfiles cache where abuild expects it
mkdir -p /var/cache/distfiles
cp /tmp/camera-$VERSION.tar.gz /var/cache/distfiles/camera-$VERSION.tar.gz
chmod 644 /var/cache/distfiles/camera-$VERSION.tar.gz
# Generate APKBUILD from template
mkdir -p /home/builder/apkbuild
sed -e "s/@@VERSION@@/$VERSION/g" \
-e "s/@@CHECKSUM@@/$CHECKSUM/g" \
.github/APKBUILD.template > /home/builder/apkbuild/APKBUILD
chown -R builder:builder /home/builder/apkbuild
- name: Lint APKBUILD
run: apkbuild-lint /home/builder/apkbuild/APKBUILD
- name: Build package
run: |
cd /home/builder/apkbuild
sudo -Hu builder abuild -r
flatpak-x86_64:
name: Flatpak (x86_64)
runs-on: ubuntu-latest
needs: check
steps:
- name: Free disk space
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-tags: true
- name: Install Flatpak and flatpak-builder
run: |
sudo apt-get update
sudo apt-get install -y flatpak flatpak-builder
- name: Add Flathub remote
run: sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
- name: Install just
uses: extractions/setup-just@v3
- name: Install Flatpak dependencies
run: just flatpak-deps x86_64
- name: Install Python dependencies
run: pip install aiohttp toml tomlkit
- name: Build Flatpak bundle
run: just flatpak-bundle x86_64
- name: Upload Flatpak bundle
uses: actions/upload-artifact@v7
with:
name: camera-x86_64.flatpak
path: camera-x86_64.flatpak
if-no-files-found: error
retention-days: 7
flatpak-aarch64:
name: Flatpak (aarch64)
runs-on: ubuntu-latest
needs: check
# Only run on manual trigger with build_aarch64_flatpak=true
if: github.event_name == 'workflow_dispatch' && inputs.build_aarch64_flatpak
steps:
- name: Free disk space
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-tags: true
- name: Install Flatpak and flatpak-builder
run: |
sudo apt-get update
sudo apt-get install -y flatpak flatpak-builder
- name: Set up QEMU for multi-arch builds
uses: docker/setup-qemu-action@v4
with:
platforms: arm64
- name: Add Flathub remote
run: sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
- name: Install just
uses: extractions/setup-just@v3
- name: Install Flatpak dependencies
run: just flatpak-deps aarch64
- name: Install Python dependencies
run: pip install aiohttp toml tomlkit
- name: Build Flatpak bundle
run: just flatpak-bundle aarch64
- name: Upload Flatpak bundle
uses: actions/upload-artifact@v7
with:
name: camera-aarch64.flatpak
path: camera-aarch64.flatpak
if-no-files-found: error
retention-days: 7
flatpak-armhf:
name: Flatpak (armhf)
runs-on: ubuntu-latest
needs: check
# Only run on manual trigger with build_armhf_flatpak=true
if: github.event_name == 'workflow_dispatch' && inputs.build_armhf_flatpak
steps:
- name: Free disk space
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-tags: true
- name: Install Flatpak and flatpak-builder
run: |
sudo apt-get update
sudo apt-get install -y flatpak flatpak-builder
- name: Set up QEMU for multi-arch builds
uses: docker/setup-qemu-action@v4
with:
platforms: arm
- name: Add Flathub remote
run: sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
- name: Install just
uses: extractions/setup-just@v3
- name: Install Flatpak dependencies
run: just flatpak-deps arm
- name: Install Python dependencies
run: pip install aiohttp toml tomlkit
- name: Build Flatpak bundle
run: just flatpak-bundle arm
- name: Upload Flatpak bundle
uses: actions/upload-artifact@v7
with:
name: camera-armhf.flatpak
path: camera-armhf.flatpak
if-no-files-found: error
retention-days: 7