Skip to content

Update mobile and testing-mobile subprojects #26

Update mobile and testing-mobile subprojects

Update mobile and testing-mobile subprojects #26

Workflow file for this run

name: Build and Release
on:
push:
tags:
- 'v*.*.*-*' # Matches v0.1.0-test, v1.0.0-alpha, etc.
- 'v*.*.*' # Matches v0.1.0, v1.0.0, etc.
env:
RELEASE_NAME: ${{ github.ref_name }}
jobs:
# ============================================
# Android APK Build
# ============================================
build-android:
name: Build Android APK
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Guard @zelara/finance — no react-native imports
shell: bash
run: |
if grep -r "react-native" src/packages/finance/ 2>/dev/null; then
echo "ERROR: @zelara/finance must not import react-native"
exit 1
fi
echo "OK: @zelara/finance is react-native free"
- name: Build shared packages
run: |
cd src/packages
npm install
npm run build -w @zelara/shared
npm run build -w @zelara/skill-tree
npm run build -w @zelara/state
npm run build -w @zelara/device-linking
npm run build -w @zelara/finance
- name: Install dependencies
run: |
cd apps/mobile
npm install --legacy-peer-deps
- name: Build Android APK
run: |
cd apps/mobile/android
chmod +x gradlew
./gradlew assembleRelease
- name: Sign APK (if keystore available)
if: env.ANDROID_KEYSTORE_BASE64 != ''
env:
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
ANDROID_STORE_PASSWORD: ${{ secrets.ANDROID_STORE_PASSWORD }}
run: |
cd apps/mobile/android
echo "$ANDROID_KEYSTORE_BASE64" | base64 -d > release.keystore
# Signing will be handled by Gradle if secrets are configured
- name: Upload APK artifact
uses: actions/upload-artifact@v4
with:
name: android-apk
path: apps/mobile/android/app/build/outputs/apk/release/app-release.apk
retention-days: 7
# ============================================
# Testing Android APK Build
# ============================================
build-testing-android:
name: Build Testing Android APK
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Build shared packages
run: |
cd src/packages
npm install
npm run build -w @zelara/shared
npm run build -w @zelara/state
npm run build -w @zelara/device-linking
- name: Install dependencies
run: |
cd apps/testing-mobile
npm install --legacy-peer-deps
- name: Build Testing Android APK
run: |
cd apps/testing-mobile/android
chmod +x gradlew
./gradlew assembleRelease
- name: Rename Testing APK for release
run: |
cp apps/testing-mobile/android/app/build/outputs/apk/release/app-release.apk \
apps/testing-mobile/android/app/build/outputs/apk/release/zelara-testing.apk
- name: Upload Testing APK artifact
uses: actions/upload-artifact@v4
with:
name: testing-android-apk
path: apps/testing-mobile/android/app/build/outputs/apk/release/zelara-testing.apk
retention-days: 7
# ============================================
# Finance Android APK Build
# ============================================
build-finance-android:
name: Build Finance Android APK
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Build shared packages
run: |
cd src/packages
npm install
npm run build -w @zelara/shared
npm run build -w @zelara/skill-tree
npm run build -w @zelara/state
npm run build -w @zelara/device-linking
npm run build -w @zelara/finance
- name: Install dependencies
run: |
cd apps/finance-mobile
npm install --legacy-peer-deps
- name: Build Finance Android APK
run: |
cd apps/finance-mobile/android
chmod +x gradlew
export NODE_ENV=production
./gradlew assembleRelease
- name: Rename Finance APK for release
run: |
cp apps/finance-mobile/android/app/build/outputs/apk/release/app-release.apk \
apps/finance-mobile/android/app/build/outputs/apk/release/zelara-finance.apk
- name: Upload Finance APK artifact
uses: actions/upload-artifact@v4
with:
name: finance-android-apk
path: apps/finance-mobile/android/app/build/outputs/apk/release/zelara-finance.apk
retention-days: 7
# ============================================
# Windows Desktop EXE Build
# ============================================
build-windows:
name: Build Windows EXE
runs-on: windows-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Guard @zelara/finance — no react-native imports
shell: bash
run: |
if grep -r "react-native" src/packages/finance/ 2>/dev/null; then
echo "ERROR: @zelara/finance must not import react-native"
exit 1
fi
echo "OK: @zelara/finance is react-native free"
- name: Build shared packages
run: |
cd src/packages
npm install
npm run build -w @zelara/shared
npm run build -w @zelara/skill-tree
npm run build -w @zelara/state
npm run build -w @zelara/device-linking
npm run build -w @zelara/finance
- name: Install Tauri dependencies
run: |
cd apps/desktop
npm install
- name: Build Tauri app
run: |
cd apps/desktop
npm run tauri build
- name: Upload Windows installer
uses: actions/upload-artifact@v4
with:
name: windows-installer
path: apps/desktop/src-tauri/target/release/bundle/msi/*.msi
retention-days: 7
- name: Upload Windows EXE
uses: actions/upload-artifact@v4
with:
name: windows-exe
path: apps/desktop/src-tauri/target/release/zelara-core.exe
retention-days: 7
# ============================================
# macOS Desktop Build (Intel + Apple Silicon)
# ============================================
build-macos:
name: Build macOS App
runs-on: macos-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-apple-darwin,x86_64-apple-darwin
- name: Guard @zelara/finance — no react-native imports
shell: bash
run: |
if grep -r "react-native" src/packages/finance/ 2>/dev/null; then
echo "ERROR: @zelara/finance must not import react-native"
exit 1
fi
echo "OK: @zelara/finance is react-native free"
- name: Build shared packages
run: |
cd src/packages
npm install
npm run build -w @zelara/shared
npm run build -w @zelara/skill-tree
npm run build -w @zelara/state
npm run build -w @zelara/device-linking
npm run build -w @zelara/finance
- name: Install Tauri dependencies
run: |
cd apps/desktop
npm install
- name: Build Tauri app (Universal Binary)
run: |
cd apps/desktop
npm run tauri build -- --target universal-apple-darwin
- name: Upload macOS DMG
uses: actions/upload-artifact@v4
with:
name: macos-dmg
path: apps/desktop/src-tauri/target/universal-apple-darwin/release/bundle/dmg/*.dmg
retention-days: 7
- name: Upload macOS App
uses: actions/upload-artifact@v4
with:
name: macos-app
path: apps/desktop/src-tauri/target/universal-apple-darwin/release/bundle/macos/*.app
retention-days: 7
# ============================================
# iOS Build (requires macOS)
# ============================================
# DISABLED: Requires React Native ios/ directory with Xcode project and Podfile
# TODO: Initialize React Native project with proper iOS configuration
# build-ios:
# name: Build iOS IPA
# runs-on: macos-latest
#
# steps:
# - name: Checkout repository
# uses: actions/checkout@v4
# with:
# submodules: recursive
#
# - name: Setup Node.js
# uses: actions/setup-node@v4
# with:
# node-version: '18'
#
# - name: Setup Ruby
# uses: ruby/setup-ruby@v1
# with:
# ruby-version: '3.0'
#
# - name: Install CocoaPods
# run: |
# sudo gem install cocoapods
#
# - name: Build shared packages
# run: |
# cd src/packages/shared
# npm install
# npm run build
#
# cd ../skill-tree
# npm install
# npm run build
#
# cd ../state
# npm install
# npm run build
#
# cd ../device-linking
# npm install
# npm run build
#
# - name: Install dependencies
# run: |
# cd apps/mobile
# npm install --legacy-peer-deps
# cd ios
# pod install
#
# - name: Build iOS IPA (unsigned)
# run: |
# cd apps/mobile/ios
# xcodebuild -workspace Zelara.xcworkspace \
# -scheme Zelara \
# -configuration Release \
# -sdk iphoneos \
# -archivePath build/Zelara.xcarchive \
# archive \
# CODE_SIGN_IDENTITY="" \
# CODE_SIGNING_REQUIRED=NO \
# CODE_SIGNING_ALLOWED=NO
#
# - name: Export IPA
# run: |
# cd apps/mobile/ios
# xcodebuild -exportArchive \
# -archivePath build/Zelara.xcarchive \
# -exportPath build \
# -exportOptionsPlist ExportOptions.plist || echo "IPA export failed (expected without signing)"
#
# - name: Upload iOS build artifact
# uses: actions/upload-artifact@v4
# if: success()
# with:
# name: ios-ipa
# path: apps/mobile/ios/build/*.ipa
# retention-days: 7
# ============================================
# Linux AppImage Build
# ============================================
build-linux:
name: Build Linux AppImage
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libgtk-3-dev \
libwebkit2gtk-4.1-dev \
libappindicator3-dev \
librsvg2-dev \
patchelf \
libssl-dev
- name: Guard @zelara/finance — no react-native imports
shell: bash
run: |
if grep -r "react-native" src/packages/finance/ 2>/dev/null; then
echo "ERROR: @zelara/finance must not import react-native"
exit 1
fi
echo "OK: @zelara/finance is react-native free"
- name: Build shared packages
run: |
cd src/packages
npm install
npm run build -w @zelara/shared
npm run build -w @zelara/skill-tree
npm run build -w @zelara/state
npm run build -w @zelara/device-linking
npm run build -w @zelara/finance
- name: Install Tauri dependencies
run: |
cd apps/desktop
npm install
- name: Build Tauri app
run: |
cd apps/desktop
npm run tauri build
- name: Upload Linux AppImage
uses: actions/upload-artifact@v4
with:
name: linux-appimage
path: apps/desktop/src-tauri/target/release/bundle/appimage/*.AppImage
retention-days: 7
- name: Upload Linux DEB
uses: actions/upload-artifact@v4
with:
name: linux-deb
path: apps/desktop/src-tauri/target/release/bundle/deb/*.deb
retention-days: 7
# ============================================
# Create GitHub Release
# ============================================
create-release:
name: Create GitHub Release
needs: [build-android, build-testing-android, build-finance-android, build-windows, build-macos, build-linux]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-tags: true
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Display artifact structure
run: ls -R artifacts/
- name: Build release body
run: |
TAG="${{ github.ref_name }}"
# For annotated tags, use the tag message body; fall back to commit body
TAG_BODY=$(git tag -l --format='%(contents:body)' "$TAG")
if [ -z "$TAG_BODY" ]; then
TAG_BODY=$(git log -1 --format="%b" "$TAG")
fi
cat > release_body.md << 'ENDOFBODY'
## Zelara ${{ github.ref_name }}
ENDOFBODY
# Inject commit/tag body after the heading if present
if [ -n "$TAG_BODY" ]; then
printf '\n%s\n' "$TAG_BODY" >> release_body.md
fi
cat >> release_body.md << 'ENDOFBODY'
### Downloads
**Mobile**:
- 📱 Android: `app-release.apk`
- 🍎 iOS: Coming soon (requires native project setup)
**Desktop**:
- 🪟 Windows: `.msi` installer or `.exe` portable
- 🍎 macOS: `.dmg` installer (Universal Binary - Intel + Apple Silicon)
- 🐧 Linux: `.AppImage` portable or `.deb` package
### Installation Instructions
**Android**:
1. Download `app-release.apk`
2. Enable "Install from Unknown Sources" in Settings
3. Open APK to install
**Windows**:
1. Download `.msi` for installer or `.exe` for portable
2. Run installer or extract portable version
**macOS**:
1. Download `.dmg`
2. Open DMG and drag app to Applications
3. Right-click app → Open (first time, to bypass Gatekeeper)
**Linux**:
1. Download `.AppImage` or `.deb`
2. AppImage: `chmod +x *.AppImage && ./Zelara*.AppImage`
3. DEB: `sudo dpkg -i *.deb`
### What's Included
✅ Device Linking (Desktop ↔ Mobile via QR code)
✅ Recycling Task (Camera + Image Validation)
✅ Point System (Progress persistence)
✅ Mock CV Validation (ONNX model not yet integrated)
### Known Limitations
- Mock validation only (returns 85% confidence)
- Finance module not yet unlockable
- iOS build unsigned (requires Xcode signing)
---
🤖 Built with GitHub Actions
ENDOFBODY
- name: Create Release
uses: softprops/action-gh-release@v1
with:
name: Release ${{ github.ref_name }}
draft: false
prerelease: ${{ contains(github.ref_name, 'alpha') || contains(github.ref_name, 'beta') || contains(github.ref_name, 'test') }}
generate_release_notes: true
body_path: release_body.md
files: |
artifacts/android-apk/*.apk
artifacts/testing-android-apk/zelara-testing.apk
artifacts/finance-android-apk/zelara-finance.apk
artifacts/windows-installer/*.msi
artifacts/windows-exe/*.exe
artifacts/macos-dmg/*.dmg
artifacts/linux-appimage/*.AppImage
artifacts/linux-deb/*.deb
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}