diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build.yml similarity index 53% rename from .github/workflows/build-windows.yml rename to .github/workflows/build.yml index 387af02..dc55c76 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,4 @@ -name: Build instalador Windows +name: Build instaladores (Windows + macOS) # Se dispara al publicar una etiqueta de versión (ej. v1.0.0) y también # a mano desde la pestaña Actions (workflow_dispatch) para pruebas. @@ -9,11 +9,28 @@ on: workflow_dispatch: permissions: - contents: write # necesario para crear/actualizar el Release con el .exe + contents: write # necesario para crear/actualizar el Release con los instaladores jobs: build: - runs-on: windows-latest + strategy: + fail-fast: false + matrix: + include: + # Windows → instalador .exe (NSIS) + - platform: windows-latest + rust_targets: "" + build_args: "--bundles nsis" + artifact_glob: "src-tauri/target/release/bundle/nsis/*-setup.exe" + artifact_name: labstream-os-windows + # macOS → .dmg universal (Intel + Apple Silicon) + - platform: macos-latest + rust_targets: "aarch64-apple-darwin,x86_64-apple-darwin" + build_args: "--target universal-apple-darwin --bundles dmg" + artifact_glob: "src-tauri/target/universal-apple-darwin/release/bundle/dmg/*.dmg" + artifact_name: labstream-os-macos + + runs-on: ${{ matrix.platform }} steps: - name: Clonar repo uses: actions/checkout@v4 @@ -25,6 +42,8 @@ jobs: - name: Instalar Rust uses: dtolnay/rust-toolchain@stable + with: + targets: ${{ matrix.rust_targets }} - name: Cache de Rust uses: Swatinem/rust-cache@v2 @@ -38,14 +57,13 @@ jobs: run: npm run icons - name: Construir instalador - run: npm run tauri build + run: npm run tauri build -- ${{ matrix.build_args }} - name: Publicar instalador en el Release if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v2 with: - files: | - src-tauri/target/release/bundle/nsis/*-setup.exe + files: ${{ matrix.artifact_glob }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -53,5 +71,5 @@ jobs: if: ${{ !startsWith(github.ref, 'refs/tags/') }} uses: actions/upload-artifact@v4 with: - name: labstream-os-setup - path: src-tauri/target/release/bundle/nsis/*-setup.exe + name: ${{ matrix.artifact_name }} + path: ${{ matrix.artifact_glob }} diff --git a/README.md b/README.md index 0bca474..b3d876a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Labstream OS — App de escritorio (Windows) +# Labstream OS — App de escritorio (Windows + macOS) Envoltorio de escritorio para **Labstream OS**. Es un cliente delgado hecho con [Tauri 2](https://tauri.app): abre una ventana propia (sin barra de navegador) @@ -6,32 +6,38 @@ que carga el servidor de Labstream OS que corre en el NAS (`https://os.labstreamsas.com`). No contiene la app: el backend, la base de datos, OnlyOffice, etc. siguen en el -NAS. Esto solo le da al equipo un ícono y una ventana propia en Windows. +NAS. Esto solo le da al equipo un ícono y una ventana propia en Windows y Mac. El servidor objetivo se configura en `src-tauri/tauri.conf.json` → `app.windows[0].url`. +Salidas: + +- **Windows** → instalador `.exe` (NSIS). +- **macOS** → `.dmg` universal (funciona en Intel y Apple Silicon). + --- ## Prerrequisitos (solo para construir) -Quien instala el `.exe` **no necesita nada** (WebView2 ya viene en Windows 10/11). -Para *construir* el instalador hacen falta: +Quien instala **no necesita nada** (en Windows, WebView2 ya viene en Win 10/11; +en Mac, el WebView del sistema). Para *construir* hacen falta: - [Node.js 20+](https://nodejs.org) - [Rust](https://rustup.rs) (incluye `cargo`) -- En Windows: las "Visual Studio Build Tools" con el componente de C++. +- En Windows: "Visual Studio Build Tools" con el componente de C++. +- En Mac: Xcode Command Line Tools (`xcode-select --install`). -> ⚠️ **Importante:** el `.exe` de Windows se construye **en Windows**. Tauri no -> compila de forma cruzada desde macOS de manera fiable. Por eso lo normal es -> dejar que **GitHub Actions** lo construya (ver más abajo). Si quieres hacerlo -> a mano, usa una PC o máquina virtual con Windows. +> ⚠️ **Cada sistema se construye en su sistema:** el `.exe` se compila en Windows +> y el `.dmg` en Mac. Tauri no compila de forma cruzada de manera fiable. Por eso +> lo normal es dejar que **GitHub Actions** construya ambos (ver abajo). Como +> excepción cómoda: si trabajas en Mac, el `.dmg` **sí** lo puedes hacer en local. --- -## Construir el instalador con GitHub Actions (recomendado) +## Construir los instaladores con GitHub Actions (recomendado) -El flujo no requiere tener Windows a mano: +Genera **ambos** instaladores sin tener las dos máquinas a mano: 1. Sube este proyecto a su propio repositorio (ej. `Labstream2026/labstream-desktop`). 2. Cambia la versión en **dos** sitios (deben coincidir): @@ -44,27 +50,45 @@ El flujo no requiere tener Windows a mano: git tag v1.1.0 git push origin main --tags ``` -4. GitHub Actions construye el `.exe` y lo publica en **Releases**. El equipo lo - descarga desde ahí: `https://github.com/Labstream2026/labstream-desktop/releases`. +4. GitHub Actions construye el `.exe` (Windows) y el `.dmg` (macOS) en paralelo y + los publica juntos en **Releases**: + `https://github.com/Labstream2026/labstream-desktop/releases`. -También puedes lanzarlo a mano sin etiqueta desde la pestaña **Actions → -Build instalador Windows → Run workflow** (el `.exe` queda como *artifact*). +También puedes lanzarlo a mano sin etiqueta desde **Actions → Build instaladores +→ Run workflow** (los instaladores quedan como *artifacts*). --- -## Construir en local (en una PC Windows) +## Construir en local + +### En Mac (tu máquina) → genera el `.dmg` ```bash npm install -npm run build # genera iconos + compila el instalador +npm run icons +npm run tauri build -- --bundles dmg ``` -El instalador queda en: +El `.dmg` queda en: ``` -src-tauri/target/release/bundle/nsis/Labstream OS__x64-setup.exe +src-tauri/target/release/bundle/dmg/Labstream OS__.dmg ``` -Para desarrollo con recarga en caliente: `npm run dev`. +> Para un `.dmg` universal (Intel + Apple Silicon) en local: +> ```bash +> rustup target add aarch64-apple-darwin x86_64-apple-darwin +> npm run tauri build -- --target universal-apple-darwin --bundles dmg +> ``` + +### En una PC Windows → genera el `.exe` + +```bash +npm install +npm run tauri build -- --bundles nsis +``` +Queda en `src-tauri/target/release/bundle/nsis/Labstream OS__x64-setup.exe`. + +Para desarrollo con recarga en caliente (en cualquier sistema): `npm run dev`. --- @@ -79,17 +103,16 @@ Se usa `MAYOR.MENOR.PARCHE`: | Cambio grande / incompatible | 1.1.0 → 2.0.0 | La versión del **envoltorio** es independiente de la de la app web -(`labstream-os`). Como la ventana siempre apunta al mismo servidor, casi nunca -chocan; documenta aquí si en algún momento una versión del envoltorio exige una -versión mínima del backend. +(`labstream-os`). Una sola etiqueta de versión genera el instalador de Windows y +el de Mac a la vez, así ambas plataformas van siempre sincronizadas. --- ## Actualización automática (opcional, recomendable a futuro) -Hoy, para actualizar, el equipo descarga el nuevo `.exe` del Release y lo -reinstala encima. Para que las apps ya instaladas se actualicen solas, Tauri -trae un *updater*. Para activarlo (paso futuro): +Hoy, para actualizar, el equipo descarga el nuevo instalador del Release y lo +reinstala encima. Para que las apps ya instaladas se actualicen solas, Tauri trae +un *updater* (funciona igual en Windows y Mac). Para activarlo (paso futuro): 1. Genera el par de claves de firma: ```bash @@ -104,16 +127,20 @@ configuración extra. --- -## Aviso de SmartScreen (instalación interna) +## Avisos de seguridad del sistema (instalación interna sin firmar) -Como el instalador **no está firmado** con un certificado de pago, Windows -mostrará una pantalla azul *"Windows protegió su PC"* la primera vez. Es normal -para apps internas: +Como los instaladores **no están firmados** con certificado de pago, la primera +vez cada sistema muestra una advertencia. Es normal para apps internas: -> **Más información → Ejecutar de todos modos** +- **Windows (SmartScreen):** pantalla azul *"Windows protegió su PC"* → + **Más información → Ejecutar de todos modos**. +- **macOS (Gatekeeper):** *"no se puede abrir porque proviene de un desarrollador + no identificado"* → clic derecho sobre la app → **Abrir** → **Abrir**. (Si + insiste, ejecutar una vez: `xattr -cr "/Applications/Labstream OS.app"`.) -Si en el futuro se distribuye a clientes externos, conviene un certificado de -*code signing* (~150–400 USD/año) para quitar ese aviso. +Si en el futuro se distribuye a clientes externos, conviene firmar: +*code signing* en Windows (~150–400 USD/año) y un *Apple Developer ID* + notarizado +en Mac (99 USD/año) para quitar estos avisos. --- @@ -125,11 +152,11 @@ labstream-desktop/ ├── dist/index.html pantalla de respaldo (requerida por Tauri) ├── package.json scripts de build ├── src-tauri/ -│ ├── tauri.conf.json nombre, versión, URL del servidor, instalador +│ ├── tauri.conf.json nombre, versión, URL del servidor, instaladores │ ├── Cargo.toml dependencias Rust + versión │ ├── build.rs │ ├── capabilities/default.json │ ├── icons/ se generan desde app-icon.png │ └── src/{main.rs,lib.rs} -└── .github/workflows/build-windows.yml build automático del .exe +└── .github/workflows/build.yml build automático de .exe (Windows) y .dmg (macOS) ``` diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 6e32a6f..1c7b631 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -28,7 +28,7 @@ }, "bundle": { "active": true, - "targets": ["nsis"], + "targets": "all", "publisher": "Labstream SAS", "category": "Productivity", "shortDescription": "Espacio de trabajo de Labstream", @@ -45,6 +45,9 @@ "installMode": "currentUser", "languages": ["Spanish", "SpanishInternational", "English"] } + }, + "macOS": { + "minimumSystemVersion": "10.15" } } }