diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index afd8586..b73484e 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -63,10 +63,23 @@ jobs: patchelf \ libfuse2 + - name: Verify system dependencies + run: | + echo "=== FUSE ===" + dpkg -l libfuse2 | grep libfuse2 + ls -la /usr/lib/x86_64-linux-gnu/libfuse.so* || echo "WARNING: libfuse.so not found" + echo "=== WebKit ===" + dpkg -l libwebkit2gtk-4.1-dev | grep webkit + - name: Install Rust uses: dtolnay/rust-toolchain@stable - with: - targets: x86_64-unknown-linux-gnu + + - name: Check Rust host triple + run: | + echo "=== Rust host triple ===" + rustc -vV + echo "=== Cargo version ===" + cargo --version - name: Rust cache uses: Swatinem/rust-cache@v2 @@ -87,15 +100,21 @@ jobs: - name: Download Suwayomi (Linux x64) run: | + echo "=== Downloading Suwayomi ===" curl -fsSL \ "https://github.com/Suwayomi/Suwayomi-Server/releases/download/v2.1.1867/Suwayomi-Server-v2.1.1867-linux-x64.tar.gz" \ -o suwayomi-linux.tar.gz + echo "=== Verifying checksum ===" echo "b2344bd73c4e26bede63cdb4b44b1b4168d8a8500b3b2b1a0219519a3ef708fe suwayomi-linux.tar.gz" | sha256sum -c - + echo "=== Extracting ===" mkdir -p suwayomi-extracted tar -xzf suwayomi-linux.tar.gz -C suwayomi-extracted --strip-components=1 + echo "=== Extracted layout ===" + find suwayomi-extracted -type f | sort + - name: Stage Suwayomi bundle run: | mkdir -p src-tauri/binaries @@ -104,43 +123,68 @@ jobs: JAVA="suwayomi-extracted/jre/bin/java" CATCH="suwayomi-extracted/bin/catch_abort.so" + echo "=== Checking required files ===" for f in "$JAR" "$JAVA" "$CATCH"; do if [ ! -e "$f" ]; then echo "ERROR: expected file not found: $f" find suwayomi-extracted -type f | head -40 exit 1 fi + echo "OK: $f" done - echo "JAR=$JAR JAVA=$JAVA CATCH=$CATCH" - cp -r suwayomi-extracted src-tauri/binaries/suwayomi-bundle chmod +x src-tauri/binaries/suwayomi-bundle/jre/bin/java + echo "=== Staged bundle contents ===" + find src-tauri/binaries/suwayomi-bundle -type f | sort + - name: Stage Linux launcher sidecar run: | - cp src-tauri/binaries/suwayomi-launcher-linux.sh \ - src-tauri/binaries/suwayomi-launcher-linux-x86_64-unknown-linux-gnu - chmod +x src-tauri/binaries/suwayomi-launcher-linux-x86_64-unknown-linux-gnu + HOST_TRIPLE=$(rustc -vV | grep host | awk '{print $2}') + echo "=== Host triple: $HOST_TRIPLE ===" + + SIDECAR="src-tauri/binaries/suwayomi-launcher-linux-${HOST_TRIPLE}" + cp src-tauri/binaries/suwayomi-launcher-linux.sh "$SIDECAR" + chmod +x "$SIDECAR" + + echo "=== Sidecar staged as: $SIDECAR ===" + ls -la src-tauri/binaries/ - name: Patch tauri.conf.json for CI run: | + echo "=== Before patch ===" + grep beforeBuildCommand src-tauri/tauri.conf.json + sed -i 's/"beforeBuildCommand": "pnpm build"/"beforeBuildCommand": ""/' src-tauri/tauri.conf.json + echo "=== After patch ===" + grep beforeBuildCommand src-tauri/tauri.conf.json + - name: Build Tauri app - run: pnpm tauri build --target x86_64-unknown-linux-gnu --config src-tauri/tauri.linux.conf.json + run: pnpm tauri build --config src-tauri/tauri.linux.conf.json --verbose + + - name: List build artifacts + if: always() + run: | + echo "=== Bundle output ===" + find src-tauri/target -path "*/bundle/*" -type f | sort || echo "No bundle artifacts found" - name: Upload Linux artifacts to release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} VERSION: ${{ github.event.inputs.version }} run: | + echo "=== Looking for release v$VERSION ===" for i in $(seq 1 12); do RELEASE_ID=$(curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \ "https://api.github.com/repos/moku-project/Moku/releases" \ | jq -r '.[] | select(.tag_name == "v'"$VERSION"'") | .id' | head -1) - if [ -n "$RELEASE_ID" ]; then break; fi - echo "Waiting for release to exist... attempt $i" + if [ -n "$RELEASE_ID" ]; then + echo "Found release ID: $RELEASE_ID" + break + fi + echo "Attempt $i: release not found yet, waiting 15s..." sleep 15 done @@ -149,21 +193,24 @@ jobs: exit 1 fi - echo "Found release ID: $RELEASE_ID" - upload_asset() { local file="$1" local name="$2" - echo "Uploading $name..." - curl -s -X POST \ + echo "Uploading $name ($file)..." + RESPONSE=$(curl -s -X POST \ -H "Authorization: Bearer $GITHUB_TOKEN" \ -H "Content-Type: application/octet-stream" \ --data-binary @"$file" \ - "https://uploads.github.com/repos/moku-project/Moku/releases/$RELEASE_ID/assets?name=$name" + "https://uploads.github.com/repos/moku-project/Moku/releases/$RELEASE_ID/assets?name=$name") + echo "Response: $RESPONSE" | jq '{id: .id, name: .name, state: .state}' 2>/dev/null || echo "$RESPONSE" } - APPIMAGE=$(find src-tauri/target/x86_64-unknown-linux-gnu/release/bundle/appimage -name "*.AppImage" | head -1) - DEB=$(find src-tauri/target/x86_64-unknown-linux-gnu/release/bundle/deb -name "*.deb" | head -1) + APPIMAGE=$(find src-tauri/target -path "*/bundle/appimage/*.AppImage" ! -name "*.sig" | head -1) + DEB=$(find src-tauri/target -path "*/bundle/deb/*.deb" ! -name "*.sig" | head -1) + + echo "=== Artifacts to upload ===" + echo "AppImage: ${APPIMAGE:-not found}" + echo "Deb: ${DEB:-not found}" [ -n "$APPIMAGE" ] && upload_asset "$APPIMAGE" "moku-linux-x64-${VERSION}.AppImage" [ -n "$DEB" ] && upload_asset "$DEB" "moku-linux-x64-${VERSION}.deb" \ No newline at end of file