Merge pull request #351 from cosmic-utils/feat/persist-aspect-ratio #745
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: | |
| 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 |