@@ -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
0 commit comments