diff --git a/.github/workflows/electron-release.yml b/.github/workflows/electron-release.yml index 955e765922..2d155566c3 100644 --- a/.github/workflows/electron-release.yml +++ b/.github/workflows/electron-release.yml @@ -1,29 +1,71 @@ name: Build Electron Desktop App on: - release: - types: [published] + push: + tags: + - 'v*' + workflow_dispatch: + inputs: + version: + description: 'Release version (e.g., v1.6.8)' + required: true + type: string permissions: contents: write jobs: + validate: + name: Validate version + runs-on: ubuntu-latest + outputs: + version: ${{ steps.validate.outputs.version }} + steps: + - name: Checkout code + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Validate version format + id: validate + run: | + if [[ "${{ github.event_name }}" == "push" ]]; then + VERSION="${GITHUB_REF#refs/tags/}" + else + VERSION="${{ inputs.version }}" + fi + + if [[ ! "$VERSION" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Error: Invalid version format. Expected: v1.6.8" + exit 1 + fi + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "✓ Valid version: $VERSION" + build: - name: Build Electron (${{ matrix.os }}) + name: Build Electron (${{ matrix.platform }}) + needs: validate runs-on: ${{ matrix.runner }} strategy: fail-fast: false matrix: include: - - os: windows + - platform: windows runner: windows-latest target: win - - os: macos + ext: .exe + - platform: macos-intel runner: macos-latest target: mac - - os: linux + ext: .dmg + - platform: macos-arm64 + runner: macos-latest + target: mac + ext: -arm64.dmg + - platform: linux runner: ubuntu-latest target: linux + ext: .AppImage steps: - name: Checkout @@ -53,13 +95,76 @@ jobs: working-directory: electron run: npm install --no-audit --no-fund - - name: Build Electron for ${{ matrix.target }} + - name: Build Electron for ${{ matrix.platform }} working-directory: electron run: npm run build:${{ matrix.target }} - - name: Upload release assets + - name: Collect installers + run: | + mkdir -p release-assets + cd electron/dist-electron + # Copy only installer files for this platform + for file in *${{ matrix.ext }}; do + [ -f "$file" ] && cp "$file" ../../release-assets/ + done + # Windows: also copy portable standalone exe + if [ "${{ matrix.platform }}" = "windows" ]; then + [ -f "OmniRoute.exe" ] && cp OmniRoute.exe ../../release-assets/ + fi + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: electron-${{ matrix.platform }} + path: release-assets/ + + release: + name: Create Release + needs: [validate, build] + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: release-assets + merge-multiple: true + + - name: Create source archives + run: | + # Create source code archives (excluding dev dependencies and build artifacts) + export TARBALL="OmniRoute-${{ needs.validate.outputs.version }}.source.tar.gz" + export ZIPBALL="OmniRoute-${{ needs.validate.outputs.version }}.source.zip" + + # Use git archive for clean source export + git archive --format=tar.gz --prefix=OmniRoute-${{ needs.validate.outputs.version }}/ HEAD -o "release-assets/$TARBALL" + git archive --format=zip --prefix=OmniRoute-${{ needs.validate.outputs.version }}/ HEAD -o "release-assets/$ZIPBALL" + + echo "✓ Created source archives:" + ls -lh "release-assets/$TARBALL" "release-assets/$ZIPBALL" + + - name: List release files + run: ls -la release-assets/ + + - name: Create Release uses: softprops/action-gh-release@v2 with: - files: electron/dist-electron/**/* + tag_name: ${{ needs.validate.outputs.version }} + draft: false + prerelease: false + generate_release_notes: true + files: | + release-assets/*.dmg + release-assets/*-arm64.dmg + release-assets/*.exe + release-assets/*.AppImage + release-assets/*.blockmap + release-assets/*.source.tar.gz + release-assets/*.source.zip + release-assets/OmniRoute.exe env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index b6da6bdb51..9df66354e9 100644 --- a/.gitignore +++ b/.gitignore @@ -103,7 +103,8 @@ app.log # Backup directories app.__qa_backup/ -# Electron (subproject dependency lock) +# Electron (subproject dependency lock and build artifacts) electron/package-lock.json -icon.iconset/ electron/dist-electron/ +electron/node_modules/ +icon.iconset/ diff --git a/electron/README.md b/electron/README.md index 98662eeffd..1b224c7d19 100644 --- a/electron/README.md +++ b/electron/README.md @@ -100,10 +100,48 @@ npm run build:linux Built applications are placed in `dist-electron/`: -- Windows: `.exe` installer (NSIS) -- macOS: `.dmg` installer (universal) +- Windows: `.exe` installer (NSIS) + portable `.exe` +- macOS: `.dmg` installer (Intel + Apple Silicon) - Linux: `.AppImage` +## Installation + +### macOS + +1. Download the latest `.dmg` from the [Releases](https://github.com/diegosouzapw/OmniRoute/releases) page. +2. Open the `.dmg` file. +3. Drag `OmniRoute.app` to the Applications folder. +4. Launch from Applications. + +> ⚠️ **Note:** The app is not signed with an Apple Developer certificate yet. If macOS blocks the app, run: +> ```bash +> xattr -cr /Applications/OmniRoute.app +> ``` +> Or right-click the app → Open → Open (to bypass Gatekeeper on first launch). + +### Windows + +**Installer (Recommended):** +1. Download `OmniRoute.Setup.*.exe` from [Releases](https://github.com/diegosouzapw/OmniRoute/releases). +2. Run the installer. +3. Launch from Start Menu or Desktop shortcut. + +**Portable (No Installation):** +1. Download `OmniRoute.exe` from [Releases](https://github.com/diegosouzapw/OmniRoute/releases). +2. Run directly from any folder. + +### Linux + +1. Download the `.AppImage` from [Releases](https://github.com/diegosouzapw/OmniRoute/releases). +2. Make it executable: + ```bash + chmod +x OmniRoute-*.AppImage + ``` +3. Run: + ```bash + ./OmniRoute-*.AppImage + ``` + ## Features - **Server Readiness** — Waits for health check before showing window diff --git a/electron/package.json b/electron/package.json index 77746f6669..0aa6b5c1f6 100644 --- a/electron/package.json +++ b/electron/package.json @@ -63,6 +63,12 @@ "arch": [ "x64" ] + }, + { + "target": "portable", + "arch": [ + "x64" + ] } ], "icon": "assets/icon.ico"