Swadhin Biswas

[email protected]
2026-03-31 08:55:56 +0600 committed NaN years ago
3410964
commit 3410964
10 files changed
+377 -27
▼.github/workflows/ci.yml
+21-1
145
145
- name: Build Tauri app
146
146
run: npm run tauri build
147
147
148
+ - name: Install Ruby and fpm for RPM conversion
149
+ run: |
150
+ sudo apt-get install -y ruby ruby-dev
151
+ gem install fpm
152
+
153
+ - name: Build RPM package
154
+ run: ./scripts/build-rpm.sh
155
+
148
156
- name: Upload DEB artifact
149
157
uses: actions/upload-artifact@v4
150
158
if: github.event_name == 'pull_request'
252
260
- name: Install dependencies
253
261
run: npm install
254
262
263
+ - name: Build frontend
264
+ run: npm run build
265
+
255
266
- name: Build Tauri app
256
267
run: npm run tauri build
257
268
269
+ - name: Install Ruby and fpm for RPM conversion
270
+ run: |
271
+ sudo apt-get install -y ruby ruby-dev
272
+ gem install fpm
273
+
274
+ - name: Build RPM package
275
+ run: ./scripts/build-rpm.sh
276
+
258
277
- name: Test binary exists
259
278
run: |
260
279
echo "Verifying binary..."
266
285
echo "Checking bundle outputs..."
267
286
ls -la src-tauri/target/release/bundle/
268
287
[ -d "src-tauri/target/release/bundle/deb" ] && echo "DEB: OK"
269
- [ -d "src-tauri/target/release/bundle/appimage" ] && echo "AppImage: OK"
270
288
[ -d "src-tauri/target/release/bundle/rpm" ] && echo "RPM: OK"
289
+ [ -f "src-tauri/target/release/bundle/deb/"*.deb ] && echo "DEB package: OK"
290
+ [ -f "src-tauri/target/release/bundle/rpm/"*.rpm ] && echo "RPM package: OK"
271
291
272
292
- name: Verify desktop file template
273
293
run: |
274
294
▼.github/workflows/release.yml
+46-7
51
51
- name: Install npm dependencies
52
52
run: npm install
53
53
54
+ - name: Build frontend
55
+ run: npm run build
56
+
54
57
- name: Build Tauri application
55
58
uses: tauri-apps/tauri-action@v0
56
59
env:
70
73
sudo apt install ./linuxy_*.deb
71
74
```
72
75
76
+ ### RHEL/Fedora/OpenSUSE
77
+ ```bash
78
+ sudo dnf install ./linuxy-*.rpm
79
+ ```
80
+
73
81
### Arch Linux (AUR)
74
82
```bash
75
83
yay -S linuxy
81
89
prerelease: false
82
90
includeDebug: false
83
91
92
+ - name: Install Ruby and fpm for RPM conversion
93
+ run: |
94
+ sudo apt-get install -y ruby ruby-dev
95
+ gem install fpm
96
+
97
+ - name: Build RPM package
98
+ run: ./scripts/build-rpm.sh
99
+
84
100
- name: Extract version
85
101
id: get_version
86
102
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
91
107
files: src-tauri/target/release/bundle/deb/*.deb
92
108
draft: true
93
109
94
- - name: Upload AppImage to release
95
- uses: softprops/action-gh-release@v1
96
- if: hashFiles('src-tauri/target/release/bundle/appimage/*.AppImage') != ''
97
- with:
98
- files: src-tauri/target/release/bundle/appimage/*.AppImage
99
- draft: true
100
-
101
110
- name: Upload RPM to release
102
111
uses: softprops/action-gh-release@v1
103
112
if: hashFiles('src-tauri/target/release/bundle/rpm/*.rpm') != ''
105
114
files: src-tauri/target/release/bundle/rpm/*.rpm
106
115
draft: true
107
116
117
+ publish-aur:
118
+ name: Publish AUR Package
119
+ runs-on: ubuntu-latest
120
+ needs: build-release
121
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
122
+
123
+ steps:
124
+ - name: Checkout repository
125
+ uses: actions/checkout@v4
126
+
127
+ - name: Extract version
128
+ id: get_version
129
+ run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
130
+
131
+ - name: Update PKGBUILD version
132
+ run: |
133
+ sed -i "s/pkgver=.*/pkgver=${{ steps.get_version.outputs.VERSION }}/" packaging/aur/PKGBUILD
134
+ sed -i "s|source = linuxy-.*|source = linuxy-${{ steps.get_version.outputs.VERSION }}.tar.gz::https://github.com/swadhinbiswas/linuxy/archive/refs/tags/v${{ steps.get_version.outputs.VERSION }}.tar.gz|" packaging/aur/.SRCINFO
135
+
136
+ - name: Publish to AUR
137
+ uses: KSXGitHub/[email protected]
138
+ with:
139
+ pkgname: linuxy
140
+ pkgbuild: packaging/aur/PKGBUILD
141
+ commit_username: ${{ secrets.AUR_USERNAME }}
142
+ commit_email: ${{ secrets.AUR_EMAIL }}
143
+ ssh_private_key: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
144
+ commit_message: "chore: update to version ${{ steps.get_version.outputs.VERSION }}"
145
+ ssh_keyscan_types: rsa,ed25519
146
+
108
147
notify:
109
148
name: Notify Release
110
149
runs-on: ubuntu-latest
111
150
▼packaging/README.md
+124-0
1
+# Linuxy Packaging
2
+
3
+This directory contains packaging files for distributing Linuxy across different Linux distributions.
4
+
5
+## Package Formats
6
+
7
+### DEB (Debian/Ubuntu)
8
+Built automatically by Tauri. Supports:
9
+- Debian 10+
10
+- Ubuntu 20.04+
11
+- Linux Mint
12
+- Pop!_OS
13
+- Other Debian-based distributions
14
+
15
+**Installation:**
16
+```bash
17
+sudo apt install ./linuxy_*.deb
18
+```
19
+
20
+### RPM (RHEL/Fedora/OpenSUSE)
21
+Converted from DEB using `fpm`. Supports:
22
+- Fedora 35+
23
+- RHEL 8+
24
+- CentOS 8+
25
+- OpenSUSE Tumbleweed
26
+- Other RPM-based distributions
27
+
28
+**Installation:**
29
+```bash
30
+# Fedora/RHEL
31
+sudo dnf install ./linuxy-*.rpm
32
+
33
+# OpenSUSE
34
+sudo zypper install ./linuxy-*.rpm
35
+```
36
+
37
+### AUR (Arch Linux)
38
+Community-maintained package for Arch-based distributions.
39
+
40
+**Installation:**
41
+```bash
42
+# Using yay
43
+yay -S linuxy
44
+
45
+# Using paru
46
+paru -S linuxy
47
+
48
+# Manual build
49
+git clone https://aur.archlinux.org/linuxy.git
50
+cd linuxy
51
+makepkg -si
52
+```
53
+
54
+## Building Packages Locally
55
+
56
+### Prerequisites
57
+
58
+```bash
59
+# Debian/Ubuntu
60
+sudo apt install -y libwebkit2gtk-4.0-dev build-essential libssl-dev \
61
+ libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev \
62
+ ruby ruby-dev
63
+
64
+# Arch Linux
65
+sudo pacman -S webkit2gtk base-devel openssl gtk3 \
66
+ libappindicator-gtk3 librsvg libxdo ruby
67
+
68
+# Fedora
69
+sudo dnf install -y webkit2gtk3-devel openssl-devel gtk3-devel \
70
+ libappindicator-gtk3-devel librsvg2-devel ruby ruby-dev
71
+```
72
+
73
+### Build Commands
74
+
75
+```bash
76
+# Install Node.js dependencies
77
+npm install
78
+
79
+# Build DEB package (and frontend)
80
+npm run tauri build
81
+
82
+# Build RPM package (requires fpm)
83
+./scripts/build-rpm.sh
84
+```
85
+
86
+## AUR Package Maintenance
87
+
88
+The AUR package files are located in `packaging/aur/`:
89
+
90
+- `PKGBUILD` - Build script for AUR
91
+- `.SRCINFO` - Package metadata
92
+- `linuxy.install` - Install/upgrade hooks
93
+
94
+To update the AUR package version:
95
+
96
+1. Update `pkgver` in `PKGBUILD`
97
+2. Update source URL with new version
98
+3. Regenerate `.SRCINFO`:
99
+ ```bash
100
+ cd packaging/aur
101
+ makepkg --printsrcinfo > .SRCINFO
102
+ ```
103
+
104
+4. Push to AUR:
105
+ ```bash
106
+ git clone ssh://[email protected]/linuxy.git
107
+ cp PKGBUILD .SRCINFO linuxy.install linuxy/
108
+ cd linuxy
109
+ git add .
110
+ git commit -m "Update to version X.Y.Z"
111
+ git push
112
+ ```
113
+
114
+## Release Checklist
115
+
116
+- [ ] Update version in `package.json`
117
+- [ ] Update version in `src-tauri/Cargo.toml`
118
+- [ ] Update `CHANGELOG.md`
119
+- [ ] Create git tag: `git tag -a vX.Y.Z -m "Release vX.Y.Z"`
120
+- [ ] Push tag: `git push origin vX.Y.Z`
121
+- [ ] GitHub Actions will build and publish:
122
+ - DEB package (GitHub Releases)
123
+ - RPM package (GitHub Releases)
124
+ - AUR package (AUR repository)
0
125
▼packaging/aur/.SRCINFO
+20-0
1
+pkgbase = linuxy
2
+ pkgdesc = One-click Linux Application Manager with Firejail sandboxing
3
+ pkgver = 1.0.0
4
+ pkgrel = 1
5
+ url = https://github.com/swadhinbiswas/linuxy
6
+ arch = x86_64
7
+ license = MIT
8
+ depends = firejail
9
+ depends = xdg-utils
10
+ depends = webkit2gtk
11
+ depends = gtk3
12
+ depends = libappindicator-gtk3
13
+ depends = libxdo
14
+ makedepends = cargo
15
+ makedepends = nodejs
16
+ makedepends = npm
17
+ source = linuxy-1.0.0.tar.gz::https://github.com/swadhinbiswas/linuxy/archive/refs/tags/v1.0.0.tar.gz
18
+ sha256sums = SKIP
19
+
20
+pkgname = linuxy
0
21
▼packaging/aur/PKGBUILD
+34-13
1
-# Maintainer: You <[email protected]>
1
+# Maintainer: Swadhin Biswas <[email protected]>
2
+# AUR Package for Linuxy - One-click Linux Application Manager
3
+
2
4
pkgname=linuxy
3
-pkgver=0.1.0
5
+pkgver=1.0.0
4
6
pkgrel=1
5
-pkgdesc="A centralized AppImage manager and installer"
7
+pkgdesc="One-click Linux Application Manager with Firejail sandboxing"
6
8
arch=('x86_64')
7
-url="https://github.com/yourusername/linuxy"
9
+url="https://github.com/swadhinbiswas/linuxy"
8
10
license=('MIT')
9
-depends=('webkit2gtk' 'gtk3' 'cairo' 'pango' 'glib2' 'openssl' 'appimagetool')
10
-makedepends=('cargo' 'npm' 'nodejs')
11
-source=("$pkgname-$pkgver.tar.gz::https://github.com/yourusername/linuxy/archive/refs/tags/v$pkgver.tar.gz")
11
+depends=('firejail' 'xdg-utils' 'webkit2gtk' 'gtk3' 'libappindicator-gtk3' 'libxdo')
12
+makedepends=('cargo' 'nodejs' 'npm')
13
+install=linuxy.install
14
+source=("$pkgname-$pkgver.tar.gz::https://github.com/swadhinbiswas/$pkgname/archive/refs/tags/v$pkgver.tar.gz")
12
15
sha256sums=('SKIP')
13
16
17
+prepare() {
18
+ cd "$srcdir/$pkgname-$pkgver"
19
+ npm install
20
+}
21
+
14
22
build() {
15
- cd "$pkgname-$pkgver"
16
- npm install
17
- npm run build
18
- cargo build --release
23
+ cd "$srcdir/$pkgname-$pkgver"
24
+ npm run build
25
+ cd src-tauri
26
+ cargo build --release
19
27
}
20
28
21
29
package() {
22
- cd "$pkgname-$pkgver"
23
- install -Dm755 "src-tauri/target/release/linuxy" "$pkgdir/usr/bin/linuxy"
30
+ cd "$srcdir/$pkgname-$pkgver"
31
+
32
+ # Install binary
33
+ install -Dm755 "src-tauri/target/release/linuxy" "$pkgdir/usr/bin/linuxy"
34
+
35
+ # Install desktop file
36
+ install -Dm644 "src-tauri/debian/desktop-template.desktop" "$pkgdir/usr/share/applications/linuxy.desktop"
37
+
38
+ # Install icons
39
+ install -Dm644 "src-tauri/icons/32x32.png" "$pkgdir/usr/share/icons/hicolor/32x32/apps/linuxy.png"
40
+ install -Dm644 "src-tauri/icons/128x128.png" "$pkgdir/usr/share/icons/hicolor/128x128/apps/linuxy.png"
41
+ install -Dm644 "src-tauri/icons/[email protected]" "$pkgdir/usr/share/icons/hicolor/256x256@2/apps/linuxy.png"
42
+
43
+ # Install license
44
+ install -Dm644 "LICENSE" "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
24
45
}
25
46
▼packaging/aur/linuxy.install
+35-0
1
+#!/bin/bash
2
+
3
+# Post-install script for Linuxy
4
+post_install() {
5
+ # Update desktop database
6
+ if command -v update-desktop-database &> /dev/null; then
7
+ update-desktop-database /usr/share/applications 2>/dev/null || true
8
+ fi
9
+
10
+ # Update icon cache
11
+ if command -v gtk-update-icon-cache &> /dev/null; then
12
+ for size in 32x32 128x128 256x256; do
13
+ gtk-update-icon-cache -f -t /usr/share/icons/hicolor/$size 2>/dev/null || true
14
+ done
15
+ fi
16
+}
17
+
18
+# Post-remove script
19
+post_remove() {
20
+ # Update desktop database
21
+ if command -v update-desktop-database &> /dev/null; then
22
+ update-desktop-database /usr/share/applications 2>/dev/null || true
23
+ fi
24
+
25
+ # Update icon cache
26
+ if command -v gtk-update-icon-cache &> /dev/null; then
27
+ for size in 32x32 128x128 256x256; do
28
+ gtk-update-icon-cache -f -t /usr/share/icons/hicolor/$size 2>/dev/null || true
29
+ done
30
+ fi
31
+}
32
+
33
+post_upgrade() {
34
+ post_install
35
+}
0
36
▼scripts/build-rpm.sh
+57-0
1
+#!/bin/bash
2
+# Build RPM package from DEB for Linuxy
3
+# Requires: fpm (gem install fpm)
4
+
5
+set -e
6
+
7
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
+PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
9
+TAURI_TARGET="$PROJECT_ROOT/src-tauri/target"
10
+
11
+echo "=== Building RPM from DEB package ==="
12
+
13
+# Check if fpm is installed
14
+if ! command -v fpm &> /dev/null; then
15
+ echo "Warning: fpm is not installed. Skipping RPM build."
16
+ echo "To build RPM, install fpm with: gem install fpm"
17
+ echo "Or on Arch Linux: sudo pacman -S ruby base-devel && gem install fpm"
18
+ exit 0
19
+fi
20
+
21
+# Find the latest DEB package
22
+DEB_PACKAGE=$(ls -t "$TAURI_TARGET/release/bundle/deb/"*.deb 2>/dev/null | head -n1)
23
+
24
+if [ -z "$DEB_PACKAGE" ]; then
25
+ echo "Error: No DEB package found. Run 'npm run tauri build' first."
26
+ exit 1
27
+fi
28
+
29
+echo "Found DEB package: $DEB_PACKAGE"
30
+
31
+# Create RPM output directory
32
+RPM_OUTPUT="$TAURI_TARGET/release/bundle/rpm"
33
+mkdir -p "$RPM_OUTPUT"
34
+
35
+# Extract version from DEB filename
36
+VERSION=$(basename "$DEB_PACKAGE" | sed 's/linuxy_\([0-9.]*\)_amd64.deb/\1/')
37
+echo "Version: $VERSION"
38
+
39
+# Convert DEB to RPM using fpm
40
+echo "Converting DEB to RPM..."
41
+fpm --input-type deb \
42
+ --output-type rpm \
43
+ --name linuxy \
44
+ --version "$VERSION" \
45
+ --architecture x86_64 \
46
+ --url "https://github.com/swadhinbiswas/linuxy" \
47
+ --description "One-click Linux Application Manager with Firejail sandboxing" \
48
+ --maintainer "Swadhin Biswas" \
49
+ --license MIT \
50
+ --depends firejail \
51
+ --depends xdg-utils \
52
+ --package "$RPM_OUTPUT/linuxy-${VERSION}-1.x86_64.rpm" \
53
+ "$DEB_PACKAGE"
54
+
55
+echo "=== RPM build complete ==="
56
+echo "RPM package: $RPM_OUTPUT/linuxy-${VERSION}-1.x86_64.rpm"
57
+ls -la "$RPM_OUTPUT/"*.rpm
0
58
▼scripts/update-aur.sh
+34-0
1
+#!/bin/bash
2
+# Helper script to update AUR package version
3
+# Usage: ./scripts/update-aur.sh 1.0.0
4
+
5
+set -e
6
+
7
+if [ -z "$1" ]; then
8
+ echo "Usage: $0 <version>"
9
+ echo "Example: $0 1.0.0"
10
+ exit 1
11
+fi
12
+
13
+VERSION="$1"
14
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
15
+AUR_DIR="$(dirname "$SCRIPT_DIR")/packaging/aur"
16
+
17
+echo "Updating AUR package to version $VERSION..."
18
+
19
+# Update PKGBUILD
20
+sed -i "s/^pkgver=.*/pkgver=$VERSION/" "$AUR_DIR/PKGBUILD"
21
+sed -i "s|linuxy-.*\.tar.gz::|linuxy-$VERSION.tar.gz::|" "$AUR_DIR/PKGBUILD"
22
+sed -i "s|refs/tags/v.*|refs/tags/v$VERSION.tar.gz|" "$AUR_DIR/PKGBUILD"
23
+
24
+# Update .SRCINFO
25
+sed -i "s/^ pkgver = .*/ pkgver = $VERSION/" "$AUR_DIR/.SRCINFO"
26
+sed -i "s|linuxy-.*\.tar.gz::|linuxy-$VERSION.tar.gz::|" "$AUR_DIR/.SRCINFO"
27
+sed -i "s|refs/tags/v.*|refs/tags/v$VERSION.tar.gz|" "$AUR_DIR/.SRCINFO"
28
+
29
+echo "✓ Updated PKGBUILD and .SRCINFO"
30
+echo ""
31
+echo "Next steps:"
32
+echo "1. Review changes: git diff packaging/aur/"
33
+echo "2. Update .SRCINFO checksums: cd packaging/aur && makepkg --printsrcinfo > .SRCINFO"
34
+echo "3. Commit and push to AUR"
0
35
▼src-tauri/debian/desktop-template.desktop
+2-2
1
1
[Desktop Entry]
2
2
Type=Application
3
3
Name=Linuxy
4
-Comment=One-click AppImage Manager for Linux - Open Source
4
+Comment=One-click Linux Application Manager - Open Source
5
5
Exec=linuxy %U
6
6
Icon=linuxy
7
7
Categories=Utility;System;
8
-Keywords=AppImage;Manager;Linux;
8
+Keywords=Application;Manager;Linux;
9
9
StartupNotify=true
10
10
StartupWMClass=linuxy
11
11
▼src-tauri/tauri.conf.json
+4-4
36
36
"icons/icon.ico"
37
37
],
38
38
"identifier": "com.linuxy.app",
39
- "longDescription": "Linuxy is a modern AppImage manager with one-click installation, Firejail sandboxing, optional delta updates, and secure desktop integration.",
39
+ "longDescription": "Linuxy is a modern Linux application manager with one-click installation, Firejail sandboxing, optional delta updates, and secure desktop integration.",
40
40
"macOS": {
41
41
"entitlements": null,
42
42
"exceptionDomain": "",
45
45
"signingIdentity": null
46
46
},
47
47
"resources": [],
48
- "shortDescription": "One-click AppImage Manager for Linux",
49
- "targets": "all",
48
+ "shortDescription": "One-click Linux Application Manager",
49
+ "targets": ["deb"],
50
50
"windows": { "certificateThumbprint": null, "digestAlgorithm": "sha256", "timestampUrl": "" }
51
51
},
52
52
"security": {
53
- "csp": "default-src 'self'; img-src 'self' asset: data: https://appimage.github.io https://avatars.githubusercontent.com; style-src 'self' 'unsafe-inline'; connect-src 'self' https://appimage.github.io https://api.github.com https://avatars.githubusercontent.com; object-src 'none'; frame-src 'none'; base-uri 'self'; form-action 'none'"
53
+ "csp": "default-src 'self'; img-src 'self' asset: data: https://avatars.githubusercontent.com; style-src 'self' 'unsafe-inline'; connect-src 'self' https://api.github.com https://avatars.githubusercontent.com; object-src 'none'; frame-src 'none'; base-uri 'self'; form-action 'none'"
54
54
},
55
55
"windows": [
56
56
{
57
57