Files
Pablo a054c73139 Agrego .github, que contiene los action yaml
No van a funcionar porque son de github actions, pero los subo porque no dejan de ser código fuente que puede reutilizarse, adaptándolo a otro entorno
2026-08-22 19:11:33 -03:00

175 lines
7.4 KiB
YAML

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/<entorno>.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