Skip to content

patch: se reparan las capturas de Android en el runner de Ubuntu - #148

Merged
Im-Fran merged 2 commits into
devfrom
claude/android-screenshot-keystore-j43jpm
Aug 13, 2026
Merged

patch: se reparan las capturas de Android en el runner de Ubuntu#148
Im-Fran merged 2 commits into
devfrom
claude/android-screenshot-keystore-j43jpm

Conversation

@Im-Fran

@Im-Fran Im-Fran commented Aug 13, 2026

Copy link
Copy Markdown
Member

El job screenshots-android no estaba generando ninguna captura. Había dos fallas, no una: la segunda venía justo detrás y habría reventado el job igual unos minutos después.

1. El keystore de debug

flutter drive moría en el build:

Execution failed for task ':app:validateSigningDevelopmentDebug'.
> Keystore file '/home/runner/.android/debug.keystore' not found for signing config 'debug'.

El bloque debug de signingConfigs le fijaba el storeFile a mano. Con eso AGP deja de tratarlo como su keystore de debug —el que crea solo la primera vez que lo necesita— y pasa a exigir un archivo ya existente. En una máquina limpia, y los runners lo son, ese archivo no está. No faltaba un paso en el workflow: Gradle lo habría creado si no le hubiéramos puesto la ruta encima.

Ahora el bloque sólo se toca cuando hay un keystore propio que usar, así que firmar el debug con la llave de release sigue igual y el resto cae en el config por defecto. De paso queda arreglado flutter run en una máquina que nunca abrió Android Studio, que fallaba con el mismo error.

2. Falta convert para frameit

El job recién se mudó a Ubuntu en #146, así que los pasos de post-proceso nunca habían corrido en Linux. scripts/compose-store-screenshots moría en silencio: el chequeo de dependencias de frameit busca convert (el binario de ImageMagick 6) y el paso de ImageMagick sólo enlaza magick. En macOS no se nota porque brew deja los dos en el PATH.

Se enlaza también convert, y la verificación pasa a hacerse por la ruta enlazada, que es la que ven los pasos siguientes.

Ese error además era invisible: la salida de frameit se mandaba a /dev/null y set -e cortaba el script sin decir nada. Ahora se guarda y se muestra cuando el marco no aparece.

Cómo se probó

Los pasos del workflow se corrieron en una VM Linux con el mismo toolchain (Flutter 3.44.9, JDK 17, AGP 8.12 / Gradle 9.5.1), partiendo por reproducir el error original tal cual.

Firma, con el APK compilado en cada caso:

Caso Resultado
MIUTEM_USE_DEBUG_SIGNING=true, sin keystore (lane de capturas) AGP crea ~/.android/debug.keystore; APK firmado con CN=Android Debug, O=Android, C=US
Sin variables (máquina limpia, flutter run) Igual; antes también fallaba acá
Con keystore de release, build debug Firma con esa llave, comportamiento previo intacto
Con keystore de release, build release Sin cambios

El APK completo se compiló con el mismo target que usa flutter drive (integration_test/screenshots_test.dart, flavor development): ✓ Built app-development-debug.apk, package cl.inndev.miutem.dev.

Post-proceso, con capturas sintéticas de 1080x2160 en es-419: generate-screenshot-backgrounds y frame_screenshots corren bien, y compose-store-screenshots deja las 8 capturas enmarcadas —incluidas la 01 y 02, que se componen aparte— con las tildes bien renderizadas bajo LANG=C.UTF-8. También se probó el camino de error escondiendo convert: ahora sí explica por qué se cayó.

Queda sin probar el recorrido dentro del emulador, porque la VM no tiene KVM. Se verificó todo lo anterior (build y firma) y todo lo posterior (fondos, frameit, composición).


Generated by Claude Code

El lane `android screenshots` moría en `flutter drive` con "Keystore file
'~/.android/debug.keystore' not found for signing config 'debug'": el bloque
`debug` de signingConfigs le fijaba el `storeFile` a mano, y con eso AGP deja de
tratarlo como su keystore de debug (que crea solo la primera vez que lo necesita)
y pasa a exigir un archivo ya existente. En una máquina limpia —los runners de CI
lo son— ese archivo no está. Ahora el bloque sólo se toca cuando hay un keystore
propio que usar, así que firmar el debug con la llave de release sigue igual y el
resto cae en el config por defecto.

Detrás venía un segundo tropiezo, ya en el post-proceso: el paso de ImageMagick
enlaza únicamente `magick`, pero el chequeo de dependencias de frameit busca
`convert` (el binario de ImageMagick 6), así que el `fastlane frameit` que usa
scripts/compose-store-screenshots para pedir prestado el marco del teléfono se
negaba a partir. En macOS no se notaba porque brew deja los dos en el PATH.

De paso, ese error era invisible: la salida de frameit se mandaba a /dev/null y
`set -e` cortaba el script sin decir nada. Ahora se guarda y se muestra cuando el
marco no aparece.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MrzSFvPqQ6gMjYFB1dNQAK
@Im-Fran
Im-Fran marked this pull request as ready for review August 13, 2026 03:12
@Im-Fran
Im-Fran enabled auto-merge (squash) August 13, 2026 03:12
@Im-Fran
Im-Fran merged commit c563ac0 into dev Aug 13, 2026
2 checks passed
@Im-Fran
Im-Fran deleted the claude/android-screenshot-keystore-j43jpm branch August 13, 2026 03:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants