Files
Trilium/apps/desktop/scripts/build-appimage.sh
2026-04-18 09:54:19 +03:00

102 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Build an AppImage from the packaged Electron app.
#
# Usage: ./build-appimage.sh [arch]
# arch: x64 or arm64 (default: x64)
#
# Prerequisites:
# - The Electron app must already be packaged via `electron-forge make` or `electron-forge package`
# - appimagetool must be available in PATH
#
# Environment variables:
# TRILIUM_ARTIFACT_NAME_HINT: If set, used as the base name for the output file
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
DESKTOP_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
FORGE_DIR="$DESKTOP_DIR/electron-forge"
ARCH="${1:-x64}"
EXECUTABLE_NAME="trilium"
PRODUCT_NAME="Trilium Notes"
# Map architecture names
case "$ARCH" in
x64) APPIMAGE_ARCH="x86_64" ;;
arm64) APPIMAGE_ARCH="aarch64" ;;
*) echo "Unsupported architecture: $ARCH"; exit 1 ;;
esac
# Find the packaged app directory
PACKAGED_DIR="$DESKTOP_DIR/dist/out/$PRODUCT_NAME-linux-$ARCH"
if [ ! -d "$PACKAGED_DIR" ]; then
echo "Error: Packaged app not found at $PACKAGED_DIR"
echo "Run 'electron-forge make' or 'electron-forge package' first."
exit 1
fi
echo "Building AppImage from: $PACKAGED_DIR"
# Create AppDir structure
APPDIR="$DESKTOP_DIR/dist/out/$PRODUCT_NAME.AppDir"
rm -rf "$APPDIR"
mkdir -p "$APPDIR"
# Copy the packaged app contents into the AppDir
cp -a "$PACKAGED_DIR"/. "$APPDIR/"
# Create the AppRun entry point
cat > "$APPDIR/AppRun" << 'APPRUN_EOF'
#!/bin/bash
HERE="$(dirname "$(readlink -f "$0")")"
exec "$HERE/trilium" "$@"
APPRUN_EOF
chmod +x "$APPDIR/AppRun"
# Create the .desktop file
cat > "$APPDIR/$EXECUTABLE_NAME.desktop" << DESKTOP_EOF
[Desktop Entry]
Name=$PRODUCT_NAME
Comment=Build your personal knowledge base with Trilium Notes
GenericName=Note Taking Application
Exec=$EXECUTABLE_NAME %U
Icon=$EXECUTABLE_NAME
Type=Application
StartupNotify=true
StartupWMClass=$PRODUCT_NAME
Categories=Office;Utility;
DESKTOP_EOF
# Copy the icon (AppImage expects it at the root of AppDir)
if [ -f "$FORGE_DIR/app-icon/png/256x256.png" ]; then
cp "$FORGE_DIR/app-icon/png/256x256.png" "$APPDIR/$EXECUTABLE_NAME.png"
elif [ -f "$APPDIR/icon.png" ]; then
cp "$APPDIR/icon.png" "$APPDIR/$EXECUTABLE_NAME.png"
else
echo "Warning: No icon found"
fi
# Determine output filename
UPLOAD_DIR="$DESKTOP_DIR/upload"
mkdir -p "$UPLOAD_DIR"
if [ -n "${TRILIUM_ARTIFACT_NAME_HINT:-}" ]; then
OUTPUT_NAME="${TRILIUM_ARTIFACT_NAME_HINT//\//-}.AppImage"
else
VERSION=$(node -e "console.log(require('$DESKTOP_DIR/package.json').version)")
OUTPUT_NAME="TriliumNotes-v${VERSION}-linux-${ARCH}.AppImage"
fi
OUTPUT_PATH="$UPLOAD_DIR/$OUTPUT_NAME"
# Build the AppImage
echo "Creating AppImage: $OUTPUT_PATH"
ARCH="$APPIMAGE_ARCH" appimagetool "$APPDIR" "$OUTPUT_PATH"
# Clean up the AppDir
rm -rf "$APPDIR"
echo "AppImage created successfully: $OUTPUT_PATH"