Skip to content

feat: Cap.B pulido — semáforo/alarma de marcas cerradas (ClosedBrands… #44

feat: Cap.B pulido — semáforo/alarma de marcas cerradas (ClosedBrands…

feat: Cap.B pulido — semáforo/alarma de marcas cerradas (ClosedBrands… #44

Workflow file for this run

name: Build & publish Android APK
# Cada push a main (que toque código de la app) → APK release firmado + version.json
# subidos al bucket público `apps` de Supabase. Las tablets se actualizan solas
# (ver src/native/appUpdate.ts + UpdateGate). Cero Android Studio, cero cables.
#
# Política de forzado (mandatory): por defecto FALSE → la actualización se ofrece
# pero no bloquea (se aplica en reposo/reinicio, sin interrumpir el servicio de
# cocina). Solo es OBLIGATORIA si el mensaje del commit contiene el marcador
# [force-update] — reservado a cambios que rompen compatibilidad. Ver UpdateGate.
on:
push:
branches: [main]
paths-ignore:
- 'docs/**'
- '**/*.md'
- 'supabase/**'
workflow_dispatch:
jobs:
build-apk:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '21'
- name: Install deps
run: npm ci
- name: Build web bundle
run: npm run build
env:
VITE_SUPABASE_URL: ${{ secrets.VITE_SUPABASE_URL }}
VITE_SUPABASE_ANON_KEY: ${{ secrets.VITE_SUPABASE_ANON_KEY }}
VITE_APP_URL: ${{ secrets.VITE_APP_URL }}
VITE_MAPBOX_TOKEN: ${{ secrets.VITE_MAPBOX_TOKEN }}
VITE_STRIPE_PUBLISHABLE_KEY: ${{ secrets.VITE_STRIPE_PUBLISHABLE_KEY }}
- name: Capacitor sync (android)
run: npx cap sync android
- name: Decode signing keystore
run: echo "${{ secrets.FOLVY_KEYSTORE_B64 }}" | base64 -d > android/app/folvy-release.jks
- name: Build signed release APK
working-directory: android
run: ./gradlew assembleRelease --no-daemon
env:
FOLVY_KEYSTORE_FILE: folvy-release.jks
FOLVY_KEYSTORE_PWD: ${{ secrets.FOLVY_KEYSTORE_PWD }}
FOLVY_KEY_ALIAS: ${{ secrets.FOLVY_KEY_ALIAS }}
FOLVY_KEY_PWD: ${{ secrets.FOLVY_KEY_PWD }}
FOLVY_VERSION_CODE: ${{ github.run_number }}
- name: Prepare version.json
run: |
VC="${{ github.run_number }}"
# mandatory=false salvo que el commit HEAD lleve [force-update]. Se lee con
# git (funciona igual en push y en workflow_dispatch, sin depender de la
# forma del evento).
MSG="$(git log -1 --pretty=%B)"
if printf '%s' "$MSG" | grep -qF '[force-update]'; then
MANDATORY=true
else
MANDATORY=false
fi
cat > version.json <<EOF
{ "versionCode": ${VC}, "versionName": "1.0.${VC}", "apkUrl": "${{ secrets.VITE_SUPABASE_URL }}/storage/v1/object/public/apps/folvy.apk", "mandatory": ${MANDATORY} }
EOF
echo "mandatory=${MANDATORY} (commit: ${MSG%%$'\n'*})"
echo "version.json:" && cat version.json
- name: Upload APK + version.json to Supabase Storage (bucket apps, upsert)
env:
SB_URL: ${{ secrets.VITE_SUPABASE_URL }}
SB_KEY: ${{ secrets.SUPABASE_SERVICE_KEY }}
run: |
APK="android/app/build/outputs/apk/release/app-release.apk"
test -f "$APK" || { echo "APK no encontrado en $APK"; exit 1; }
echo "Subiendo folvy.apk ($(du -h "$APK" | cut -f1))…"
curl -sSf -X POST "$SB_URL/storage/v1/object/apps/folvy.apk" \
-H "Authorization: Bearer $SB_KEY" \
-H "x-upsert: true" \
-H "Content-Type: application/vnd.android.package-archive" \
--data-binary "@$APK"
echo "Subiendo version.json…"
curl -sSf -X POST "$SB_URL/storage/v1/object/apps/version.json" \
-H "Authorization: Bearer $SB_KEY" \
-H "x-upsert: true" \
-H "Content-Type: application/json" \
--data-binary "@version.json"
echo "OK · versionCode=${{ github.run_number }}"