name: Build Windows installer # Compila la app de escritorio para Windows y la del updater (soma_pro_updater), # arma el paquete de actualización (zip + manifest.json) que consume el # auto-updater, y un instalador (.exe, con Inno Setup) para la primera # instalación. Corre en un runner Windows de GitHub: un .exe de Windows NO se # puede compilar desde Linux/Mac, así que esto reemplaza a tener una máquina # Windows propia. Mismo esquema que build-macos.yml. # # Se dispara a mano desde la pestaña Actions ("Run workflow"). Al dispararlo # elegís a qué Supabase apunta el build (prod o dev) — eso decide qué # config/.json se hornea en el bundle. # # Qué deja: # - Un .exe (Inno Setup) para la PRIMERA instalación: instala el updater en # la raíz y la app en app\, con acceso directo a la app. Sale como artifact. # - El paquete de actualización (zip de la carpeta app\) + manifest.json. # También como artifact, y si el build es de prod se publica solo al feed # de GitHub Pages (repo peblo423/soma-pro-releases, carpeta windows/), que # es de donde el updater baja las nuevas versiones. # # Por qué updater en la raíz y app en app\ (a diferencia de macOS, donde son # hermanos): en Windows cada carpeta de build es un montón de archivos sueltos # (exe + dlls + data\), no un bundle autocontenido como el .app de macOS: si # updater y app compartieran carpeta, sus data\ se pisarían entre sí. Lo espera # así updater_service.dart, y lib/main.dart busca al updater un nivel arriba # de donde corre la app (ver _redirectToUpdaterIfNeeded). # # No usa secretos para compilar (URL + anon key son públicas, ya están en # config/*.json); sí usa RELEASES_REPO_TOKEN (PAT con Contents:write sobre # soma-pro-releases) para publicar al feed en prod. on: workflow_dispatch: inputs: environment: description: "Entorno / Supabase al que apunta la app" type: choice options: - prod - dev default: dev jobs: build: runs-on: windows-latest steps: - name: Checkout del repo uses: actions/checkout@v4 # Barrera contra publicar código de desarrollo en producción: solo master # puede generar un build de prod. Mismo motivo que en build-macos.yml. - name: Verificar rama para builds de prod if: ${{ inputs.environment == 'prod' && github.ref != 'refs/heads/master' }} shell: bash run: | echo "::error::Los builds de prod solo se publican desde master, no desde ${GITHUB_REF#refs/heads/}." echo "Si querés compilar desde esta rama para probar, elegí 'dev' en el dropdown." exit 1 # Misma versión que usa Pablo localmente, para que el build sea reproducible. - name: Instalar Flutter 3.41.6 uses: subosito/flutter-action@v2 with: flutter-version: 3.41.6 channel: stable cache: true - name: Habilitar Windows desktop run: flutter config --enable-windows-desktop # --- App principal --- - name: Dependencias app (pub get) working-directory: flutter_soma_app run: flutter pub get - name: Compilar app release (${{ inputs.environment }}) working-directory: flutter_soma_app run: flutter build windows --release --dart-define-from-file=config/${{ inputs.environment }}.json # --- Updater --- - name: Dependencias updater (pub get) working-directory: soma_pro_updater run: flutter pub get - name: Compilar updater release working-directory: soma_pro_updater run: flutter build windows --release # --- Empaquetado --- - name: Armar layout, paquete de update y manifest id: package shell: pwsh run: | $ErrorActionPreference = "Stop" $pubspec = Get-Content flutter_soma_app\pubspec.yaml -Raw if ($pubspec -notmatch "version:\s*([\d\.]+)") { throw "No se pudo leer la versión de pubspec.yaml" } $version = $Matches[1] "version=$version" >> $env:GITHUB_OUTPUT Write-Host "Empaquetando SOMA PRO v$version (${{ inputs.environment }})" # El updater vive en la raíz de instalación; la app real va en `app/` # para que sus carpetas `data/` no se pisen (ver updater_service.dart). $stage = "release\windows\SOMA PRO" if (Test-Path "release") { Remove-Item "release" -Recurse -Force } New-Item -ItemType Directory -Path "$stage\app" -Force | Out-Null Copy-Item "soma_pro_updater\build\windows\x64\runner\Release\*" $stage -Recurse Copy-Item "flutter_soma_app\build\windows\x64\runner\Release\*" "$stage\app" -Recurse @{ version = $version } | ConvertTo-Json | Set-Content "$stage\version.json" # Paquete de actualización: solo lo que va dentro de app/, es lo que # el updater descarga y extrae sobre app/ cuando hay una versión nueva. New-Item -ItemType Directory -Path "out" -Force | Out-Null $updateZip = "out\soma_pro-windows-$version.zip" Compress-Archive -Path "$stage\app\*" -DestinationPath $updateZip $sha = (Get-FileHash $updateZip -Algorithm SHA256).Hash.ToLower() @{ version = $version url = "https://peblo423.github.io/soma-pro-releases/windows/soma_pro-windows-$version.zip" sha256 = $sha } | ConvertTo-Json | Set-Content "out\manifest.json" - name: Instalar Inno Setup run: choco install innosetup --no-progress -y - name: Armar el instalador (primera instalación) run: '& "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" "/DAppEnv=${{ inputs.environment }}" "/DAppVersion=${{ steps.package.outputs.version }}" flutter_soma_app\installer\soma.iss' - name: Mover el instalador a out/ shell: pwsh run: Copy-Item "flutter_soma_app\installer\Output\*.exe" "out\" - name: Subir artifacts uses: actions/upload-artifact@v4 with: name: SOMA-${{ inputs.environment }}-windows path: | out/*.exe out/*.zip out/manifest.json if-no-files-found: error # Publica el paquete de update al feed público SOLO en prod: el feed es # único (no separa dev/prod), así que un build dev no debe llegarle a nadie. - name: Publicar al feed (solo prod) if: ${{ inputs.environment == 'prod' }} shell: bash env: RELEASES_REPO_TOKEN: ${{ secrets.RELEASES_REPO_TOKEN }} run: | set -euo pipefail if [ -z "${RELEASES_REPO_TOKEN:-}" ]; then echo "Falta el secret RELEASES_REPO_TOKEN (PAT con Contents:write sobre soma-pro-releases)"; exit 1 fi VERSION="${{ steps.package.outputs.version }}" git clone --depth 1 \ "https://x-access-token:${RELEASES_REPO_TOKEN}@github.com/peblo423/soma-pro-releases.git" feed mkdir -p feed/windows cp "out/soma_pro-windows-$VERSION.zip" feed/windows/ cp "out/manifest.json" feed/windows/manifest.json cd feed git config user.name "soma-ci" git config user.email "ci@soma.local" git add windows if git diff --cached --quiet; then echo "Sin cambios para publicar." else git commit -m "Windows release v$VERSION" git push fi