mirror of
https://github.com/tutao/tutanota.git
synced 2025-12-08 06:09:50 +00:00
This commit not only sets up the build for windows on jenkins, it also consolidates how we get prebuilt binaries for native modules i.e. keytar and better-sqlite3 and generally has some refactorings
158 lines
5.2 KiB
JavaScript
158 lines
5.2 KiB
JavaScript
/**
|
|
* Script to build desktop release versions of the app.
|
|
*/
|
|
import options from "commander"
|
|
import * as env from "./buildSrc/env.js"
|
|
import os from "os"
|
|
import {buildWebapp} from "./buildSrc/buildWebapp.js"
|
|
import {getCanonicalPlatformName, getTutanotaAppVersion, measure} from "./buildSrc/buildUtils.js"
|
|
import {dirname} from "path"
|
|
import {fileURLToPath} from "url"
|
|
import {createHtml} from "./buildSrc/createHtml.js"
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
|
|
options
|
|
.usage('[options] [test|prod|local|release|host <url>], "release" is default')
|
|
.description('Main build tool for distributable tutanota desktop artifacts.')
|
|
.arguments('[stage] [host]')
|
|
.option('-e, --existing', 'Use existing prebuilt Webapp files in /build/dist/')
|
|
.option('-p, --platform <platform>', "For which platform to build: linux|win|mac", process.platform)
|
|
.option('-c,--custom-desktop-release', "use if manually building desktop client from source. doesn't install auto updates, but may still notify about new releases.")
|
|
.option('-d,--disable-minify', "disable minification", false)
|
|
.option('-u,--unpacked', "don't pack the app into an installer")
|
|
.option('-o,--out-dir <outDir>', "where to copy the client",)
|
|
.action(async (stage, host, opts) => {
|
|
if (!["test", "prod", "local", "host", "release", undefined].includes(stage)
|
|
|| (stage !== "host" && host)
|
|
|| (stage === "host" && !host)) {
|
|
opts.outputHelp()
|
|
process.exit(1)
|
|
}
|
|
opts.stage = stage ?? "release"
|
|
opts.host = host
|
|
|
|
if (opts.customDesktopRelease) {
|
|
console.log(`Custom desktop release - setting platform to ${process.platform}`)
|
|
opts.platform = process.platform
|
|
}
|
|
|
|
opts.platform = getCanonicalPlatformName(opts.platform)
|
|
|
|
await doBuild(opts)
|
|
})
|
|
.parseAsync(process.argv)
|
|
|
|
async function doBuild(opts) {
|
|
try {
|
|
measure()
|
|
const version = getTutanotaAppVersion()
|
|
|
|
if (opts.existing) {
|
|
console.log("Found existing option (-e). Skipping Webapp build.")
|
|
} else {
|
|
if (opts.disableMinify) {
|
|
console.warn("Minification is disabled")
|
|
}
|
|
await buildWebapp(
|
|
{
|
|
version,
|
|
stage: opts.stage,
|
|
host: opts.host,
|
|
measure,
|
|
minify: !opts.disableMinify,
|
|
projectDir: __dirname
|
|
})
|
|
}
|
|
|
|
await buildDesktopClient(version, opts)
|
|
|
|
const now = new Date(Date.now()).toTimeString().substr(0, 5)
|
|
console.log(`\nBuild time: ${measure()}s (${now})`)
|
|
} catch (e) {
|
|
console.error("\nBuild error:", e)
|
|
process.exit(1)
|
|
}
|
|
}
|
|
|
|
async function buildDesktopClient(
|
|
version,
|
|
{
|
|
stage,
|
|
host,
|
|
platform,
|
|
customDesktopRelease,
|
|
unpacked,
|
|
outDir
|
|
}
|
|
) {
|
|
const {buildDesktop} = await import("./buildSrc/DesktopBuilder.js")
|
|
const desktopBaseOpts = {
|
|
dirname: __dirname,
|
|
version,
|
|
platform: platform,
|
|
updateUrl: customDesktopRelease
|
|
? ""
|
|
: "https://mail.tutanota.com/desktop",
|
|
nameSuffix: "",
|
|
notarize: !customDesktopRelease,
|
|
outDir: outDir,
|
|
unpacked: unpacked
|
|
}
|
|
|
|
if (stage === "release") {
|
|
await createHtml(env.create({staticUrl: "https://mail.tutanota.com", version, mode: "Desktop", dist: true}))
|
|
await buildDesktop(desktopBaseOpts)
|
|
if (!customDesktopRelease) { // don't build the test version for manual/custom builds
|
|
const desktopTestOpts = Object.assign({}, desktopBaseOpts, {
|
|
updateUrl: "https://test.tutanota.com/desktop",
|
|
nameSuffix: "-test",
|
|
// Do not notarize test build
|
|
notarize: false
|
|
})
|
|
await createHtml(env.create({staticUrl: "https://test.tutanota.com", version, mode: "Desktop", dist: true}))
|
|
await buildDesktop(desktopTestOpts)
|
|
}
|
|
} else if (stage === "local") {
|
|
// this is the only way to contact the local server from localhost, a VM and
|
|
// from other machines in the LAN with the same url.
|
|
const addr = Object
|
|
.values(os.networkInterfaces())
|
|
.map(net => net.find(a => a.family === "IPv4"))
|
|
.filter(Boolean)
|
|
.filter(net => !net.internal && net.address.startsWith('192.168.'))[0].address
|
|
const desktopLocalOpts = Object.assign({}, desktopBaseOpts, {
|
|
version,
|
|
updateUrl: `http://${addr}:9000/client/build/desktop-snapshot`,
|
|
nameSuffix: "-snapshot",
|
|
notarize: false
|
|
})
|
|
await createHtml(env.create({staticUrl: `http://${addr}:9000`, version, mode: "Desktop", dist: true}))
|
|
await buildDesktop(desktopLocalOpts)
|
|
} else if (stage === "test") {
|
|
const desktopTestOpts = Object.assign({}, desktopBaseOpts, {
|
|
updateUrl: "https://test.tutanota.com/desktop",
|
|
nameSuffix: "-test",
|
|
notarize: false
|
|
})
|
|
await createHtml(env.create({staticUrl: "https://test.tutanota.com", version, mode: "Desktop", dist: true}))
|
|
await buildDesktop(desktopTestOpts)
|
|
} else if (stage === "prod") {
|
|
const desktopProdOpts = Object.assign({}, desktopBaseOpts, {
|
|
version,
|
|
updateUrl: "http://localhost:9000/desktop",
|
|
notarize: false
|
|
})
|
|
await createHtml(env.create({staticUrl: "https://mail.tutanota.com", version, mode: "Desktop", dist: true}))
|
|
await buildDesktop(desktopProdOpts)
|
|
} else { // stage = host
|
|
const desktopHostOpts = Object.assign({}, desktopBaseOpts, {
|
|
version,
|
|
updateUrl: `${host}/client/build/desktop-snapshot`,
|
|
nameSuffix: "-snapshot",
|
|
notarize: false
|
|
})
|
|
await createHtml(env.create({staticUrl: host, version, mode: "Desktop", dist: true}))
|
|
await buildDesktop(desktopHostOpts)
|
|
}
|
|
}
|