diff --git a/.github/workflows/appimage-build.yml b/.github/workflows/appimage-build.yml new file mode 100644 index 00000000..f36a14d4 --- /dev/null +++ b/.github/workflows/appimage-build.yml @@ -0,0 +1,121 @@ +name: ZoiteChat AppImage Build + +on: + push: + branches: [master] + pull_request: + branches: [master] + +jobs: + appimage_build: + runs-on: ubuntu-24.04 + + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - name: Install build dependencies + run: | + set -eux + sudo apt-get update + sudo apt-get install -y --no-install-recommends \ + build-essential pkg-config meson ninja-build cmake \ + gettext \ + libcanberra-dev libdbus-glib-1-dev libglib2.0-dev \ + libgtk2.0-dev libgtk-3-dev \ + libgtk-3-bin libglib2.0-bin shared-mime-info gsettings-desktop-schemas \ + libluajit-5.1-dev libpci-dev libperl-dev libssl-dev \ + python3-dev python3-cffi mono-devel desktop-file-utils \ + patchelf file curl + + - name: Configure + run: | + set -eux + rm -rf build + meson setup build \ + --prefix=/usr \ + -Dtext-frontend=true \ + -Dtheme-manager=true \ + -Dauto_features=enabled + + - name: Build + run: | + set -eux + ninja -C build + + - name: Install to AppDir + run: | + set -eux + rm -rf AppDir + DESTDIR="${PWD}/AppDir" ninja -C build install + + - name: Build AppImage + env: + APPIMAGE_EXTRACT_AND_RUN: 1 + DEPLOY_GTK_VERSION: 3 + LDAI_NO_APPSTREAM: 1 + run: | + set -eux + + curl -fL --retry 3 -o linuxdeploy-x86_64.AppImage \ + https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage + chmod +x linuxdeploy-x86_64.AppImage + + curl -fL --retry 3 -o linuxdeploy-plugin-gtk \ + https://raw.githubusercontent.com/linuxdeploy/linuxdeploy-plugin-gtk/master/linuxdeploy-plugin-gtk.sh + chmod +x linuxdeploy-plugin-gtk + export PATH="${PWD}:${PATH}" + + # Bundle CA certificates into the AppDir + install -Dm644 /etc/ssl/certs/ca-certificates.crt \ + AppDir/etc/ssl/certs/ca-certificates.crt + + # Custom AppRun: preserve typical AppDir runtime paths AND force CA bundle + cat > AppRun <<'EOF' + #!/bin/sh + set -eu + + APPDIR="${APPDIR:-$(dirname "$(readlink -f "$0")")}" + + export PATH="$APPDIR/usr/bin:${PATH:-/usr/bin:/bin}" + export LD_LIBRARY_PATH="$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH:-}" + export XDG_DATA_DIRS="$APPDIR/usr/share:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}" + + if [ -d "$APPDIR/usr/share/glib-2.0/schemas" ]; then + export GSETTINGS_SCHEMA_DIR="$APPDIR/usr/share/glib-2.0/schemas${GSETTINGS_SCHEMA_DIR:+:$GSETTINGS_SCHEMA_DIR}" + fi + + if [ -d "$APPDIR/usr/lib/x86_64-linux-gnu/gio/modules" ]; then + export GIO_EXTRA_MODULES="$APPDIR/usr/lib/x86_64-linux-gnu/gio/modules${GIO_EXTRA_MODULES:+:$GIO_EXTRA_MODULES}" + elif [ -d "$APPDIR/usr/lib/gio/modules" ]; then + export GIO_EXTRA_MODULES="$APPDIR/usr/lib/gio/modules${GIO_EXTRA_MODULES:+:$GIO_EXTRA_MODULES}" + fi + + # OpenSSL trust store override (fixes “unable to get local issuer certificate (20)”) + export SSL_CERT_FILE="${SSL_CERT_FILE:-$APPDIR/etc/ssl/certs/ca-certificates.crt}" + export SSL_CERT_DIR="${SSL_CERT_DIR:-$APPDIR/etc/ssl/certs}" + export CURL_CA_BUNDLE="${CURL_CA_BUNDLE:-$SSL_CERT_FILE}" + + exec "$APPDIR/usr/bin/zoitechat" "$@" + EOF + chmod +x AppRun + + VERSION="$(git describe --tags --always)" + + ./linuxdeploy-x86_64.AppImage \ + --appdir AppDir \ + --desktop-file AppDir/usr/share/applications/io.github.Zoitechat.desktop \ + --icon-file AppDir/usr/share/icons/hicolor/48x48/apps/io.github.Zoitechat.png \ + --custom-apprun ./AppRun \ + --plugin gtk \ + --output appimage + + appimage_path="$(ls -1 *.AppImage | grep -v linuxdeploy | head -n 1)" + mv "$appimage_path" "Zoitechat-${VERSION}-x86_64.AppImage" + + - name: Upload AppImage artifact + uses: actions/upload-artifact@v4 + with: + name: zoitechat-appimage + path: Zoitechat-*-x86_64.AppImage