tutanota/android.js

164 lines
5 KiB
JavaScript
Raw Normal View History

/**
* Build script for android app.
*
* Besides options below this script may require signing parameters passed as environment variables:
* 'APK_SIGN_ALIAS'
* 'APK_SIGN_STORE_PASS'
* 'APK_SIGN_KEY_PASS'
* 'APK_SIGN_STORE'
* 'ANDROID_HOME'
*/
import { Argument, Option, program } from "commander"
import { runDevBuild } from "./buildSrc/DevBuild.js"
import { prepareMobileBuild } from "./buildSrc/prepareMobileBuild.js"
import { buildWebapp } from "./buildSrc/buildWebapp.js"
import { getTutanotaAppVersion, measure } from "./buildSrc/buildUtils.js"
import path from "node:path"
import { $, cd } from "zx"
2021-01-29 10:38:21 +01:00
const log = (...messages) => console.log(chalk.green("\nBUILD:"), ...messages, "\n")
2022-04-28 14:36:24 +02:00
await program
2022-12-27 15:37:40 +01:00
.usage("[options] [test|prod|local|host <url>] ")
.addArgument(new Argument("stage").choices(["test", "prod", "local", "host"]).default("prod").argOptional())
2022-04-28 14:36:24 +02:00
.addArgument(new Argument("host").argOptional())
.addOption(new Option("-a, --app <type>", "app to build").choices(["mail", "calendar"]).default("mail"))
2022-12-27 15:37:40 +01:00
.addOption(new Option("-b, --buildtype <type>", "gradle build type").choices(["debugDist", "debug", "release", "releaseTest"]).default("release"))
.addOption(new Option("-i, --install", "call adb install after build"))
.addOption(new Option("-w --webclient <client>", "choose web client build").choices(["make", "dist"]).default("dist"))
.option("-e, --existing", "Use existing prebuilt web client files")
.action(async (stage, host, { webclient, buildtype, install, existing, app }) => {
2022-12-27 15:37:40 +01:00
if ((stage === "host" && host == null) || (stage !== "host" && host != null)) {
2022-04-28 14:36:24 +02:00
program.outputHelp()
process.exit(1)
}
const apk = await buildAndroid({
2022-12-27 15:37:40 +01:00
stage: stage ?? "prod",
host: host,
webClient: webclient,
existing,
buildType: buildtype,
app,
})
if (install) {
await $`adb install ${apk}`
// would be cool, but needs to figure out the correct app to start:
// await $`adb shell am start -n de.tutao.tutanota/de.tutao.tutanota.MainActivity`
}
})
2022-04-28 14:36:24 +02:00
.parseAsync(process.argv)
2019-02-01 11:42:51 +01:00
async function buildCalendarBundle({ buildType }) {
const { version } = JSON.parse(await $`cat package.json`.quiet())
const bundleName = `calendar-tutao-${buildType}-${version}.aab`
const bundlePath = `app-android/calendar/build/outputs/bundle/tutao${buildType.charAt(0).toUpperCase() + buildType.slice(1)}/${bundleName}`
const outPath = `./build-calendar-app/app-android/${bundleName}`
cd("./app-android")
await $`./gradlew :calendar:bundleTutao${buildType}`
cd("..")
await $`mkdir -p build-calendar-app/app-android`
await $`mv ${bundlePath} ${outPath}`
log(`Build complete. The AAB is located at: ${outPath}`)
return outPath
}
2024-09-30 14:18:59 +02:00
async function buildCalendarApk({ buildType }) {
const { version } = JSON.parse(await $`cat package.json`.quiet())
2024-10-09 15:06:12 +02:00
const bundleName = `calendar-tutao-${buildType}-${version}`
2024-09-30 14:18:59 +02:00
const bundlePath = `app-android/calendar/build/outputs/apk/tutao/${buildType}/${bundleName}`
const outPath = `./build-calendar-app/app-android/${bundleName}`
cd("./app-android")
2024-10-09 15:06:12 +02:00
await $`if [ -f .${outPath}.aab ]; then mkdir ../temp; mv .${outPath}.aab ../temp/${bundleName}.aab; fi`
2024-09-30 14:18:59 +02:00
await $`./gradlew :calendar:assembleTutao${buildType}`
cd("..")
await $`mkdir -p build-calendar-app/app-android`
2024-10-09 15:06:12 +02:00
await $`mv ${bundlePath}.apk ${outPath}.apk`
await $`if [ -f ./temp/${bundleName}.aab ]; then mv ./temp/${bundleName}.aab ${outPath}.aab; rm -d ./temp; fi`
2024-09-30 14:18:59 +02:00
log(`Build complete. The APK is located at: ${outPath}`)
return outPath
}
async function buildMailApk({ buildType }) {
const { version } = JSON.parse(await $`cat package.json`.quiet())
const apkName = `tutanota-app-tutao-${buildType}-${version}.apk`
const apkPath = `app-android/app/build/outputs/apk/tutao/${buildType}/${apkName}`
const outPath = `./build/app-android/${apkName}`
cd("./app-android")
await $`./gradlew :app:assembleTutao${buildType}`
cd("..")
await $`mkdir -p build/app-android`
await $`mv ${apkPath} ${outPath}`
log(`Build complete. The APK is located at: ${outPath}`)
return outPath
}
async function buildAndroid({ stage, host, buildType, existing, webClient, app }) {
2022-04-28 14:36:24 +02:00
log(`Starting ${stage} build with build type: ${buildType}, webclient: ${webClient}, host: ${host}`)
if (!existing) {
if (webClient === "make") {
await runDevBuild({
stage,
host,
desktop: false,
clean: false,
watch: false,
2022-12-27 15:37:40 +01:00
serve: false,
networkDebugging: false,
app,
})
} else {
const version = await getTutanotaAppVersion()
2022-12-27 15:37:40 +01:00
await buildWebapp({
version,
stage,
host,
minify: true,
projectDir: path.resolve("."),
measure,
app,
2022-12-27 15:37:40 +01:00
})
}
} else {
console.log("skipped webapp build")
}
2018-12-11 14:55:06 +01:00
await prepareMobileBuild(webClient, app)
2024-07-30 10:57:18 +02:00
const buildDir = app === "mail" ? "build" : "build-calendar-app"
try {
2024-07-30 10:57:18 +02:00
await $`rm -r ${buildDir}/app-android`
} catch (e) {
// Ignoring the error if the folder is not there
2018-12-11 14:55:06 +01:00
}
if (app === "mail") {
return await buildMailApk({ buildType })
} else {
2024-09-30 14:18:59 +02:00
await buildCalendarBundle({ buildType })
return await buildCalendarApk({ buildType })
}
2022-12-27 15:37:40 +01:00
}