ci: match release bundles by extension, and ship the rpm

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
This commit is contained in:
2026-08-20 21:01:43 +02:00
parent d32ca13d00
commit 8fbf4d92cb
3 changed files with 66 additions and 17 deletions
+27 -12
View File
@@ -131,13 +131,27 @@ jobs:
- name: Prepare Linux artifacts - name: Prepare Linux artifacts
run: | run: |
mkdir -p dist/linux mkdir -p dist/linux
# Copy AppImage # Match by extension, not by product name. Bundle filenames follow
if [ -f "src-tauri/target/release/bundle/appimage/jellytau_"*.AppImage ]; then # `productName`, so renaming the app (jellytau -> JellyTau) made the
cp src-tauri/target/release/bundle/appimage/jellytau_*.AppImage dist/linux/ # old `jellytau_*.deb` glob match nothing — and because the copy was
fi # wrapped in `if [ -f ... ]`, the artifact simply vanished from the
# Copy .deb if built # release with no error. Each bundle directory holds one file.
if [ -f "src-tauri/target/release/bundle/deb/jellytau_"*.deb ]; then #
cp src-tauri/target/release/bundle/deb/jellytau_*.deb dist/linux/ # `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 fi
ls -lah dist/linux/ ls -lah dist/linux/
@@ -342,10 +356,11 @@ jobs:
echo "" >> release_notes.md echo "" >> release_notes.md
echo "#### Linux" >> release_notes.md echo "#### Linux" >> release_notes.md
echo "- **AppImage** - Run directly on most Linux distributions" >> 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 "" >> release_notes.md
echo "#### Windows" >> 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 "" >> release_notes.md
echo "#### Android" >> 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 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 "" >> release_notes.md
echo "#### Linux (AppImage)" >> release_notes.md echo "#### Linux (AppImage)" >> release_notes.md
echo "\`\`\`bash" >> release_notes.md echo "\`\`\`bash" >> release_notes.md
echo "chmod +x jellytau_*.AppImage" >> release_notes.md echo "chmod +x JellyTau_*.AppImage" >> release_notes.md
echo "./jellytau_*.AppImage" >> release_notes.md echo "./JellyTau_*.AppImage" >> release_notes.md
echo "\`\`\`" >> release_notes.md echo "\`\`\`" >> release_notes.md
echo "" >> release_notes.md echo "" >> release_notes.md
echo "#### Linux (DEB)" >> release_notes.md echo "#### Linux (DEB)" >> release_notes.md
echo "\`\`\`bash" >> 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 "jellytau" >> release_notes.md
echo "\`\`\`" >> release_notes.md echo "\`\`\`" >> release_notes.md
echo "" >> release_notes.md echo "" >> release_notes.md
+17 -4
View File
@@ -116,17 +116,30 @@ Runs after both builds succeed (only on version tags):
- **Use:** Run directly on any Linux distro - **Use:** Run directly on any Linux distro
- **Installation:** - **Installation:**
```bash ```bash
chmod +x jellytau_*.AppImage chmod +x JellyTau_*.AppImage
./jellytau_*.AppImage ./JellyTau_*.AppImage
``` ```
#### DEB Package #### DEB Package
- **File:** `jellytau_*.deb` - **File:** `JellyTau_*.deb`
- **Size:** ~80-120 MB - **Size:** ~80-120 MB
- **Use:** Install on Debian/Ubuntu/similar - **Use:** Install on Debian/Ubuntu/similar
- **Installation:** - **Installation:**
```bash ```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 jellytau
``` ```
+22 -1
View File
@@ -50,7 +50,28 @@
"category": "Video", "category": "Video",
"shortDescription": "A cross-platform Jellyfin client", "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.", "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" "mainBinaryName": "jellytau"
} }