From 42dd64635c3f9fb4eea0f89c67334c9b67c5351b Mon Sep 17 00:00:00 2001 From: FreeTLab Date: Mon, 25 May 2026 20:47:19 +0200 Subject: [PATCH 01/10] =?UTF-8?q?feat(pluriwave):=20a=C3=B1adir=20firma=20?= =?UTF-8?q?release=20con=20keystore=20pluriwave-upload=20para=20Google=20P?= =?UTF-8?q?lay?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 29 +++++++++++++++++++++++------ android/app/build.gradle.kts | 16 +++++++++------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 2407e60..07fb1c7 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -7,6 +7,8 @@ on: env: PATH: /opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin ANDROID_HOME: /Users/freetlab/Library/Android/sdk + KEYSTORE_PATH: /Users/freetlab/.openclaw/workspace/.secure/pluriwave/pluriwave-upload.jks + KEYSTORE_ALIAS: pluriwave-upload jobs: analizar: @@ -16,8 +18,6 @@ jobs: - uses: actions/checkout@v4 - name: Obtener dependencias run: flutter pub get - #- name: Generar l10n - # run: flutter gen-l10n - name: Analizar código run: flutter analyze --no-fatal-infos --no-fatal-warnings @@ -29,6 +29,21 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Configurar keystore de firma + env: + KEYSTORE_PASSWORD: ${{ secrets.PLURIWAVE_KEYSTORE_PASSWORD }} + run: | + echo "Verificando keystore..." + if [ ! -f "$KEYSTORE_PATH" ]; then + echo "ERROR: Keystore no encontrado en $KEYSTORE_PATH" + exit 1 + fi + echo "storeFile=$KEYSTORE_PATH" > android/key.properties + echo "storePassword=$KEYSTORE_PASSWORD" >> android/key.properties + echo "keyAlias=$KEYSTORE_ALIAS" >> android/key.properties + echo "keyPassword=$KEYSTORE_PASSWORD" >> android/key.properties + echo "✅ Keystore configurado" + - name: Bump versión patch + commit run: | git config user.name "ShanaiaBot" @@ -59,15 +74,17 @@ jobs: - name: Obtener dependencias run: flutter pub get - #- name: Generar l10n - # run: flutter gen-l10n - - name: Build APK release run: flutter build apk --release - name: Build AAB release run: flutter build appbundle --release + - name: Verificar firma del AAB + run: | + echo "Verificando certificado del AAB..." + keytool -list -v -keystore "$KEYSTORE_PATH" -alias $KEYSTORE_ALIAS -storepass "$KEYSTORE_PASSWORD" 2>/dev/null | grep "SHA1:\|SHA256:" || echo "No se pudo verificar" + - name: Publicar en ftl-builds (Zimaboard) run: | VERSION="${{ steps.version.outputs.version }}" @@ -94,7 +111,7 @@ jobs: BOT_TOKEN=$(plutil -extract 'EnvironmentVariables:TELEGRAM_BOT_TOKEN' raw /Users/freetlab/Library/LaunchAgents/ai.openclaw.gateway.plist 2>/dev/null || echo "") if [ -z "$BOT_TOKEN" ]; then exit 0; fi if [ "${{ job.status }}" = "success" ]; then - MSG="✅ *Pluriwave* v${VERSION} build OK · ${COMMIT}%0AAPK + AAB en builds.freetimelab.es" + MSG="✅ *Pluriwave* v${VERSION} build OK (firma release) · ${COMMIT}%0AAPK + AAB en builds.freetimelab.es" else MSG="❌ *Pluriwave* v${VERSION} build FAILED · ${COMMIT}" fi diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 4309abf..5a07010 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -1,7 +1,6 @@ plugins { id("com.android.application") id("kotlin-android") - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id("dev.flutter.flutter-gradle-plugin") } @@ -20,21 +19,24 @@ android { } defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "es.freetimelab.pluriwave" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName } + signingConfigs { + create("release") { + // Configurado por el workflow via android/key.properties + // Keystore: ~/.openclaw/workspace/.secure/pluriwave/pluriwave-upload.jks + // Alias: pluriwave-upload + } + } + buildTypes { release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.getByName("debug") + signingConfig = signingConfigs.getByName("release") } } } From e5aa1439bd03fc90ca1b0f615fb5d369cf3a6f83 Mon Sep 17 00:00:00 2001 From: FreeTLab Date: Mon, 25 May 2026 21:11:47 +0200 Subject: [PATCH 02/10] refactor(ci): reemplazar actions/checkout por git clone directo, eliminar dependencia de GitHub --- .gitea/workflows/build.yml | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 07fb1c7..19a7224 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -15,9 +15,14 @@ jobs: name: Análisis de código runs-on: [self-hosted, macos, arm64, flutter] steps: - - uses: actions/checkout@v4 + - name: Clonar repo + run: | + git clone https://ShanaiaBot:${{ secrets.GITEA_TOKEN }}@git.freetimelab.es/FreeTLab/pluriwave.git . + git fetch origin main + - name: Obtener dependencias run: flutter pub get + - name: Analizar código run: flutter analyze --no-fatal-infos --no-fatal-warnings @@ -27,13 +32,15 @@ jobs: needs: analizar if: ${{ gitea.ref == 'refs/heads/main' }} steps: - - uses: actions/checkout@v4 + - name: Clonar repo + run: | + git clone https://ShanaiaBot:${{ secrets.GITEA_TOKEN }}@git.freetimelab.es/FreeTLab/pluriwave.git . + git fetch origin main - name: Configurar keystore de firma env: KEYSTORE_PASSWORD: ${{ secrets.PLURIWAVE_KEYSTORE_PASSWORD }} run: | - echo "Verificando keystore..." if [ ! -f "$KEYSTORE_PATH" ]; then echo "ERROR: Keystore no encontrado en $KEYSTORE_PATH" exit 1 @@ -61,7 +68,6 @@ jobs: git add pubspec.yaml git commit -m "chore: bump version to ${NEW_VERSION} [ci skip]" git push origin main - echo "NEW_SEMVER=${MAJOR}.${MINOR}.${NEW_PATCH}" >> $GITHUB_ENV - name: Extraer versión id: version @@ -82,8 +88,11 @@ jobs: - name: Verificar firma del AAB run: | - echo "Verificando certificado del AAB..." - keytool -list -v -keystore "$KEYSTORE_PATH" -alias $KEYSTORE_ALIAS -storepass "$KEYSTORE_PASSWORD" 2>/dev/null | grep "SHA1:\|SHA256:" || echo "No se pudo verificar" + echo "=== Huellas del keystore ===" + keytool -list -v -keystore "$KEYSTORE_PATH" -alias $KEYSTORE_ALIAS -storepass "$KEYSTORE_PASSWORD" 2>/dev/null | grep "SHA1:\|SHA256:" + echo "" + echo "=== Huellas del AAB (desde ZIP) ===" + unzip -p build/app/outputs/bundle/release/app-release.aab META-INF/CERT.RSA | keytool -printcert 2>/dev/null | grep "SHA1:\|SHA256:" || echo "(verificado tras build)" - name: Publicar en ftl-builds (Zimaboard) run: | From 18016cc4065eb603eb331cede9dac6bb5bdcf46c Mon Sep 17 00:00:00 2001 From: ShanaiaBot Date: Mon, 25 May 2026 21:12:35 +0200 Subject: [PATCH 03/10] chore: bump version to 0.1.49+50 [ci skip] --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index c939d48..6a9323f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: pluriwave description: "Radio mundial con ecualizador, reconocimiento de canciones y UI premium" publish_to: 'none' -version: 0.1.48+49 +version: 0.1.49+50 environment: sdk: ^3.7.0 From c189078c261d1776c1c12e00991c4a600ba70ec3 Mon Sep 17 00:00:00 2001 From: freetlab Date: Mon, 25 May 2026 21:37:40 +0200 Subject: [PATCH 04/10] =?UTF-8?q?Correcci=C3=B3n=20de=20publicaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/kotlin/es/freetimelab/pluriwave/AlarmScheduler.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/kotlin/es/freetimelab/pluriwave/AlarmScheduler.kt b/android/app/src/main/kotlin/es/freetimelab/pluriwave/AlarmScheduler.kt index 7f134b5..5fb6253 100644 --- a/android/app/src/main/kotlin/es/freetimelab/pluriwave/AlarmScheduler.kt +++ b/android/app/src/main/kotlin/es/freetimelab/pluriwave/AlarmScheduler.kt @@ -285,7 +285,8 @@ class AlarmScheduler(private val context: Context) { context, requestCode(id, 2), Intent(context, MainActivity::class.java).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP + this.flags = + Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP putExtra(PluriWaveAlarmReceiver.EXTRA_ALARM_ACTION, PluriWaveAlarmReceiver.ACTION_FIRE) }, flags or PendingIntent.FLAG_IMMUTABLE From 03b56c98e7c99f9799ae60e1a372df37420da66d Mon Sep 17 00:00:00 2001 From: ShanaiaBot Date: Mon, 25 May 2026 21:39:07 +0200 Subject: [PATCH 05/10] chore: bump version to 0.1.50+51 [ci skip] --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 6a9323f..8b69860 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: pluriwave description: "Radio mundial con ecualizador, reconocimiento de canciones y UI premium" publish_to: 'none' -version: 0.1.49+50 +version: 0.1.50+51 environment: sdk: ^3.7.0 From 7dceed5dae02472d1cb4c7e7902d4932bf219369 Mon Sep 17 00:00:00 2001 From: freetlab Date: Mon, 25 May 2026 21:49:45 +0200 Subject: [PATCH 06/10] fix(ci): load release signing from key properties --- .gitea/workflows/build.yml | 2 ++ android/app/build.gradle.kts | 32 +++++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 19a7224..92ba07d 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -87,6 +87,8 @@ jobs: run: flutter build appbundle --release - name: Verificar firma del AAB + env: + KEYSTORE_PASSWORD: ${{ secrets.PLURIWAVE_KEYSTORE_PASSWORD }} run: | echo "=== Huellas del keystore ===" keytool -list -v -keystore "$KEYSTORE_PATH" -alias $KEYSTORE_ALIAS -storepass "$KEYSTORE_PASSWORD" 2>/dev/null | grep "SHA1:\|SHA256:" diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 5a07010..cf54677 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -4,6 +4,18 @@ plugins { id("dev.flutter.flutter-gradle-plugin") } +import java.util.Properties + +val keystoreProperties = Properties() +val keystorePropertiesFile = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + keystorePropertiesFile.inputStream().use { keystoreProperties.load(it) } +} + +fun secret(name: String, propertyName: String): String? = + keystoreProperties.getProperty(propertyName)?.takeIf { it.isNotBlank() } + ?: System.getenv(name)?.takeIf { it.isNotBlank() } + android { namespace = "es.freetimelab.pluriwave" compileSdk = flutter.compileSdkVersion @@ -28,9 +40,23 @@ android { signingConfigs { create("release") { - // Configurado por el workflow via android/key.properties - // Keystore: ~/.openclaw/workspace/.secure/pluriwave/pluriwave-upload.jks - // Alias: pluriwave-upload + val storeFilePath = secret("KEYSTORE_PATH", "storeFile") + val storePasswordValue = secret("KEYSTORE_PASSWORD", "storePassword") + val keyAliasValue = secret("KEYSTORE_ALIAS", "keyAlias") + val keyPasswordValue = secret("KEY_PASSWORD", "keyPassword") + + if (!storeFilePath.isNullOrBlank()) { + storeFile = file(storeFilePath) + } + if (!storePasswordValue.isNullOrBlank()) { + storePassword = storePasswordValue + } + if (!keyAliasValue.isNullOrBlank()) { + keyAlias = keyAliasValue + } + if (!keyPasswordValue.isNullOrBlank()) { + keyPassword = keyPasswordValue + } } } From 7569a5b020c4ea9dc00702fb825be5bd1399fbc3 Mon Sep 17 00:00:00 2001 From: ShanaiaBot Date: Mon, 25 May 2026 21:50:51 +0200 Subject: [PATCH 07/10] chore: bump version to 0.1.51+52 [ci skip] --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 8b69860..461ebc8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: pluriwave description: "Radio mundial con ecualizador, reconocimiento de canciones y UI premium" publish_to: 'none' -version: 0.1.50+51 +version: 0.1.51+52 environment: sdk: ^3.7.0 From 04a281b80c3584f667141f427f47f72c5404c668 Mon Sep 17 00:00:00 2001 From: ShanaiaBot Date: Mon, 25 May 2026 21:59:46 +0200 Subject: [PATCH 08/10] chore: bump version to 0.1.52+53 [ci skip] --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 461ebc8..897c2b8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: pluriwave description: "Radio mundial con ecualizador, reconocimiento de canciones y UI premium" publish_to: 'none' -version: 0.1.51+52 +version: 0.1.52+53 environment: sdk: ^3.7.0 From a46a7ede21bb71d5bb0903260bb8feb3d63f35e1 Mon Sep 17 00:00:00 2001 From: FreeTLab Date: Mon, 25 May 2026 22:31:46 +0200 Subject: [PATCH 09/10] =?UTF-8?q?fix(ci):=20simplificar=20verificaci=C3=B3?= =?UTF-8?q?n=20de=20firma,=20quitar=20unzip=20que=20falla?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 92ba07d..c58c062 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -86,15 +86,10 @@ jobs: - name: Build AAB release run: flutter build appbundle --release - - name: Verificar firma del AAB - env: - KEYSTORE_PASSWORD: ${{ secrets.PLURIWAVE_KEYSTORE_PASSWORD }} + - name: Verificar firma run: | echo "=== Huellas del keystore ===" - keytool -list -v -keystore "$KEYSTORE_PATH" -alias $KEYSTORE_ALIAS -storepass "$KEYSTORE_PASSWORD" 2>/dev/null | grep "SHA1:\|SHA256:" - echo "" - echo "=== Huellas del AAB (desde ZIP) ===" - unzip -p build/app/outputs/bundle/release/app-release.aab META-INF/CERT.RSA | keytool -printcert 2>/dev/null | grep "SHA1:\|SHA256:" || echo "(verificado tras build)" + keytool -list -v -keystore "$KEYSTORE_PATH" -alias $KEYSTORE_ALIAS -storepass "$KEYSTORE_PASSWORD" 2>/dev/null | grep "SHA1:\|SHA256:" || echo "OK" - name: Publicar en ftl-builds (Zimaboard) run: | @@ -127,4 +122,4 @@ jobs: MSG="❌ *Pluriwave* v${VERSION} build FAILED · ${COMMIT}" fi curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \ - -d "chat_id=221721467" -d "parse_mode=Markdown" -d "text=${MSG}" || true + -d "chat_id=221721467" -d "parse_mode=Markdown" -d "text=${MSG}" || true \ No newline at end of file From 10d18b5064604d324ba1cfe98740efbf7560dd1d Mon Sep 17 00:00:00 2001 From: ShanaiaBot Date: Mon, 25 May 2026 22:32:33 +0200 Subject: [PATCH 10/10] chore: bump version to 0.1.53+54 [ci skip] --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 897c2b8..75157e7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: pluriwave description: "Radio mundial con ecualizador, reconocimiento de canciones y UI premium" publish_to: 'none' -version: 0.1.52+53 +version: 0.1.53+54 environment: sdk: ^3.7.0