android: release --public, version de package.json y libnode comprimida
Lo del 10 de octubre que sigue valiendo sobre la base 1.3.3: - con un tag v* el workflow publica la APK; a mano sigue en borrador - el workflow trae el APK oficial de la misma version: de ahi salen node_modules y libnode.so (prepare.sh ya lo usaba, pero el runner no lo tenia) - versionName sale de package.json en vez de ir escrito a mano - libnode.so comprimida, como en la oficial (unos 35 MB menos por descarga) - release.sh: JAVA_HOME en el PATH, no deja salir una release debuggable, exige CHANGE_WIFI_MULTICAST_STATE y avisa si la APK pasa de 80 MB Se queda fuera la poda de prepare.sh y la sha256 de la APK 1.2.5: ahora el node_modules viene ya podado del APK oficial.
This commit is contained in:
parent
99e5d766e9
commit
b3172ed1c3
3 changed files with 58 additions and 14 deletions
|
|
@ -1,4 +1,8 @@
|
||||||
# Construye la APK y la deja publicada como borrador en las releases.
|
# Construye la APK y la publica en las releases.
|
||||||
|
#
|
||||||
|
# Con un tag v* se publica directamente: crear el tag ya es la decision de sacar
|
||||||
|
# version, y es la que enlaza el README (releases/latest). Lanzada a mano desde
|
||||||
|
# la interfaz se queda en borrador, para revisarla antes.
|
||||||
#
|
#
|
||||||
# NO se dispara sola con cada commit: la APK son mas de 100 MB y el backend tarda
|
# NO se dispara sola con cada commit: la APK son mas de 100 MB y el backend tarda
|
||||||
# en empaquetarse. Se lanza a mano desde la interfaz de gitea, o al crear un tag.
|
# en empaquetarse. Se lanza a mano desde la interfaz de gitea, o al crear un tag.
|
||||||
|
|
@ -29,6 +33,13 @@ jobs:
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0 # release.sh cuenta commits para el versionCode
|
fetch-depth: 0 # release.sh cuenta commits para el versionCode
|
||||||
|
|
||||||
|
- name: Traer el APK oficial de la misma version (node_modules y libnode.so)
|
||||||
|
run: |
|
||||||
|
v=$(node -p "require('./src/server/package.json').version")
|
||||||
|
curl -sfL -o /tmp/oasis-base.apk \
|
||||||
|
"https://github.com/epsylon/oasis/releases/download/oasis-android-v$v/oasis-v$v.apk"
|
||||||
|
echo "OASIS_APK_BASE=/tmp/oasis-base.apk" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
- name: Restaurar el almacen de claves
|
- name: Restaurar el almacen de claves
|
||||||
run: |
|
run: |
|
||||||
echo "${{ secrets.OASIS_KEYSTORE_B64 }}" | base64 -d > /tmp/oasis.jks
|
echo "${{ secrets.OASIS_KEYSTORE_B64 }}" | base64 -d > /tmp/oasis.jks
|
||||||
|
|
@ -46,8 +57,12 @@ jobs:
|
||||||
OASIS_GITEA_REPO: ${{ github.repository }}
|
OASIS_GITEA_REPO: ${{ github.repository }}
|
||||||
run: |
|
run: |
|
||||||
cd android
|
cd android
|
||||||
|
if [ "${{ github.ref_type }}" = "tag" ]; then
|
||||||
|
./scripts/release.sh --release --publish --public
|
||||||
|
else
|
||||||
./scripts/release.sh --release --publish
|
./scripts/release.sh --release --publish
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Borrar el almacen de claves
|
- name: Borrar el almacen de claves
|
||||||
if: always()
|
if: always()
|
||||||
run: rm -f /tmp/oasis.jks
|
run: rm -f /tmp/oasis.jks /tmp/oasis-base.apk
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,12 @@ android {
|
||||||
applicationId = "net.laenre.oasis"
|
applicationId = "net.laenre.oasis"
|
||||||
minSdk = 24
|
minSdk = 24
|
||||||
targetSdk = 35
|
targetSdk = 35
|
||||||
// el pipeline los pasa por entorno; a mano valen los de aqui
|
// release.sh los pasa por entorno; a mano, el nombre sale de package.json (como
|
||||||
|
// en el backend) para que la APK no diga ser otra version que la que lleva dentro
|
||||||
|
val pkgVersion = Regex("\"version\"\\s*:\\s*\"([^\"]+)\"")
|
||||||
|
.find(rootProject.file("../package.json").readText())?.groupValues?.get(1) ?: "0.0.0"
|
||||||
versionCode = (System.getenv("OASIS_VERSION_CODE") ?: "1").toInt()
|
versionCode = (System.getenv("OASIS_VERSION_CODE") ?: "1").toInt()
|
||||||
versionName = System.getenv("OASIS_VERSION_NAME") ?: "1.3.3"
|
versionName = System.getenv("OASIS_VERSION_NAME") ?: pkgVersion
|
||||||
ndk { abiFilters += listOf("arm64-v8a") }
|
ndk { abiFilters += listOf("arm64-v8a") }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -43,8 +46,10 @@ android {
|
||||||
|
|
||||||
packaging {
|
packaging {
|
||||||
jniLibs {
|
jniLibs {
|
||||||
// libnode.so son 49 MB: sin comprimir se carga por mmap y arranca mas rapido
|
// Comprimidas, como en la APK oficial: libnode.so pasa de 50 a 16 MB en la
|
||||||
useLegacyPackaging = false
|
// descarga. Sin comprimir (false) se cargaria por mmap desde la APK, pero eso
|
||||||
|
// solo ahorra unos milisegundos al arrancar y cuesta 35 MB a cada descarga.
|
||||||
|
useLegacyPackaging = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,8 @@
|
||||||
# Uso:
|
# Uso:
|
||||||
# ./scripts/release.sh # compila debug y verifica
|
# ./scripts/release.sh # compila debug y verifica
|
||||||
# ./scripts/release.sh --release # compila release firmada
|
# ./scripts/release.sh --release # compila release firmada
|
||||||
# ./scripts/release.sh --release --publish
|
# ./scripts/release.sh --release --publish # borrador, para revisarla
|
||||||
|
# ./scripts/release.sh --release --publish --public # publicada: la descarga del README
|
||||||
#
|
#
|
||||||
# Variables:
|
# Variables:
|
||||||
# OASIS_KEYSTORE, OASIS_KEYSTORE_PASS, OASIS_KEY_ALIAS firma (obligatorias con --release)
|
# OASIS_KEYSTORE, OASIS_KEYSTORE_PASS, OASIS_KEY_ALIAS firma (obligatorias con --release)
|
||||||
|
|
@ -26,10 +27,12 @@ cd "$HERE"
|
||||||
|
|
||||||
MODE=debug
|
MODE=debug
|
||||||
PUBLISH=0
|
PUBLISH=0
|
||||||
|
PUBLIC=0
|
||||||
for arg in "$@"; do
|
for arg in "$@"; do
|
||||||
case "$arg" in
|
case "$arg" in
|
||||||
--release) MODE=release ;;
|
--release) MODE=release ;;
|
||||||
--publish) PUBLISH=1 ;;
|
--publish) PUBLISH=1 ;;
|
||||||
|
--public) PUBLIC=1 ;;
|
||||||
*) echo "opcion desconocida: $arg"; exit 2 ;;
|
*) echo "opcion desconocida: $arg"; exit 2 ;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
@ -55,6 +58,9 @@ say "version ${VERSION_NAME} (codigo ${VERSION_CODE}), modo ${MODE}"
|
||||||
# --- 2) comprobaciones previas ---------------------------------------------
|
# --- 2) comprobaciones previas ---------------------------------------------
|
||||||
[ -n "${JAVA_HOME:-}" ] || die "define JAVA_HOME apuntando a un JDK con compilador"
|
[ -n "${JAVA_HOME:-}" ] || die "define JAVA_HOME apuntando a un JDK con compilador"
|
||||||
[ -x "${JAVA_HOME}/bin/javac" ] || die "en ${JAVA_HOME} no hay javac: es un runtime, no un JDK"
|
[ -x "${JAVA_HOME}/bin/javac" ] || die "en ${JAVA_HOME} no hay javac: es un runtime, no un JDK"
|
||||||
|
# apksigner y aapt2 son scripts que llaman a "java" a pelo: sin esto fallaban con
|
||||||
|
# "java: no encontrado" y parecia que la APK estaba mal firmada
|
||||||
|
export PATH="$JAVA_HOME/bin:$PATH"
|
||||||
[ -d "$SDK" ] || die "no encuentro el SDK de Android en $SDK (define ANDROID_HOME)"
|
[ -d "$SDK" ] || die "no encuentro el SDK de Android en $SDK (define ANDROID_HOME)"
|
||||||
|
|
||||||
if [ "$MODE" = release ]; then
|
if [ "$MODE" = release ]; then
|
||||||
|
|
@ -112,10 +118,21 @@ grep -q "assets/nodejs-project.zip" "$LISTING" || die "la APK no lleva el backen
|
||||||
grep -q "android.permission.CAMERA" "$PERMS" || die "la APK no declara CAMERA: no podria hacer videollamadas"
|
grep -q "android.permission.CAMERA" "$PERMS" || die "la APK no declara CAMERA: no podria hacer videollamadas"
|
||||||
grep -q "android.permission.RECORD_AUDIO" "$PERMS" || die "la APK no declara RECORD_AUDIO"
|
grep -q "android.permission.RECORD_AUDIO" "$PERMS" || die "la APK no declara RECORD_AUDIO"
|
||||||
grep -q "libnode.so" "$LISTING" || die "la APK no lleva el runtime de node"
|
grep -q "libnode.so" "$LISTING" || die "la APK no lleva el runtime de node"
|
||||||
|
grep -q "CHANGE_WIFI_MULTICAST_STATE" "$PERMS" || die "la APK no declara CHANGE_WIFI_MULTICAST_STATE: no veria otros moviles en la misma wifi"
|
||||||
|
|
||||||
|
# Una APK debuggable deja leer por adb los datos de la app, clave secreta incluida.
|
||||||
|
if "$BT/aapt2" dump badging "$APK" 2>/dev/null | grep -q "application-debuggable"; then
|
||||||
|
[ "$MODE" = release ] && die "la APK release ha salido debuggable"
|
||||||
|
say "OJO: APK de depuracion (debuggable). Solo para probar en tu movil, no la repartas"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# La oficial pesa ~54 MB; si esta se dispara es que prepare.sh ha dejado de adelgazar
|
||||||
|
APK_MB=$(( $(stat -c%s "$APK") / 1024 / 1024 ))
|
||||||
|
[ "$APK_MB" -le 80 ] || say "OJO: la APK son ${APK_MB} MB (la oficial ~54): revisa que mete prepare.sh"
|
||||||
|
|
||||||
if [ "$MODE" = release ]; then
|
if [ "$MODE" = release ]; then
|
||||||
"$BT/apksigner" verify --print-certs "$APK" > /tmp/oasis-signer.txt 2>&1 \
|
"$BT/apksigner" verify --print-certs "$APK" > /tmp/oasis-signer.txt 2>&1 \
|
||||||
|| die "la APK no esta firmada correctamente"
|
|| { cat /tmp/oasis-signer.txt >&2; die "la APK no esta firmada correctamente"; }
|
||||||
FINGERPRINT=$(grep -m1 "SHA-256 digest" /tmp/oasis-signer.txt | awk '{print $NF}')
|
FINGERPRINT=$(grep -m1 "SHA-256 digest" /tmp/oasis-signer.txt | awk '{print $NF}')
|
||||||
say "huella del certificado: $FINGERPRINT"
|
say "huella del certificado: $FINGERPRINT"
|
||||||
fi
|
fi
|
||||||
|
|
@ -139,13 +156,20 @@ NOTES=$(printf 'Rama experimental del hacklab sobre el Oasis de epsylon.\n\nNO e
|
||||||
RELEASE_ID=$(curl -sf -X POST "$API/releases" -H "$AUTH" -H "Content-Type: application/json" \
|
RELEASE_ID=$(curl -sf -X POST "$API/releases" -H "$AUTH" -H "Content-Type: application/json" \
|
||||||
-d "$(node -e '
|
-d "$(node -e '
|
||||||
const [tag, name, body] = process.argv.slice(1);
|
const [tag, name, body] = process.argv.slice(1);
|
||||||
process.stdout.write(JSON.stringify({ tag_name: tag, name, body, draft: true, prerelease: true }));
|
const pub = process.argv[4] === "1";
|
||||||
' "$TAG" "Oasis Mobile $TAG" "$NOTES")" | node -pe 'JSON.parse(require("fs").readFileSync(0)).id' 2>/dev/null) \
|
process.stdout.write(JSON.stringify({ tag_name: tag, name, body, draft: !pub, prerelease: !pub }));
|
||||||
|
' "$TAG" "Oasis Mobile $TAG" "$NOTES" "$PUBLIC")" | node -pe 'JSON.parse(require("fs").readFileSync(0)).id' 2>/dev/null) \
|
||||||
|| die "no se ha podido crear la release (token sin permiso, o el tag ya existe)"
|
|| die "no se ha podido crear la release (token sin permiso, o el tag ya existe)"
|
||||||
|
|
||||||
curl -sf -X POST "$API/releases/$RELEASE_ID/assets?name=oasis-$TAG.apk" \
|
# Siempre con el mismo nombre: el README enlaza a releases/download/latest/oasis-mobile.apk,
|
||||||
|
# y la version ya va en el tag y en el titulo de la release.
|
||||||
|
curl -sf -X POST "$API/releases/$RELEASE_ID/assets?name=oasis-mobile.apk" \
|
||||||
-H "$AUTH" -F "attachment=@$APK" >/dev/null \
|
-H "$AUTH" -F "attachment=@$APK" >/dev/null \
|
||||||
|| die "la release se ha creado pero no se ha podido subir la APK"
|
|| die "la release se ha creado pero no se ha podido subir la APK"
|
||||||
|
|
||||||
|
if [ "$PUBLIC" = 1 ]; then
|
||||||
|
say "publicada: $GITEA_URL/$GITEA_REPO/releases/latest"
|
||||||
|
else
|
||||||
say "publicada como borrador: $GITEA_URL/$GITEA_REPO/releases"
|
say "publicada como borrador: $GITEA_URL/$GITEA_REPO/releases"
|
||||||
say "revisala y quita el borrador a mano; no se publica sola a proposito"
|
say "revisala y quita el borrador a mano (o usa --public); no se publica sola a proposito"
|
||||||
|
fi
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue