name: 'Build Linux' description: 'Builds the Quintodrome desktop app and packages it as a Flatpak and a Snap' inputs: arch: description: 'Architecture name used in artifact names (x86_64 or aarch64)' required: true upload-artifact: description: 'Whether to upload artifacts' required: false default: 'true' runs: using: 'composite' steps: - name: Setup Node uses: actions/setup-node@v6 with: node-version: 24 cache: npm cache-dependency-path: ui/package-lock.json - name: Setup Go uses: actions/setup-go@v6 with: go-version-file: go.mod - name: Setup Rust uses: dtolnay/rust-toolchain@stable - name: Cache Rust build uses: Swatinem/rust-cache@v2 with: workspaces: desktop/src-tauri - name: Install Tauri build dependencies shell: bash run: | sudo apt-get update sudo apt-get install -y \ build-essential file patchelf \ libwebkit2gtk-4.1-dev libssl-dev librsvg2-dev libxdo-dev - name: Install Flatpak build tools shell: bash run: | sudo apt-get install -y flatpak flatpak-builder flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo - name: Cache Flatpak runtimes uses: actions/cache@v5 with: path: ~/.local/share/flatpak key: flatpak-runtimes-${{ runner.os }}-${{ inputs.arch }}-gnome-49 - name: Install Snapcraft shell: bash run: sudo snap install snapcraft --classic - name: Build Navidrome web UI shell: bash run: | cd ui npm ci --ignore-scripts npm run build - name: Build Navidrome server binary shell: bash run: | GIT_SHA=$(git rev-parse --short HEAD) if [[ "$GITHUB_REF" == refs/tags/* ]]; then GIT_TAG="${GITHUB_REF_NAME#v}" else GIT_TAG="dev" fi go build \ -ldflags="-X github.com/navidrome/navidrome/consts.gitSha=$GIT_SHA -X github.com/navidrome/navidrome/consts.gitTag=$GIT_TAG" \ -tags=netgo,sqlite_fts5 \ -o navidrome # Stage the sidecar under the target-triple name tauri expects. TRIPLE="$(cd desktop && rustc -vV | sed -n 's/^host: //p')" mkdir -p desktop/src-tauri/binaries install -m755 navidrome "desktop/src-tauri/binaries/navidrome-$TRIPLE" - name: Build Tauri app (.deb) # The .deb is only an intermediate: both the Flatpak and Snap repackage it. shell: bash run: | cd desktop npx --yes @tauri-apps/cli@2 build --bundles deb cp src-tauri/target/release/bundle/deb/*.deb linux/quintodrome.deb cp linux/quintodrome.deb linux/snapcraft/quintodrome.deb - name: Build Flatpak shell: bash run: | mkdir -p dist cd desktop/linux flatpak-builder --user --force-clean --install-deps-from=flathub \ --repo=flatpak-repo flatpak-build flatpak/com.quineglobal.drome.yml flatpak build-bundle \ --runtime-repo=https://flathub.org/repo/flathub.flatpakrepo \ flatpak-repo "../../dist/Quintodrome-linux-${{ inputs.arch }}.flatpak" com.quineglobal.drome - name: Build Snap # The runner is Ubuntu 24.04, matching the snap's core24 base, so build # directly on the host instead of spinning up an LXD container. # snapcraft refuses an --output path that escapes the project dir (e.g. # via ../..), so pack in place and move the result into dist/ ourselves. shell: bash run: | cd desktop/linux/snapcraft sudo snapcraft pack --destructive-mode mkdir -p ../../../dist mv ./*.snap "../../../dist/Quintodrome-linux-${{ inputs.arch }}.snap" - name: List artifacts shell: bash run: ls -la dist - name: Archive Build Artifacts if: ${{ inputs.upload-artifact == 'true' }} uses: actions/upload-artifact@v7 with: name: desktop-linux-${{ inputs.arch }} path: | dist/*.flatpak dist/*.snap retention-days: 7