Añadir build de macOS (.dmg universal) además de Windows
Workflow en matriz que genera .exe (NSIS) y .dmg (Intel+Apple Silicon) en cada versión. targets=all en la config y selección por --bundles. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Este commit está contenido en:
@@ -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
|
# 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.
|
# a mano desde la pestaña Actions (workflow_dispatch) para pruebas.
|
||||||
@@ -9,11 +9,28 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write # necesario para crear/actualizar el Release con el .exe
|
contents: write # necesario para crear/actualizar el Release con los instaladores
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
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:
|
steps:
|
||||||
- name: Clonar repo
|
- name: Clonar repo
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -25,6 +42,8 @@ jobs:
|
|||||||
|
|
||||||
- name: Instalar Rust
|
- name: Instalar Rust
|
||||||
uses: dtolnay/rust-toolchain@stable
|
uses: dtolnay/rust-toolchain@stable
|
||||||
|
with:
|
||||||
|
targets: ${{ matrix.rust_targets }}
|
||||||
|
|
||||||
- name: Cache de Rust
|
- name: Cache de Rust
|
||||||
uses: Swatinem/rust-cache@v2
|
uses: Swatinem/rust-cache@v2
|
||||||
@@ -38,14 +57,13 @@ jobs:
|
|||||||
run: npm run icons
|
run: npm run icons
|
||||||
|
|
||||||
- name: Construir instalador
|
- name: Construir instalador
|
||||||
run: npm run tauri build
|
run: npm run tauri build -- ${{ matrix.build_args }}
|
||||||
|
|
||||||
- name: Publicar instalador en el Release
|
- name: Publicar instalador en el Release
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
files: |
|
files: ${{ matrix.artifact_glob }}
|
||||||
src-tauri/target/release/bundle/nsis/*-setup.exe
|
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
@@ -53,5 +71,5 @@ jobs:
|
|||||||
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: labstream-os-setup
|
name: ${{ matrix.artifact_name }}
|
||||||
path: src-tauri/target/release/bundle/nsis/*-setup.exe
|
path: ${{ matrix.artifact_glob }}
|
||||||
97
README.md
97
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
|
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)
|
[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`).
|
(`https://os.labstreamsas.com`).
|
||||||
|
|
||||||
No contiene la app: el backend, la base de datos, OnlyOffice, etc. siguen en el
|
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` →
|
El servidor objetivo se configura en `src-tauri/tauri.conf.json` →
|
||||||
`app.windows[0].url`.
|
`app.windows[0].url`.
|
||||||
|
|
||||||
|
Salidas:
|
||||||
|
|
||||||
|
- **Windows** → instalador `.exe` (NSIS).
|
||||||
|
- **macOS** → `.dmg` universal (funciona en Intel y Apple Silicon).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Prerrequisitos (solo para construir)
|
## Prerrequisitos (solo para construir)
|
||||||
|
|
||||||
Quien instala el `.exe` **no necesita nada** (WebView2 ya viene en Windows 10/11).
|
Quien instala **no necesita nada** (en Windows, WebView2 ya viene en Win 10/11;
|
||||||
Para *construir* el instalador hacen falta:
|
en Mac, el WebView del sistema). Para *construir* hacen falta:
|
||||||
|
|
||||||
- [Node.js 20+](https://nodejs.org)
|
- [Node.js 20+](https://nodejs.org)
|
||||||
- [Rust](https://rustup.rs) (incluye `cargo`)
|
- [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
|
> ⚠️ **Cada sistema se construye en su sistema:** el `.exe` se compila en Windows
|
||||||
> compila de forma cruzada desde macOS de manera fiable. Por eso lo normal es
|
> y el `.dmg` en Mac. Tauri no compila de forma cruzada de manera fiable. Por eso
|
||||||
> dejar que **GitHub Actions** lo construya (ver más abajo). Si quieres hacerlo
|
> lo normal es dejar que **GitHub Actions** construya ambos (ver abajo). Como
|
||||||
> a mano, usa una PC o máquina virtual con Windows.
|
> 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`).
|
1. Sube este proyecto a su propio repositorio (ej. `Labstream2026/labstream-desktop`).
|
||||||
2. Cambia la versión en **dos** sitios (deben coincidir):
|
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 tag v1.1.0
|
||||||
git push origin main --tags
|
git push origin main --tags
|
||||||
```
|
```
|
||||||
4. GitHub Actions construye el `.exe` y lo publica en **Releases**. El equipo lo
|
4. GitHub Actions construye el `.exe` (Windows) y el `.dmg` (macOS) en paralelo y
|
||||||
descarga desde ahí: `https://github.com/Labstream2026/labstream-desktop/releases`.
|
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 →
|
También puedes lanzarlo a mano sin etiqueta desde **Actions → Build instaladores
|
||||||
Build instalador Windows → Run workflow** (el `.exe` queda como *artifact*).
|
→ 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
|
```bash
|
||||||
npm install
|
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_<versión>_x64-setup.exe
|
src-tauri/target/release/bundle/dmg/Labstream OS_<versión>_<arch>.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_<versión>_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 |
|
| Cambio grande / incompatible | 1.1.0 → 2.0.0 |
|
||||||
|
|
||||||
La versión del **envoltorio** es independiente de la de la app web
|
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
|
(`labstream-os`). Una sola etiqueta de versión genera el instalador de Windows y
|
||||||
chocan; documenta aquí si en algún momento una versión del envoltorio exige una
|
el de Mac a la vez, así ambas plataformas van siempre sincronizadas.
|
||||||
versión mínima del backend.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Actualización automática (opcional, recomendable a futuro)
|
## Actualización automática (opcional, recomendable a futuro)
|
||||||
|
|
||||||
Hoy, para actualizar, el equipo descarga el nuevo `.exe` del Release y lo
|
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
|
reinstala encima. Para que las apps ya instaladas se actualicen solas, Tauri trae
|
||||||
trae un *updater*. Para activarlo (paso futuro):
|
un *updater* (funciona igual en Windows y Mac). Para activarlo (paso futuro):
|
||||||
|
|
||||||
1. Genera el par de claves de firma:
|
1. Genera el par de claves de firma:
|
||||||
```bash
|
```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
|
Como los instaladores **no están firmados** con certificado de pago, la primera
|
||||||
mostrará una pantalla azul *"Windows protegió su PC"* la primera vez. Es normal
|
vez cada sistema muestra una advertencia. Es normal para apps internas:
|
||||||
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
|
Si en el futuro se distribuye a clientes externos, conviene firmar:
|
||||||
*code signing* (~150–400 USD/año) para quitar ese aviso.
|
*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)
|
├── dist/index.html pantalla de respaldo (requerida por Tauri)
|
||||||
├── package.json scripts de build
|
├── package.json scripts de build
|
||||||
├── src-tauri/
|
├── 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
|
│ ├── Cargo.toml dependencias Rust + versión
|
||||||
│ ├── build.rs
|
│ ├── build.rs
|
||||||
│ ├── capabilities/default.json
|
│ ├── capabilities/default.json
|
||||||
│ ├── icons/ se generan desde app-icon.png
|
│ ├── icons/ se generan desde app-icon.png
|
||||||
│ └── src/{main.rs,lib.rs}
|
│ └── 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)
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
},
|
},
|
||||||
"bundle": {
|
"bundle": {
|
||||||
"active": true,
|
"active": true,
|
||||||
"targets": ["nsis"],
|
"targets": "all",
|
||||||
"publisher": "Labstream SAS",
|
"publisher": "Labstream SAS",
|
||||||
"category": "Productivity",
|
"category": "Productivity",
|
||||||
"shortDescription": "Espacio de trabajo de Labstream",
|
"shortDescription": "Espacio de trabajo de Labstream",
|
||||||
@@ -45,6 +45,9 @@
|
|||||||
"installMode": "currentUser",
|
"installMode": "currentUser",
|
||||||
"languages": ["Spanish", "SpanishInternational", "English"]
|
"languages": ["Spanish", "SpanishInternational", "English"]
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"macOS": {
|
||||||
|
"minimumSystemVersion": "10.15"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Referencia en una nueva incidencia
Block a user