Publicar una versión
Esta página es para quien publica una versión de la app: el número, las novedades, la lista de licencias y el paquete firmado de Android. No hace falta para colaborar con código.
Antes de cada versión
Sección titulada «Antes de cada versión»-
El número de versión, en cuatro sitios que tienen que coincidir:
versionenCargo.toml(la sección[workspace.package], de la raíz);versionenapp/package.json;versionenapp/src-tauri/tauri.conf.json;- la clave de esa versión en
app/src/whats-new.json(ver el punto 2).
Si cambia el primer número distinto de cero (de
0.2.xa0.3.0, por ejemplo), cambia también la versión con la que la app pide el dominio,kosmotheka-domain = { version = "…" }enapp/src-tauri/Cargo.toml: con un0.delante, Cargo no da por compatible una0.3con una0.2, y la compilación falla.Los archivos de bloqueo (
Cargo.lock,app/package-lock.json) llevan también la versión: se actualizan al compilar o connpm install. Las versiones deCargo.toml,package.jsonytauri.conf.jsonlas comparanpm run check:whats-new.Cada versión que se sube a Google Play tiene que subir de número: Google rechaza un
versionCoderepetido. Tauri lo calcula a partir deversion(0.1.0→1000). -
Las novedades. Las líneas de lo que cambia para la gente viven en
app/src/whats-new.json, bajo la clavenextmientras la versión no tiene número. Al elegirlo, renombranextpor el número ("0.2.1", por ejemplo). Después,cd app && npm run check:whats-newtiene que pasar: comprueba que la versión de la app tiene su entrada, no que esté completa; léela. -
La lista de licencias, con las versiones exactas.
Ventana de terminal cd appnpm run licenses # necesita Docker y rednpm run check:licenses:exactEn la integración continua la comprobación solo mira los nombres de los paquetes, para que las actualizaciones automáticas de dependencias pasen solas. Antes de publicar, la pantalla «Licencias» tiene que llevar las versiones que se publican. Si
app/src/licenses.jsoncambia, va en el commit de la versión. -
Las comprobaciones de siempre:
cargo fmt --all,cargo clippy --all-targets -- -D warnings,cargo test, y enapp/:npm run typecheck,npm run lintynpm run check:spec(ver Preparar el entorno: la app).
Con el workflow
Sección titulada «Con el workflow».github/workflows/release.yml compila y publica solo la app (D74): el servidor, la web y la documentación se despliegan a mano con deploy/deploy.sh.
- Deja la versión lista (el apartado «Antes de cada versión») y súbela a
main. - Crea y sube la etiqueta, que tiene que ser
vmás la versión detauri.conf.json(por ejemplov0.3.0); si no coincide, el workflow falla antes de compilar. - El workflow hace, en este orden:
- Comprobar la versión: las versiones de los tres archivos y la entrada de
whats-new.json. - Linux (Ubuntu 22.04):
.deb,.rpmy AppImage. Windows: el instalador. Los nombres no llevan versión:Kosmotheka-linux-x86_64.AppImage,Kosmotheka-linux-amd64.deb,Kosmotheka-linux-x86_64.rpm,Kosmotheka-windows-x64-setup.exe. - El release en borrador, con los cuatro archivos, un
SHA256SUMSy, de cuerpo, las líneas en inglés de la versión enwhats-new.json. - Android: compila el
.aab, comprueba que va firmado y lo sube a Google Play como versión en borrador, a la pista que diga la variablePLAY_TRACKdel entornorelease(internalsi no existe;alphaes la prueba cerrada).
- Comprobar la versión: las versiones de los tres archivos y la entrada de
- Revisa y publica el borrador en GitHub (Releases). Hasta entonces nadie lo ve, y los enlaces
…/releases/latest/download/…siguen dando la versión anterior. - En Google Play, abre la pista, revisa la versión en borrador, añade las notas (salen de
whats-new.json) y envíala a revisión.
Para ensayar sin publicar, lanza el workflow a mano (Actions › Release › Run workflow): compila todo y deja los archivos como artefactos del workflow (14 días), pero no crea el release ni sube nada a Google Play. Sin los secretos de Android, el .aab sale sin firmar y el resumen lo dice.
Los secretos y el entorno se preparan una vez, en el repositorio público, y es cosa de quien lo mantiene. Lo que sigue, hecho a mano, vale si el workflow no está disponible.
La clave de subida
Sección titulada «La clave de subida»Google Play usa Play App Signing: la clave que firma la app que se instala en los móviles la genera y la guarda Google. Quien publica solo tiene una clave de subida, que demuestra a Google que el paquete es suyo. Si se pierde o se filtra, Google permite cambiarla (en Play Console, Integridad de la app), pero hay que guardarla bien.
Lo que se sube es un Android App Bundle (.aab), no un APK; Google genera de él el APK de cada móvil.
La clave vive fuera del repositorio. Por defecto, en ~/.kosmotheka-release/:
~/.kosmotheka-release/ upload.jks la clave de subida keystore.properties dónde está y sus contraseñasapp/src-tauri/gen/android/app/build.gradle.kts lee keystore.properties de esa carpeta, o de la ruta que diga la variable de entorno KOSMOTHEKA_KEYSTORE_PROPERTIES. Si el archivo no existe, la compilación de release sale sin firmar. El .gitignore del repositorio ignora *.jks, *.keystore y keystore.properties en cualquier sitio, por si acaso. Nunca los subas.
Crearla (una sola vez)
Sección titulada «Crearla (una sola vez)»En tu propia terminal, y con la contraseña escrita por ti:
mkdir -p ~/.kosmotheka-release && chmod 700 ~/.kosmotheka-releasekeytool -genkeypair -v \ -keystore ~/.kosmotheka-release/upload.jks \ -keyalg RSA -keysize 2048 -validity 10000 -alias uploadPide una contraseña (dos veces) y unos datos (nombre, organización, país). Si al final pregunta otra contraseña para la clave, Intro usa la misma. Después crea ~/.kosmotheka-release/keystore.properties:
storeFile=/ruta/completa/a/upload.jksstorePassword=<la contraseña>keyAlias=uploadkeyPassword=<la contraseña>y protégelo: chmod 600 ~/.kosmotheka-release/*. Guarda la contraseña en un gestor de contraseñas y una copia de upload.jks fuera del ordenador.
Compilar el .aab
Sección titulada «Compilar el .aab»cd appnpm run tauri android build -- --aabCompila para las cuatro arquitecturas y tarda bastante. El resultado queda en:
app/src-tauri/gen/android/app/build/outputs/bundle/universalRelease/app-universal-release.aabComprueba que va firmado con la clave de subida (no pide contraseña):
keytool -printcert -jarfile app/src-tauri/gen/android/app/build/outputs/bundle/universalRelease/app-universal-release.aabDebe mostrar el certificado con los datos que pusiste al crear la clave. Si no hay certificado, el paquete salió sin firmar: falta o está mal keystore.properties.
Para compilar con las herramientas de Android, sigue Preparar el entorno: la app.
Subirlo
Sección titulada «Subirlo»Lo subes tú, a mano, desde la consola de Google Play: en Pruebas eliges la pista, Crear versión, subes el .aab, pones las notas de la versión y publicas. Las notas de Google Play (500 caracteres por idioma como máximo) salen de las líneas de app/src/whats-new.json.
Una cuenta personal nueva de Google Play necesita, antes de producción, una prueba cerrada con al menos 12 personas durante 14 días.
Una cosa que sorprende
Sección titulada «Una cosa que sorprende»La versión de Google Play y un APK de depuración tienen el mismo identificador de aplicación pero distinta firma: Android no deja instalar una encima de la otra. Para pasar del APK de depuración a la de Play hay que desinstalar la primera, y eso borra sus datos. Antes, haz una copia de seguridad (o ten las bibliotecas en otro dispositivo emparejado) y restáurala o empareja de nuevo después.
© 2026 Kosmotheka
Kosmotheka es software libre: la aplicación y el servidor, bajo la AGPL-3.0-or-later; la especificación de operaciones, bajo la MIT. El nombre y el logotipo no entran en la licencia.
kosmotheka.com · Política de marca · Política de privacidad · info@kosmotheka.com