# Build & Release Workflow This document explains the automated build and release process for JellyTau. ## Overview The CI/CD pipeline automatically: 1. ✅ Runs all tests (frontend + Rust) 2. ✅ Builds Linux binaries (AppImage + DEB) 3. ✅ Builds Android APK and AAB 4. ✅ Creates releases with artifacts 5. ✅ Tags releases with version numbers ## Workflow Triggers ### Automatic Trigger When you push a version tag: ```bash git tag v1.0.0 git push origin v1.0.0 ``` The workflow automatically: 1. Runs tests 2. Builds both platforms 3. Creates a GitHub release with artifacts 4. Tags it as release/prerelease based on version ### Manual Trigger In Gitea Actions UI: 1. Go to **Actions** tab 2. Click **Build & Release** workflow 3. Click **Run workflow** 4. Optionally specify a version 5. Workflow runs without creating a release ## Version Tagging ### Format Version tags follow semantic versioning: `v{MAJOR}.{MINOR}.{PATCH}` Examples: - `v1.0.0` - Release version - `v1.0.0-rc1` - Release candidate (marked as prerelease) - `v1.0.0-beta` - Beta version (marked as prerelease) - `v0.1.0-alpha` - Alpha version (marked as prerelease) ### Creating a Release ```bash # Create and push a version tag git tag v1.0.0 -m "Release version 1.0.0" git push origin v1.0.0 # Or create from main branch git tag -a v1.0.0 -m "Release version 1.0.0" main git push origin v1.0.0 ``` ### Release Status Versions containing `rc`, `beta`, or `alpha` are marked as **prerelease**: ```bash git tag v1.0.0-rc1 # ⚠️ Prerelease git tag v1.0.0-beta # ⚠️ Prerelease git tag v1.0.0-alpha # ⚠️ Prerelease git tag v1.0.0 # ✅ Full release ``` ## Workflow Steps ### 1. Test Phase Runs on all tags and manual triggers: - Frontend tests (`vitest`) - Rust tests (`cargo test`) - TypeScript type checking **Failure:** Stops workflow, no build/release ### 2. Build Linux Phase Runs after tests pass: - Installs system dependencies - Builds with Tauri - Generates: - **AppImage** - Universal Linux binary - **DEB** - Debian/Ubuntu package **Output:** `artifacts/linux/` ### 3. Build Android Phase Runs in parallel with Linux build: - Installs Android SDK/NDK - Configures Rust for Android targets - Builds with Tauri - Generates: - **APK** - Android app package (installable) - **AAB** - Android App Bundle (for Play Store) **Output:** `artifacts/android/` ### 4. Create Release Phase Runs after both builds succeed (only on version tags): - Prepares release notes - Downloads build artifacts - Creates GitHub/Gitea release - Uploads all artifacts - Tags as prerelease if applicable ## Artifacts ### Linux Artifacts #### AppImage - **File:** `jellytau_*.AppImage` - **Size:** ~100-150 MB - **Use:** Run directly on any Linux distro - **Installation:** ```bash chmod +x jellytau_*.AppImage ./jellytau_*.AppImage ``` #### DEB Package - **File:** `jellytau_*.deb` - **Size:** ~80-120 MB - **Use:** Install on Debian/Ubuntu/similar - **Installation:** ```bash sudo dpkg -i jellytau_*.deb jellytau ``` ### Android Artifacts #### APK - **File:** `jellytau-release.apk` - **Size:** ~60-100 MB - **Use:** Direct installation on Android devices - **Installation:** ```bash adb install jellytau-release.apk # Or sideload via file manager ``` #### AAB (Android App Bundle) - **File:** `jellytau-release.aab` - **Size:** ~50-90 MB - **Use:** Upload to Google Play Console - **Note:** Cannot be installed directly; for Play Store distribution ## Release Notes Release notes are automatically generated with: - Version number - Download links - Installation instructions - System requirements - Known issues link - Changelog reference ## Build Matrix | Platform | OS | Architecture | Format | |----------|----|----|--------| | **Linux** | Any | x86_64 | AppImage, DEB | | **Android** | 8.0+ | arm64, armv7, x86_64 | APK, AAB | ## Troubleshooting ### Build Fails During Test Phase 1. Check test output in Gitea Actions 2. Run tests locally: `bun run test` and `bun run test:rust` 3. Fix failing tests 4. Create new tag with fixed code ### Linux Build Fails 1. Check system dependencies installed 2. Verify Tauri configuration 3. Check cargo dependencies 4. Clear cache: Delete `.cargo` and `target/` directories ### Android Build Fails 1. Check Android SDK/NDK setup 2. Verify Java 17 is installed 3. Check Rust Android targets: `rustup target list` 4. Clear cache and rebuild ### Release Not Created 1. Tag must start with `v` (e.g., `v1.0.0`) 2. Tests must pass 3. Both builds must succeed 4. Check workflow logs for errors ## GitHub Release vs Gitea The workflow uses GitHub Actions SDK but is designed for Gitea. For Gitea-native releases: 1. Workflow creates artifacts 2. Artifacts are available in Actions artifacts 3. Download and manually create Gitea release, or 4. Set up Gitea API integration to auto-publish ## Customization ### Change Release Notes Template Edit `.gitea/workflows/build-release.yml`, section `Prepare release notes`: ```yaml - name: Prepare release notes id: release_notes run: | # Add your custom release notes format here echo "Custom notes" > release_notes.md ``` ### Add New Platforms To add macOS or Windows builds: 1. Add new `build-{platform}` job 2. Set appropriate `runs-on` runner 3. Add platform-specific dependencies 4. Update artifact upload 5. Include in `needs: [build-linux, build-android, build-{platform}]` ### Change Build Targets Modify Tauri configuration or add targets: ```yaml - name: Build for Linux run: | # Add target specification bun run tauri build -- --target x86_64-unknown-linux-gnu ``` ## Monitoring ### Check Status 1. Go to **Actions** tab in Gitea 2. View **Build & Release** workflow runs 3. Click specific run to see logs ### Notifications Set up notifications for: - Build failures - Release creation - Tag pushes ## Performance ### Build Times (Approximate) - Test phase: 5-10 minutes - Linux build: 10-15 minutes - Android build: 15-20 minutes - Total: 30-45 minutes ### Caching Workflow caches: - Rust dependencies (cargo) - Bun node_modules - Android SDK components ## Security ### Secrets The workflow uses: - `GITHUB_TOKEN` - Built-in, no setup needed - No credentials needed for Gitea ### Verification To verify build integrity: 1. Download artifacts 2. Verify signatures (if implemented) 3. Check file hashes 4. Test on target platform ## Best Practices ### Versioning 1. Follow semantic versioning: `v{MAJOR}.{MINOR}.{PATCH}` 2. Tag releases in git 3. Update CHANGELOG.md before tagging 4. Include release notes in tag message ### Testing Before Release ```bash # Local testing before release bun run test # Frontend tests bun run test:rust # Rust tests bun run check # Type checking bun run tauri build # Local build test ``` ### Documentation 1. Update [CHANGELOG.md](../CHANGELOG.md) with changes 2. Update [README.md](../README.md) with new features 3. Document breaking changes 4. Add migration guide if needed ## Example Release Workflow ```bash # 1. Update version in relevant files (package.json, Cargo.toml, etc.) vim package.json vim src-tauri/tauri.conf.json # 2. Update CHANGELOG vim CHANGELOG.md # 3. Commit changes git add . git commit -m "Bump version to v1.0.0" # 4. Create annotated tag git tag -a v1.0.0 -m "Release version 1.0.0 Features: - Feature 1 - Feature 2 Fixes: - Fix 1 - Fix 2" # 5. Push tag to trigger workflow git push origin v1.0.0 # 6. Monitor workflow in Gitea Actions # Wait for tests → Linux build → Android build → Release # 7. Download artifacts and test # Visit release page and verify downloads ``` ## References - [Tauri Documentation](https://tauri.app/) - [Semantic Versioning](https://semver.org/) - [GitHub Release Best Practices](https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases) - [Android App Bundle](https://developer.android.com/guide/app-bundle) - [AppImage Documentation](https://docs.appimage.org/) --- **Last Updated:** 2026-02-13