flotilla/scripts/release/lib/android.mjs

39 lines
1.4 KiB
JavaScript

import {existsSync} from "node:fs"
import {readFile} from "node:fs/promises"
import {dirname, join, resolve} from "node:path"
import {apk, root, version} from "./context.mjs"
import {run} from "./shell.mjs"
export const keystoreEnv = prefix => ({
ANDROID_KEYSTORE_PATH: resolve(root, process.env[`${prefix}_KEYSTORE_PATH`]),
ANDROID_KEYSTORE_PASSWORD: process.env[`${prefix}_KEYSTORE_PASSWORD`],
ANDROID_KEYSTORE_ALIAS: process.env[`${prefix}_KEYSTORE_ALIAS`],
ANDROID_KEYSTORE_ALIAS_PASSWORD:
process.env[`${prefix}_KEYSTORE_ALIAS_PASSWORD`] ?? process.env[`${prefix}_KEYSTORE_PASSWORD`],
})
// A fresh jvm per build, so a reused daemon can't hand one gradle run the other's signing key
export const gradle = (task, signing) =>
run("./gradlew", ["--no-daemon", task], {
cwd: join(root, "android"),
env: {...process.env, ...signing},
})
// Gradle records what it actually built beside the apk, the only version stamp on an artifact
// whose filename never changes
export const apkMetadata = async () => {
const path = join(dirname(apk), "output-metadata.json")
if (!existsSync(path)) {
throw new Error(`${path} is missing; run pnpm release:local apk`)
}
const {elements} = JSON.parse(await readFile(path, "utf-8"))
const [element] = elements
if (element.versionName !== version) {
throw new Error(`the last android build was ${element.versionName}, not ${version}`)
}
return element
}