From 8fbf4d92cbc198fdcf277dba4c8c1db957792e2d Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Thu, 20 Aug 2026 21:01:43 +0200 Subject: [PATCH] ci: match release bundles by extension, and ship the rpm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Renaming the app to JellyTau renamed its bundles, and the release job globbed `bundle/deb/jellytau_*.deb`. The copy was wrapped in `if [ -f ... ]`, so the rename would have dropped the .deb from the release silently — a green build producing an incomplete release. Matching by extension removes the coupling between the product name and the pipeline, and an empty dist/linux now fails the job instead of passing quietly. That `if [ -f "dir/"*.ext ]` guard was also wrong on its own terms: with more than one match, test gets extra arguments and returns false. Found while verifying the rename: the rpm has been built by every release since deb+rpm became the bundle targets, and never copied, published or documented. It ships now. Also declares the package rename. Tauri kebab-cases productName into the Debian package name, so "JellyTau" produces `jelly-tau` — a different package from the `jellytau` earlier releases installed, which would have put a second copy alongside the old one. deb now declares Replaces/Conflicts/Provides and rpm Obsoletes/Provides, verified in the built control file. TRACES: | DR-214 --- .gitea/workflows/build-release.yml | 39 +++++++++++++++++++++--------- docs/build/build-release.md | 21 +++++++++++++--- src-tauri/tauri.conf.json | 23 +++++++++++++++++- 3 files changed, 66 insertions(+), 17 deletions(-) diff --git a/.gitea/workflows/build-release.yml b/.gitea/workflows/build-release.yml index 4daf2e13..151b4910 100644 --- a/.gitea/workflows/build-release.yml +++ b/.gitea/workflows/build-release.yml @@ -131,13 +131,27 @@ jobs: - name: Prepare Linux artifacts run: | mkdir -p dist/linux - # Copy AppImage - if [ -f "src-tauri/target/release/bundle/appimage/jellytau_"*.AppImage ]; then - cp src-tauri/target/release/bundle/appimage/jellytau_*.AppImage dist/linux/ - fi - # Copy .deb if built - if [ -f "src-tauri/target/release/bundle/deb/jellytau_"*.deb ]; then - cp src-tauri/target/release/bundle/deb/jellytau_*.deb dist/linux/ + # Match by extension, not by product name. Bundle filenames follow + # `productName`, so renaming the app (jellytau -> JellyTau) made the + # old `jellytau_*.deb` glob match nothing — and because the copy was + # wrapped in `if [ -f ... ]`, the artifact simply vanished from the + # release with no error. Each bundle directory holds one file. + # + # `if [ -f "dir/"*.ext ]` was also wrong on its own terms: with more + # than one match `test` gets extra arguments and fails. + shopt -s nullglob + for bundle in \ + src-tauri/target/release/bundle/appimage/*.AppImage \ + src-tauri/target/release/bundle/deb/*.deb \ + src-tauri/target/release/bundle/rpm/*.rpm; do + cp -v "$bundle" dist/linux/ + done + shopt -u nullglob + + # A release with no Linux package is a failure, not a quiet success. + if [ -z "$(ls -A dist/linux/)" ]; then + echo "::error::No Linux bundles found under src-tauri/target/release/bundle/" + exit 1 fi ls -lah dist/linux/ @@ -342,10 +356,11 @@ jobs: echo "" >> release_notes.md echo "#### Linux" >> release_notes.md echo "- **AppImage** - Run directly on most Linux distributions" >> release_notes.md - echo "- **DEB** - Install via \`sudo dpkg -i jellytau_*.deb\` (Ubuntu/Debian)" >> release_notes.md + echo "- **DEB** - Install via \`sudo dpkg -i JellyTau_*.deb\` (Ubuntu/Debian)" >> release_notes.md + echo "- **RPM** - Install via \`sudo rpm -i JellyTau-*.rpm\` (Fedora/openSUSE)" >> release_notes.md echo "" >> release_notes.md echo "#### Windows" >> release_notes.md - echo "- **Installer (.exe)** - Run \`jellytau_*-setup.exe\` (NSIS). Unsigned — SmartScreen may warn on first run." >> release_notes.md + echo "- **Installer (.exe)** - Run \`JellyTau_*-setup.exe\` (NSIS). Unsigned — SmartScreen may warn on first run." >> release_notes.md echo "" >> release_notes.md echo "#### Android" >> release_notes.md echo "- **APK** - Install via \`adb install jellytau-release.apk\` or sideload via file manager" >> release_notes.md @@ -359,13 +374,13 @@ jobs: echo "" >> release_notes.md echo "#### Linux (AppImage)" >> release_notes.md echo "\`\`\`bash" >> release_notes.md - echo "chmod +x jellytau_*.AppImage" >> release_notes.md - echo "./jellytau_*.AppImage" >> release_notes.md + echo "chmod +x JellyTau_*.AppImage" >> release_notes.md + echo "./JellyTau_*.AppImage" >> release_notes.md echo "\`\`\`" >> release_notes.md echo "" >> release_notes.md echo "#### Linux (DEB)" >> release_notes.md echo "\`\`\`bash" >> release_notes.md - echo "sudo dpkg -i jellytau_*.deb" >> release_notes.md + echo "sudo dpkg -i JellyTau_*.deb" >> release_notes.md echo "jellytau" >> release_notes.md echo "\`\`\`" >> release_notes.md echo "" >> release_notes.md diff --git a/docs/build/build-release.md b/docs/build/build-release.md index 7edd7382..aa6cfe35 100644 --- a/docs/build/build-release.md +++ b/docs/build/build-release.md @@ -116,17 +116,30 @@ Runs after both builds succeed (only on version tags): - **Use:** Run directly on any Linux distro - **Installation:** ```bash - chmod +x jellytau_*.AppImage - ./jellytau_*.AppImage + chmod +x JellyTau_*.AppImage + ./JellyTau_*.AppImage ``` #### DEB Package -- **File:** `jellytau_*.deb` +- **File:** `JellyTau_*.deb` - **Size:** ~80-120 MB - **Use:** Install on Debian/Ubuntu/similar - **Installation:** ```bash - sudo dpkg -i jellytau_*.deb + sudo dpkg -i JellyTau_*.deb + jellytau + ``` +- **Note:** the Debian package is named `jelly-tau` (Tauri kebab-cases + `productName`), while the command stays `jellytau`. The package declares + `Replaces`/`Conflicts`/`Provides: jellytau`, so upgrading from a release built + before the rename replaces it rather than installing a second copy. + +#### RPM Package +- **File:** `JellyTau-*.rpm` +- **Use:** Install on Fedora/openSUSE/similar +- **Installation:** + ```bash + sudo rpm -i JellyTau-*.rpm jellytau ``` diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 3afffc4c..5024d60e 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -50,7 +50,28 @@ "category": "Video", "shortDescription": "A cross-platform Jellyfin client", "longDescription": "JellyTau is a Jellyfin client for Linux and Android. It streams and downloads music and video from a Jellyfin server, plays them back offline, and can control other Jellyfin sessions on the network.", - "licenseFile": "../LICENSE" + "licenseFile": "../LICENSE", + "linux": { + "deb": { + "provides": [ + "jellytau" + ], + "conflicts": [ + "jellytau" + ], + "replaces": [ + "jellytau" + ] + }, + "rpm": { + "provides": [ + "jellytau" + ], + "obsoletes": [ + "jellytau" + ] + } + } }, "mainBinaryName": "jellytau" }