name: Build LNbits AppImage on: release: types: [published] jobs: build-linux-package: runs-on: ubuntu-latest steps: # Step 1: Checkout the repository - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 # Step 2: Set up Python (uv will still use this toolchain) - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.12" # Step 3: Install system deps (fuse) + uv - name: Install system deps and uv run: | sudo apt-get update sudo apt-get install -y libfuse2 curl -LsSf https://astral.sh/uv/install.sh | sh echo "$HOME/.local/bin" >> $GITHUB_PATH shell: bash # Optional: Cache uv + venv to speed up CI - name: Cache uv and venv uses: actions/cache@v4 with: path: | ~/.cache/uv .venv key: ${{ runner.os }}-uv-${{ hashFiles('uv.lock', 'pyproject.toml') }} # Step 4: Prepare packaging tree and clone LNbits - name: Prepare packaging & clone LNbits run: | mv .github/packaging packaging mkdir -p packaging/linux/AppDir/usr git clone https://github.com/lnbits/lnbits.git packaging/linux/AppDir/usr/lnbits shell: bash # Step 5: Build the LNbits binary with uv + PyInstaller - name: Build LNbits binary (uv + PyInstaller) run: | cd packaging/linux/AppDir/usr/lnbits # Install project deps into .venv using uv uv sync # Install PyInstaller into the same environment uv pip install pyinstaller # Build the LNbits binary uv run pyinstaller \ --onefile \ --name lnbits \ --hidden-import=embit \ --collect-all embit \ --collect-all lnbits \ --collect-all sqlalchemy \ --collect-all aiosqlite \ --hidden-import=passlib.handlers.bcrypt \ "$(uv run which lnbits)" cd ../../../../.. chmod +x packaging/linux/AppDir/AppRun chmod +x packaging/linux/AppDir/lnbits.desktop chmod +x packaging/linux/AppDir/usr/lnbits/dist/lnbits # Clean out non-dist content from the app dir to keep AppImage slim find packaging/linux/AppDir/usr/lnbits -mindepth 1 -maxdepth 1 \ ! -name 'dist' \ ! -name 'lnbits' \ -exec rm -rf {} + # Build AppImage wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage chmod +x appimagetool-x86_64.AppImage TAG_NAME=${{ github.event.release.tag_name }} APPIMAGE_NAME="LNbits-${TAG_NAME}.AppImage" ./appimagetool-x86_64.AppImage \ --updateinformation "gh-releases-zsync|lnbits|lnbits|latest|*.AppImage.zsync" \ packaging/linux/AppDir "$APPIMAGE_NAME" chmod +x "$APPIMAGE_NAME" echo "APPIMAGE_NAME=$APPIMAGE_NAME" >> $GITHUB_ENV shell: bash # Step 6: Upload Linux Release Asset - name: Upload Linux Release Asset uses: actions/upload-release-asset@v1 with: upload_url: ${{ github.event.release.upload_url }} asset_path: ${{ env.APPIMAGE_NAME }} asset_name: ${{ env.APPIMAGE_NAME }} asset_content_type: application/octet-stream env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}