40 lines
1.4 KiB
JavaScript
40 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
|
||
|
|
}
|