diff --git a/.github/workflows/packaging.yml b/.github/workflows/packaging.yml index eba16e8c..955df437 100644 --- a/.github/workflows/packaging.yml +++ b/.github/workflows/packaging.yml @@ -1,4 +1,4 @@ -name: Build LNbits AppImage DMG +name: Build LNbits AppImage on: release: @@ -11,56 +11,89 @@ jobs: steps: # Step 1: Checkout the repository - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - # Step 2: Install Dependencies - - name: Install Dependencies + # 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: | - curl -sSL https://install.python-poetry.org | python3 - - echo "$HOME/.local/bin" >> $GITHUB_PATH 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 - # Step 3: Clone LNbits Repository - - name: Clone LNbits + # 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 4: Make the AppImage Asset - - name: Make Asset + # Step 5: Build the LNbits binary with uv + PyInstaller + - name: Build LNbits binary (uv + PyInstaller) run: | cd packaging/linux/AppDir/usr/lnbits - poetry install - poetry run pip install pyinstaller + + # Install project deps into .venv using uv + uv sync + + # Install PyInstaller into the same environment + uv pip install pyinstaller # Build the LNbits binary - poetry 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 $(poetry run which lnbits) + 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" + ./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 5: Upload Linux Release Asset + # Step 6: Upload Linux Release Asset - name: Upload Linux Release Asset uses: actions/upload-release-asset@v1 with: @@ -69,4 +102,4 @@ jobs: asset_name: ${{ env.APPIMAGE_NAME }} asset_content_type: application/octet-stream env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}