Updates
This commit is contained in:
@@ -0,0 +1,180 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* Orchestrate peardata binary builds.
|
||||
*
|
||||
* node scripts/make.cjs server # Linux server hosts (bare-build)
|
||||
* node scripts/make.cjs client # all client hosts (electron-forge)
|
||||
* node scripts/make.cjs both|all # server + client
|
||||
*
|
||||
* Env:
|
||||
* PEARDATA_SERVER_HOSTS=linux-x64,linux-arm64
|
||||
* PEARDATA_CLIENT_HOSTS=linux-x64,darwin-arm64,…
|
||||
* PEARDATA_CLIENT_TIMEOUT_MS=600000
|
||||
* PEARDATA_SKIP_ELECTRON_PREDOWNLOAD=1
|
||||
*/
|
||||
'use strict'
|
||||
|
||||
const path = require('path')
|
||||
const { spawnSync } = require('child_process')
|
||||
const {
|
||||
SERVER_LINUX,
|
||||
ALL_64,
|
||||
parseHostList,
|
||||
clientNpmScript,
|
||||
hostToElectron,
|
||||
} = require('./hosts.cjs')
|
||||
|
||||
const root = path.resolve(__dirname, '..')
|
||||
|
||||
const SERVER_HOSTS = parseHostList(process.env.PEARDATA_SERVER_HOSTS, SERVER_LINUX)
|
||||
const CLIENT_HOSTS = parseHostList(process.env.PEARDATA_CLIENT_HOSTS, ALL_64)
|
||||
const CLIENT_TIMEOUT_MS = Number(process.env.PEARDATA_CLIENT_TIMEOUT_MS || 600_000)
|
||||
|
||||
function run(cmd, args, opts = {}) {
|
||||
console.log(`\n$ ${cmd} ${args.join(' ')}\n`)
|
||||
const t0 = Date.now()
|
||||
const res = spawnSync(cmd, args, {
|
||||
cwd: root,
|
||||
stdio: 'inherit',
|
||||
env: process.env,
|
||||
shell: process.platform === 'win32',
|
||||
...opts,
|
||||
})
|
||||
if (res.error) throw res.error
|
||||
if (res.status !== 0) process.exit(res.status || 1)
|
||||
console.log(`[make] ok in ${((Date.now() - t0) / 1000).toFixed(1)}s`)
|
||||
}
|
||||
|
||||
function npmRun(script, env) {
|
||||
run(process.platform === 'win32' ? 'npm.cmd' : 'npm', ['run', script], {
|
||||
env: env ? { ...process.env, ...env } : process.env,
|
||||
})
|
||||
}
|
||||
|
||||
function makeServer(hosts = SERVER_HOSTS) {
|
||||
for (const host of hosts) {
|
||||
if (!SERVER_LINUX.includes(host)) {
|
||||
console.error(`[make] refusing non-Linux server host: ${host}`)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
console.log(`[make] server hosts (Linux only): ${hosts.join(', ')}`)
|
||||
for (const host of hosts) {
|
||||
run(process.execPath, [
|
||||
path.join(root, 'scripts', 'bare-standalone.cjs'),
|
||||
'--product',
|
||||
'server',
|
||||
'--host',
|
||||
host,
|
||||
])
|
||||
}
|
||||
}
|
||||
|
||||
function predownloadElectron(hosts) {
|
||||
if (process.env.PEARDATA_SKIP_ELECTRON_PREDOWNLOAD === '1') {
|
||||
console.log('[make] skip electron predownload (PEARDATA_SKIP_ELECTRON_PREDOWNLOAD=1)')
|
||||
return
|
||||
}
|
||||
console.log('[make] pre-downloading Electron for client hosts…')
|
||||
run(process.execPath, [path.join(root, 'scripts', 'predownload-electron.cjs')], {
|
||||
env: {
|
||||
...process.env,
|
||||
PEARDATA_CLIENT_HOSTS: hosts.join(','),
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
function makeClient(hosts = CLIENT_HOSTS) {
|
||||
console.log(`[make] client hosts: ${hosts.join(', ')}`)
|
||||
npmRun('build:client-bundle')
|
||||
predownloadElectron(hosts)
|
||||
|
||||
for (const host of hosts) {
|
||||
const script = clientNpmScript(host)
|
||||
if (!script) {
|
||||
console.error(`[make] no client script for host ${host}`)
|
||||
process.exit(1)
|
||||
}
|
||||
const { platform, arch } = hostToElectron(host)
|
||||
console.log(`[make] client ${host} (filter prebuilds to ${platform}-${arch})`)
|
||||
const env = {
|
||||
...process.env,
|
||||
npm_config_build_from_source: 'false',
|
||||
PEARDATA_SKIP_REBUILD: process.env.PEARDATA_SKIP_REBUILD || '1',
|
||||
PEARDATA_PACKAGE_PLATFORM: platform,
|
||||
PEARDATA_PACKAGE_ARCH: arch,
|
||||
PEARDATA_SKIP_PREPACKAGE_BUNDLE: '1',
|
||||
DEBUG:
|
||||
process.env.DEBUG ||
|
||||
(process.env.CI ? 'electron-packager,electron-forge:lifecycle' : ''),
|
||||
}
|
||||
|
||||
console.log(
|
||||
`[make] client timeout: ${(CLIENT_TIMEOUT_MS / 1000).toFixed(0)}s (PEARDATA_CLIENT_TIMEOUT_MS)`
|
||||
)
|
||||
const t0 = Date.now()
|
||||
const res = spawnSync(
|
||||
process.platform === 'win32' ? 'npm.cmd' : 'npm',
|
||||
['run', script],
|
||||
{
|
||||
cwd: root,
|
||||
stdio: 'inherit',
|
||||
env,
|
||||
shell: process.platform === 'win32',
|
||||
timeout: CLIENT_TIMEOUT_MS,
|
||||
killSignal: 'SIGKILL',
|
||||
}
|
||||
)
|
||||
if (res.error) {
|
||||
if (res.error.code === 'ETIMEDOUT') {
|
||||
console.error(
|
||||
`[make] FATAL: client package ${host} exceeded ${CLIENT_TIMEOUT_MS}ms — killed.`
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
throw res.error
|
||||
}
|
||||
if (res.status !== 0) {
|
||||
console.error(`[make] client package ${host} failed with status ${res.status}`)
|
||||
process.exit(res.status || 1)
|
||||
}
|
||||
console.log(`[make] ok ${host} in ${((Date.now() - t0) / 1000).toFixed(1)}s`)
|
||||
}
|
||||
}
|
||||
|
||||
function main() {
|
||||
const mode = process.argv[2] || 'all'
|
||||
const thisHost = `${process.platform}-${process.arch}`
|
||||
|
||||
switch (mode) {
|
||||
case 'server':
|
||||
makeServer()
|
||||
break
|
||||
case 'client':
|
||||
makeClient()
|
||||
break
|
||||
case 'client-this':
|
||||
makeClient([thisHost])
|
||||
break
|
||||
case 'both':
|
||||
case 'all':
|
||||
makeServer()
|
||||
makeClient()
|
||||
break
|
||||
case 'client-all':
|
||||
makeClient(ALL_64)
|
||||
break
|
||||
default:
|
||||
console.error(`Unknown mode: ${mode}`)
|
||||
console.error(
|
||||
'Usage: node scripts/make.cjs [server|client|client-this|both|all|client-all]'
|
||||
)
|
||||
console.error(`Server (Linux): ${SERVER_LINUX.join(', ')}`)
|
||||
console.error(`Client (all): ${ALL_64.join(', ')}`)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
console.log('\n[make] complete')
|
||||
}
|
||||
|
||||
main()
|
||||
Reference in New Issue
Block a user