name: Build & Release on: push: tags: - 'v*' workflow_dispatch: inputs: version: description: 'Version to build (e.g., v1.0.0)' required: false env: RUST_BACKTRACE: 1 CARGO_TERM_COLOR: always jobs: test: name: Run Tests runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Bun uses: oven-sh/setup-bun@v1 - name: Setup Rust uses: actions-rs/toolchain@v1 with: toolchain: stable override: true - name: Cache Rust dependencies uses: actions/cache@v3 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo- - name: Install dependencies run: bun install - name: Run frontend tests run: bun run test --run continue-on-error: false - name: Run Rust tests run: bun run test:rust continue-on-error: false - name: Check TypeScript run: bun run check continue-on-error: false build-linux: name: Build Linux runs-on: ubuntu-latest needs: test steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Bun uses: oven-sh/setup-bun@v1 - name: Setup Rust uses: actions-rs/toolchain@v1 with: toolchain: stable override: true - name: Install system dependencies run: | sudo apt-get update sudo apt-get install -y \ libwebkit2gtk-4.1-dev \ build-essential \ curl \ wget \ file \ libssl-dev \ libgtk-3-dev \ libayatana-appindicator3-dev \ librsvg2-dev - name: Cache Rust dependencies uses: actions/cache@v3 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo- - name: Install dependencies run: bun install - name: Build for Linux run: bun run tauri build env: TAURI_SKIP_UPDATER: true - name: Prepare Linux artifacts run: | mkdir -p dist/linux # Copy AppImage if [ -f "src-tauri/target/release/bundle/appimage/jellytau_"*.AppImage ]; then cp src-tauri/target/release/bundle/appimage/jellytau_*.AppImage dist/linux/ fi # Copy .deb if built if [ -f "src-tauri/target/release/bundle/deb/jellytau_"*.deb ]; then cp src-tauri/target/release/bundle/deb/jellytau_*.deb dist/linux/ fi ls -lah dist/linux/ - name: Upload Linux build artifact uses: actions/upload-artifact@v3 with: name: jellytau-linux path: dist/linux/ retention-days: 30 build-android: name: Build Android runs-on: ubuntu-latest needs: test steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Bun uses: oven-sh/setup-bun@v1 - name: Setup Java uses: actions/setup-java@v3 with: distribution: 'temurin' java-version: '17' - name: Setup Android SDK uses: android-actions/setup-android@v2 with: api-level: 33 - name: Setup Rust uses: actions-rs/toolchain@v1 with: toolchain: stable override: true - name: Add Android targets run: | rustup target add aarch64-linux-android rustup target add armv7-linux-androideabi rustup target add x86_64-linux-android - name: Install Android NDK run: | sdkmanager "ndk;25.1.8937393" - name: Cache Rust dependencies uses: actions/cache@v3 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ runner.os }}-cargo-android-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo-android- - name: Install dependencies run: bun install - name: Build for Android run: bun run tauri android build env: ANDROID_NDK_HOME: ${{ android.ndk-home }} ANDROID_SDK_ROOT: ${{ android.sdk-root }} ANDROID_HOME: ${{ android.sdk-root }} - name: Prepare Android artifacts run: | mkdir -p dist/android # Copy APK if [ -f "src-tauri/gen/android/app/build/outputs/apk/release/app-release.apk" ]; then cp src-tauri/gen/android/app/build/outputs/apk/release/app-release.apk dist/android/jellytau-release.apk fi # Copy AAB (Android App Bundle) if built if [ -f "src-tauri/gen/android/app/build/outputs/bundle/release/app-release.aab" ]; then cp src-tauri/gen/android/app/build/outputs/bundle/release/app-release.aab dist/android/jellytau-release.aab fi ls -lah dist/android/ - name: Upload Android build artifact uses: actions/upload-artifact@v3 with: name: jellytau-android path: dist/android/ retention-days: 30 create-release: name: Create Release runs-on: ubuntu-latest needs: [build-linux, build-android] if: startsWith(github.ref, 'refs/tags/v') steps: - name: Checkout repository uses: actions/checkout@v4 - name: Get version from tag id: tag_name run: | echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT echo "RELEASE_NAME=JellyTau ${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Download Linux artifacts uses: actions/download-artifact@v3 with: name: jellytau-linux path: artifacts/linux/ - name: Download Android artifacts uses: actions/download-artifact@v3 with: name: jellytau-android path: artifacts/android/ - name: Prepare release notes id: release_notes run: | VERSION="${{ steps.tag_name.outputs.VERSION }}" echo "## 📱 JellyTau $VERSION Release" > release_notes.md echo "" >> release_notes.md echo "### 📦 Downloads" >> release_notes.md echo "" >> release_notes.md echo "#### Linux" >> release_notes.md echo "- **AppImage** - Run directly on most Linux distributions" >> release_notes.md echo "- **DEB** - Install via `sudo dpkg -i jellytau_*.deb` (Ubuntu/Debian)" >> release_notes.md echo "" >> release_notes.md echo "#### Android" >> release_notes.md echo "- **APK** - Install via `adb install jellytau-release.apk` or sideload via file manager" >> release_notes.md echo "- **AAB** - Upload to Google Play Console or testing platforms" >> release_notes.md echo "" >> release_notes.md echo "### ✨ What's New" >> release_notes.md echo "" >> release_notes.md echo "See [CHANGELOG.md](CHANGELOG.md) for detailed changes." >> release_notes.md echo "" >> release_notes.md echo "### 🔧 Installation" >> release_notes.md echo "" >> release_notes.md echo "#### Linux (AppImage)" >> release_notes.md echo "\`\`\`bash" >> release_notes.md echo "chmod +x jellytau_*.AppImage" >> release_notes.md echo "./jellytau_*.AppImage" >> release_notes.md echo "\`\`\`" >> release_notes.md echo "" >> release_notes.md echo "#### Linux (DEB)" >> release_notes.md echo "\`\`\`bash" >> release_notes.md echo "sudo dpkg -i jellytau_*.deb" >> release_notes.md echo "jellytau" >> release_notes.md echo "\`\`\`" >> release_notes.md echo "" >> release_notes.md echo "#### Android" >> release_notes.md echo "- Sideload: Download APK and install via file manager or ADB" >> release_notes.md echo "- Play Store: Coming soon" >> release_notes.md echo "" >> release_notes.md echo "### 🐛 Known Issues" >> release_notes.md echo "" >> release_notes.md echo "See [GitHub Issues](../../issues) for reported bugs." >> release_notes.md echo "" >> release_notes.md echo "### 📝 Requirements" >> release_notes.md echo "" >> release_notes.md echo "**Linux:**" >> release_notes.md echo "- 64-bit Linux system" >> release_notes.md echo "- GLIBC 2.29+" >> release_notes.md echo "" >> release_notes.md echo "**Android:**" >> release_notes.md echo "- Android 8.0 or higher" >> release_notes.md echo "- 50MB free storage" >> release_notes.md echo "" >> release_notes.md echo "---" >> release_notes.md echo "Built with Tauri, SvelteKit, and Rust 🦀" >> release_notes.md - name: Create GitHub Release uses: softprops/action-gh-release@v1 if: startsWith(github.ref, 'refs/tags/') with: name: ${{ steps.tag_name.outputs.RELEASE_NAME }} body_path: release_notes.md files: | artifacts/linux/* artifacts/android/* draft: false prerelease: ${{ contains(steps.tag_name.outputs.VERSION, 'rc') || contains(steps.tag_name.outputs.VERSION, 'beta') || contains(steps.tag_name.outputs.VERSION, 'alpha') }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload to Gitea Releases run: | VERSION="${{ steps.tag_name.outputs.VERSION }}" echo "📦 Release artifacts prepared for $VERSION" echo "" echo "Linux:" ls -lh artifacts/linux/ || echo "No Linux artifacts" echo "" echo "Android:" ls -lh artifacts/android/ || echo "No Android artifacts" echo "" echo "✅ Release $VERSION is ready!" echo "📄 Release notes saved to release_notes.md" - name: Publish release notes run: | echo "## 🎉 Release Published" echo "" echo "**Version:** ${{ steps.tag_name.outputs.VERSION }}" echo "**Tag:** ${{ github.ref }}" echo "" echo "Artifacts:" echo "- Linux artifacts in: artifacts/linux/" echo "- Android artifacts in: artifacts/android/" echo "" echo "Visit the Release page to download files."