#!/usr/bin/env bash # Подключает release-подпись APK через keystore.properties + Gradle script. set -euo pipefail ANDROID_GEN="${1:-/workspace/tauri_app/src-tauri/gen/android}" SECRETS_DIR="${ANDROID_SECRETS_DIR:-/workspace/tauri_app/.secrets}" KEYSTORE_FILE="${ANDROID_KEYSTORE_FILE:-${SECRETS_DIR}/lendry-id-release.keystore}" APP_GRADLE="${ANDROID_GEN}/app/build.gradle.kts" KEYSTORE_PROPS="${ANDROID_GEN}/keystore.properties" SIGNING_SCRIPT="${ANDROID_GEN}/app/release-signing.gradle.kts" PROPS_TEMPLATE="${SECRETS_DIR}/keystore.properties.template" if [[ ! -d "${ANDROID_GEN}" ]]; then echo "Android project not found: ${ANDROID_GEN}" >&2 exit 1 fi if [[ ! -f "${KEYSTORE_FILE}" ]]; then echo "Keystore не найден: ${KEYSTORE_FILE}. Запустите ensure-android-keystore.sh" >&2 exit 1 fi if [[ -f "${PROPS_TEMPLATE}" ]]; then cp "${PROPS_TEMPLATE}" "${KEYSTORE_PROPS}" else echo "keystore.properties.template не найден в ${SECRETS_DIR}" >&2 exit 1 fi # Абсолютный путь надёжнее относительного при Gradle rootProject.file(). if grep -q '^storeFile=' "${KEYSTORE_PROPS}"; then sed -i "s|^storeFile=.*|storeFile=${KEYSTORE_FILE}|" "${KEYSTORE_PROPS}" else printf '\nstoreFile=%s\n' "${KEYSTORE_FILE}" >> "${KEYSTORE_PROPS}" fi STORE_PASSWORD="$(grep -E '^storePassword=' "${KEYSTORE_PROPS}" | head -n1 | cut -d= -f2- || true)" KEY_ALIAS_PROP="$(grep -E '^keyAlias=' "${KEYSTORE_PROPS}" | head -n1 | cut -d= -f2- || true)" KEY_ALIAS_PROP="${KEY_ALIAS_PROP:-lendry-id}" if [[ -z "${STORE_PASSWORD}" ]]; then echo "storePassword не найден в ${KEYSTORE_PROPS}" >&2 exit 1 fi if ! keytool -list -keystore "${KEYSTORE_FILE}" -storepass "${STORE_PASSWORD}" -alias "${KEY_ALIAS_PROP}" >/dev/null 2>&1; then echo "Keystore не читается с паролями из ${KEYSTORE_PROPS}." >&2 echo "Удалите tauri_app/.secrets и пересоберите APK, либо задайте ANDROID_KEYSTORE_FORCE_REGENERATE=1." >&2 exit 1 fi chmod 600 "${KEYSTORE_PROPS}" || true cat > "${SIGNING_SCRIPT}" <<'EOF' import com.android.build.api.dsl.ApplicationExtension import java.io.File import java.util.Properties val keystoreProperties = Properties().apply { rootProject.file("keystore.properties").inputStream().use { load(it) } } extensions.configure("android") { signingConfigs { create("release") { val storePasswordValue = keystoreProperties.getProperty("storePassword") keyAlias = keystoreProperties.getProperty("keyAlias") keyPassword = keystoreProperties.getProperty("keyPassword") storeFile = File(keystoreProperties.getProperty("storeFile")) storePassword = storePasswordValue } } buildTypes { getByName("release") { signingConfig = signingConfigs.getByName("release") } } } EOF if ! grep -q 'release-signing.gradle.kts' "${APP_GRADLE}"; then printf '\napply(from = "release-signing.gradle.kts")\n' >> "${APP_GRADLE}" fi echo "==> Android release signing patched (${KEYSTORE_PROPS})"