Skip to content

Commit f57e057

Browse files
committed
ci: include desktop entry and icon in linux .deb packages
1 parent 9714da2 commit f57e057

2 files changed

Lines changed: 92 additions & 10 deletions

File tree

.github/workflows/linux_deb-release.yml

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,67 @@ jobs:
4747
flutter pub run tools/fetch_core_local.dart --repo sipeed/picoclaw --tag latest --out-dir app/bin --platform linux --arch x64 --build-mode release --install-to-build || true
4848
flutter build linux --release
4949
50-
- name: Package Linux bundle
50+
- name: Package Linux as .deb
5151
id: package
5252
run: |
53+
set -e
5354
PKG_NAME=picoclaw_fui
5455
TAG=$(date -u +%y%m%d)-$(git rev-parse --short=6 $GITHUB_SHA)
55-
DEST=${PKG_NAME}-${TAG}-linux-x64.tar.gz
56-
rm -f "$DEST" || true
56+
DEST=${PKG_NAME}-${TAG}-linux-x64.deb
57+
PKGROOT=$PWD/pkg_root
58+
rm -rf "$PKGROOT" "$DEST"
5759
BUNDLE_DIR=build/linux/x64/release/bundle
5860
if [ ! -d "$BUNDLE_DIR" ]; then echo "Bundle not found: $BUNDLE_DIR"; ls -la build/linux || true; exit 1; fi
59-
tar -C "$BUNDLE_DIR" -czf "$DEST" .
60-
echo "RELEASE_ARTIFACT=$DEST" >> $GITHUB_OUTPUT
61+
mkdir -p "$PKGROOT/opt/${PKG_NAME}/${TAG}"
62+
cp -r "$BUNDLE_DIR"/* "$PKGROOT/opt/${PKG_NAME}/${TAG}/"
63+
mkdir -p "$PKGROOT/usr/bin"
64+
printf '%s\n' '#!/bin/sh' 'set -e' 'BASE=/opt/picoclaw_fui' \
65+
'if [ -d "$BASE" ]; then' \
66+
' DIRNAME=$(ls -1 "$BASE" 2>/dev/null | sort -V | tail -n1)' \
67+
' if [ -n "$DIRNAME" ] && [ -d "$BASE/$DIRNAME" ]; then' \
68+
' DIR="$BASE/$DIRNAME"' \
69+
' else' \
70+
' DIR="$BASE"' \
71+
' fi' \
72+
'else' \
73+
' DIR="$BASE"' \
74+
'fi' \
75+
'EXEC=$(find "$DIR" -maxdepth 1 -type f -executable -print -quit)' \
76+
'if [ -z "$EXEC" ]; then' \
77+
' echo "Executable not found in $DIR" >&2' \
78+
' exit 1' \
79+
'fi' \
80+
'exec "$EXEC" "$@"' > "$PKGROOT/usr/bin/${PKG_NAME}"
81+
chmod 0755 "$PKGROOT/usr/bin/${PKG_NAME}"
82+
mkdir -p "$PKGROOT/DEBIAN"
83+
mkdir -p "$PKGROOT/usr/share/icons/hicolor/128x128/apps"
84+
mkdir -p "$PKGROOT/usr/share/applications"
85+
if [ -f assets/app_icon.png ]; then
86+
cp assets/app_icon.png "$PKGROOT/usr/share/icons/hicolor/128x128/apps/picoclaw_fui.png"
87+
fi
88+
printf '%s\n' \
89+
"[Desktop Entry]" \
90+
"Name=PicoClaw FUI" \
91+
"Exec=/usr/bin/picoclaw_fui %U" \
92+
"Icon=picoclaw_fui" \
93+
"Type=Application" \
94+
"Categories=Utility;" \
95+
"Terminal=false" > "$PKGROOT/usr/share/applications/picoclaw_fui.desktop"
96+
printf '%s\n' \
97+
"Package: picoclaw-fui" \
98+
"Version: ${TAG}" \
99+
"Section: utils" \
100+
"Priority: optional" \
101+
"Architecture: amd64" \
102+
"Maintainer: GitHub Actions <actions@github.com>" \
103+
"Description: PicoClaw FUI" > "$PKGROOT/DEBIAN/control"
104+
if command -v gtk-update-icon-cache >/dev/null 2>&1; then
105+
gtk-update-icon-cache -f "$PKGROOT/usr/share/icons/hicolor" || true
106+
fi
107+
dpkg-deb --build "$PKGROOT" "$DEST"
61108
62-
- name: Upload Linux artifact
109+
- name: Upload Linux .deb artifact
63110
uses: actions/upload-artifact@v4
64111
with:
65-
name: picoclaw_fui-linux-x64
66-
path: ${{ steps.package.outputs.RELEASE_ARTIFACT }}
112+
name: picoclaw_fui-${{ env.RELEASE_BASE }}-linux-x64.deb
113+
path: ${PKG_NAME}-${{ env.RELEASE_BASE }}-linux-x64.deb

.github/workflows/release_full.yml

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,12 +318,43 @@ jobs:
318318
mkdir -p "$PKGROOT/opt/${PKG_NAME}/${TAG}"
319319
cp -r "$BUNDLE_DIR"/* "$PKGROOT/opt/${PKG_NAME}/${TAG}/"
320320
mkdir -p "$PKGROOT/usr/bin"
321-
printf '%s\n' '#!/bin/sh' 'set -e' 'DIR=/opt/picoclaw_fui/${RELEASE_BASE}' \
321+
printf '%s\n' \
322+
'#!/bin/sh' \
323+
'set -e' \
324+
'BASE=/opt/picoclaw_fui' \
325+
'if [ -d "$BASE" ]; then' \
326+
' DIRNAME=$(ls -1 "$BASE" 2>/dev/null | sort -V | tail -n1)' \
327+
' if [ -n "$DIRNAME" ] && [ -d "$BASE/$DIRNAME" ]; then' \
328+
' DIR="$BASE/$DIRNAME"' \
329+
' else' \
330+
' DIR="$BASE"' \
331+
' fi' \
332+
'else' \
333+
' DIR="$BASE"' \
334+
'fi' \
322335
'EXEC=$(find "$DIR" -maxdepth 1 -type f -executable -print -quit)' \
323-
'if [ -z "$EXEC" ]; then' ' echo "Executable not found in $DIR" >&2' ' exit 1' 'fi' \
336+
'if [ -z "$EXEC" ]; then' \
337+
' echo "Executable not found in $DIR" >&2' \
338+
' exit 1' \
339+
'fi' \
324340
'exec "$EXEC" "$@"' > "$PKGROOT/usr/bin/${PKG_NAME}"
325341
chmod 0755 "$PKGROOT/usr/bin/${PKG_NAME}"
326342
mkdir -p "$PKGROOT/DEBIAN"
343+
# Install icon and desktop entry
344+
mkdir -p "$PKGROOT/usr/share/icons/hicolor/128x128/apps"
345+
mkdir -p "$PKGROOT/usr/share/applications"
346+
if [ -f assets/app_icon.png ]; then
347+
cp assets/app_icon.png "$PKGROOT/usr/share/icons/hicolor/128x128/apps/picoclaw_fui.png"
348+
fi
349+
printf '%s\n' \
350+
"[Desktop Entry]" \
351+
"Name=PicoClaw FUI" \
352+
"Exec=/usr/bin/picoclaw_fui %U" \
353+
"Icon=picoclaw_fui" \
354+
"Type=Application" \
355+
"Categories=Utility;" \
356+
"Terminal=false" > "$PKGROOT/usr/share/applications/picoclaw_fui.desktop"
357+
327358
printf '%s\n' \
328359
"Package: picoclaw-fui" \
329360
"Version: ${TAG}" \
@@ -332,6 +363,10 @@ jobs:
332363
"Architecture: amd64" \
333364
"Maintainer: GitHub Actions <actions@github.com>" \
334365
"Description: PicoClaw FUI" > "$PKGROOT/DEBIAN/control"
366+
# Update icon cache if available (ignore errors)
367+
if command -v gtk-update-icon-cache >/dev/null 2>&1; then
368+
gtk-update-icon-cache -f "$PKGROOT/usr/share/icons/hicolor" || true
369+
fi
335370
dpkg-deb --build "$PKGROOT" "$DEST"
336371
337372
- name: Upload Linux .deb artifact

0 commit comments

Comments
 (0)