From b4454cc5344b543712ca6a40040cdef29506e5a4 Mon Sep 17 00:00:00 2001 From: Mo Date: Thu, 13 Jan 2022 11:47:34 -0600 Subject: [PATCH] chore: improve build script --- README.md | 22 +-- app/package.json | 2 +- package.json | 34 ++--- scripts/build.mjs | 353 ++++++++++++++++++++++++++++------------------ web | 2 +- 5 files changed, 231 insertions(+), 182 deletions(-) diff --git a/README.md b/README.md index f992f63e..de375642 100644 --- a/README.md +++ b/README.md @@ -47,16 +47,7 @@ To determine where to install a dependency: Build for all platforms: -- `yarn build:all` - -or - -- `yarn build appimage` -- `yarn build mac` -- `yarn build snap` -- `yarn build windows` -- `yarn build appimage:arm64` -- `yarn build deb:arm64` +- `yarn release` ## Building natively on arm64 @@ -78,18 +69,11 @@ Snap releases also require a working snapcraft / `snapd` installation. Building can then be done by running: - `yarn setup` -- `yarn bundle:arm64` - -Followed by either: -- `yarn build:all:arm64` +Followed by -Or the individual commands: +- `node scripts/build.mjs deb-arm64` -- `yarn build:dir:arm64` -- `yarn build:appimage:arm64` -- `yarn build:deb:arm64` -- `yarn build:snap:arm64` ## Installation diff --git a/app/package.json b/app/package.json index 550c2234..66a7a240 100644 --- a/app/package.json +++ b/app/package.json @@ -3,7 +3,7 @@ "productName": "Standard Notes", "description": "A simple and private place for your notes, thoughts, and life's work.", "author": "Standard Notes ", - "version": "3.9.14", + "version": "3.9.15", "main": "./dist/index.js", "dependencies": { "keytar": "^7.7.0", diff --git a/package.json b/package.json index 616da2ef..78716aaa 100644 --- a/package.json +++ b/package.json @@ -1,47 +1,33 @@ { "name": "standard-notes", "main": "./app/dist/index.js", - "version": "3.9.14", + "version": "3.9.15", "repository": { "type": "git", "url": "git://github.com/standardnotes/desktop" }, "license": "AGPL-3.0-or-later", "scripts": { - "build": "yarn lint && yarn build:web && node scripts/build.mjs", - "build:all": "yarn bundle && electron-builder -wl --x64 --ia32 && yarn build:snap && yarn build:appimage:arm64 && yarn build:deb:arm64 && yarn build:mac-all && yarn build:write-sums && yarn release:draft", - "build:mac": "node scripts/build.mjs mac", - "build:mac-all": "node scripts/build.mjs mac-all", - "build:mac-arm64": "node scripts/build.mjs mac-arm64", - "build:snap": "node scripts/build.mjs snap", - "build:write-sums": "node scripts/sums.mjs", "build:remove-unpacked": "rimraf dist/{linux-*,mac,win-*}", "build:web": "cd web && rimraf node_modules && yarn --ignore-engines && yarn run bundle:desktop", - "bundle:arm64": "yarn run lint && yarn clean:build && yarn run build:web:arm64 && webpack --config webpack.prod.js", - "build:web:arm64": "git submodule update && yarn --cwd ./web run rimraf node_modules && npm_config_target=14.17.3 npm_config_runtime=node yarn --cwd ./web setup && npm --prefix ./web rebuild && yarn --cwd ./web bundle:desktop", - "build:all:arm64": "yarn bundle:arm64 && yarn build:dir:arm64 && yarn build:appimage:arm64 && yarn build:snap:arm64 && yarn build:deb:arm64 && yarn build:write-sums", - "build:dir:arm64": "node scripts/build.mjs dir-arm64", - "build:appimage:arm64": "node scripts/build.mjs appimage-arm64", - "build:snap:arm64": "node scripts/build.mjs snap-arm64", - "build:deb:arm64": "node scripts/build.mjs deb-arm64", - "bundle": "yarn run lint && yarn clean:build && yarn run build:web && webpack --config webpack.prod.js", - "clean": "npm-run-all --parallel clean:*", + "build": "yarn lint && yarn build:web && yarn run webpack --config webpack.prod.js", + "change-version": "node scripts/change-version.mjs", "clean:build": "rimraf app/dist/", "clean:tests": "rimraf test/data/tmp/", - "dev": "NODE_ENV=development webpack --config webpack.dev.js --watch", + "clean": "npm-run-all --parallel clean:*", "dev:web": "cd web && yarn run watch:desktop", + "dev": "NODE_ENV=development webpack --config webpack.dev.js --watch", "format": "prettier --write .", - "change-version": "node scripts/change-version.mjs", - "lint": "npm-run-all --parallel lint:*", - "lint:formatting": "prettier --check .", "lint:eslint": "eslint app/index.ts app/application.ts app/javascripts/**/*.ts", + "lint:formatting": "prettier --check .", "lint:types": "tsc --noEmit", - "release:draft": "node scripts/create-draft-release.mjs", + "lint": "npm-run-all --parallel lint:*", + "postinstall": "electron-builder install-app-deps", + "release": "node scripts/build.mjs mainstream", "setup": "yarn --ignore-engines && yarn --ignore-engines --cwd ./app && git submodule update --init && yarn --ignore-engines --cwd ./web", "start": "electron ./app --enable-logging --icon _icon/icon.png", "test": "rimraf test/data/tmp && ava", - "update-web": "cd web && git checkout main && git pull && cd ..", - "postinstall": "electron-builder install-app-deps" + "update-web": "cd web && git checkout main && git pull && cd .." }, "dependencies": { "compare-versions": "^4.1.2", diff --git a/scripts/build.mjs b/scripts/build.mjs index 98b68c16..0045bec8 100644 --- a/scripts/build.mjs +++ b/scripts/build.mjs @@ -1,9 +1,34 @@ import { spawn } from 'child_process'; +import fs from 'fs'; -function runCommand(fullCommand, extraEnv = {}) { +async function buildTargets(targets) { + console.log('Building targets: ', targets); + await runCommand( + Command('yarn run lint && yarn clean:build && yarn run build:web') + ); + + for (const group of CompileGroups) { + let didCompileGroup = false; + for (const target of targets) { + if (group.targets.includes(target)) { + if (!didCompileGroup) { + await runCommand(group.compileCommand); + didCompileGroup = true; + } + const buildCommands = BuildCommands[target]; + for (const buildCommand of buildCommands) { + await runCommand(buildCommand); + } + } + } + } +} + +function runCommand(commandObj) { return new Promise((resolve, reject) => { - console.log(fullCommand); - const [command, ...args] = fullCommand.split(' '); + const { prompt, extraEnv } = commandObj; + console.log(prompt, Object.keys(extraEnv).length > 0 ? extraEnv : ''); + const [command, ...args] = prompt.split(' '); const options = { env: Object.assign({}, process.env, extraEnv) }; const child = spawn(command, args, options); child.stdout.pipe(process.stdout); @@ -19,147 +44,201 @@ function runCommand(fullCommand, extraEnv = {}) { }); } -const appimage = 'appimage'; -const appimageX64 = 'appimage-x64'; -const appimageArm64 = 'appimage-arm64'; -const dir = 'dir'; -const dirArm64 = 'dir-arm64'; -const mac = 'mac'; -const macArm64 = 'mac-arm64'; -const macAll = 'mac-all'; -const snap = 'snap'; -const snapArm64 = 'snap-arm64'; -const deb = 'deb'; -const debArm64 = 'deb-arm64'; -const windows = 'windows'; +const Targets = { + Appimage: 'appimage', + AppimageArm64: 'appimage-arm64', + AppimageX64: 'appimage-x64', + AppimageAll: 'appimage-all', + Deb: 'deb', + DebArm64: 'deb-arm64', + Dir: 'dir', + DirArm64: 'dir-arm64', + Mac: 'mac', + MacAll: 'mac-all', + MacArm64: 'mac-arm64', + Snap: 'snap', + SnapArm64: 'snap-arm64', + Windows: 'windows', +}; + +const MainstreamTargetGroup = 'mainstream'; + +const TargetGroups = { + all: [ + Targets.AppimageAll, + Targets.Deb, + Targets.DebArm64, + Targets.Dir, + Targets.DirArm64, + Targets.MacAll, + Targets.Snap, + Targets.SnapArm64, + Targets.Windows, + ], + [MainstreamTargetGroup]: [ + Targets.AppimageAll, + Targets.Deb, + Targets.DebArm64, + Targets.MacAll, + Targets.Snap, + Targets.Windows, + ], +}; + const arm64Env = { npm_config_target_arch: 'arm64' }; -const availableTargets = [ - appimage, - appimageX64, - appimageArm64, - deb, - debArm64, - dir, - dirArm64, - mac, - macArm64, - macAll, - snap, - snapArm64, - windows, + +const Command = function (prompt, extraEnv = {}) { + return { + prompt, + extraEnv, + }; +}; + +const CompileGroups = [ + { + compileCommand: Command('yarn run webpack --config webpack.prod.js'), + targets: [ + Targets.Appimage, + Targets.AppimageX64, + Targets.AppimageArm64, + Targets.AppimageAll, + Targets.Mac, + Targets.MacArm64, + Targets.MacAll, + Targets.Dir, + Targets.Windows, + ], + }, + { + compileCommand: Command( + 'yarn run webpack --config webpack.prod.js --env deb' + ), + targets: [Targets.Deb], + }, + { + compileCommand: Command( + 'yarn run webpack --config webpack.prod.js --env deb', + arm64Env + ), + targets: [Targets.DebArm64], + }, + { + compileCommand: Command( + 'yarn run webpack --config webpack.prod.js', + arm64Env + ), + targets: [Targets.DirArm64], + }, + { + compileCommand: Command( + 'yarn run webpack --config webpack.prod.js --env snap' + ), + targets: [Targets.Snap], + }, + { + compileCommand: Command( + 'yarn run webpack --config webpack.prod.js --env snap', + arm64Env + ), + targets: [Targets.SnapArm64], + }, ]; +const BuildCommands = { + [Targets.Appimage]: [ + Command( + 'yarn run electron-builder --linux --x64 --ia32 -c.linux.target=AppImage --publish=never' + ), + ], + [Targets.AppimageX64]: [ + Command( + 'yarn run electron-builder --linux --x64 -c.linux.target=AppImage --publish=never' + ), + ], + [Targets.AppimageArm64]: [ + Command( + 'yarn run electron-builder --linux --arm64 -c.linux.target=AppImage --publish=never' + ), + ], + [Targets.AppimageAll]: [ + Command( + 'yarn run electron-builder --linux --arm64 --x64 --ia32 -c.linux.target=AppImage --publish=never' + ), + ], + [Targets.Deb]: [ + Command( + 'yarn run electron-builder --linux --x64 --ia32 -c.linux.target=deb --publish=never' + ), + ], + [Targets.DebArm64]: [ + Command( + 'yarn run electron-builder --linux --arm64 -c.linux.target=deb --publish=never', + { npm_config_target_arch: 'arm64', USE_SYSTEM_FPM: 'true' } + ), + ], + [Targets.Mac]: [ + Command('yarn run electron-builder --mac --x64 --publish=never'), + Command('node scripts/fix-mac-zip'), + ], + [Targets.MacArm64]: [ + Command('yarn run electron-builder --mac --arm64 --publish=never'), + ], + [Targets.MacAll]: [ + Command('yarn run electron-builder --macos --arm64 --x64 --publish=never'), + ], + [Targets.Dir]: [ + Command( + 'yarn run electron-builder --linux --x64 -c.linux.target=dir --publish=never' + ), + ], + [Targets.DirArm64]: [ + Command( + 'yarn run electron-builder --linux --arm64 -c.linux.target=dir --publish=never', + arm64Env + ), + ], + [Targets.Snap]: [ + Command( + 'yarn run electron-builder --linux --x64 -c.linux.target=snap --publish=never' + ), + ], + [Targets.SnapArm64]: [ + Command( + 'yarn run electron-builder --linux --arm64 -c.linux.target=snap --publish=never', + { + npm_config_target_arch: 'arm64', + SNAPCRAFT_BUILD_ENVIRONMENT: 'host', + } + ), + ], + [Targets.Windows]: [ + Command('yarn run electron-builder --windows --x64 --ia32 --publish=never'), + ], +}; + +async function publishSnap() { + const packageJson = await fs.promises.readFile('./package.json'); + const version = JSON.parse(packageJson).version; + await runCommand( + Command(`snapcraft upload dist/standard-notes-${version}-linux-amd64.snap`) + ); +} + (async () => { try { - const target = process.argv[2]; - if (!target) { - throw Error( - `No target specified. Available targets: ${availableTargets.join(', ')}` - ); - } else if (!availableTargets.includes(target)) { - throw Error( - `Unknown target '${target}'. Available target: ${availableTargets.join( - ', ' - )}` - ); + const input = process.argv[2]; + let targets = input.split(','); + if (targets.length === 1) { + if (TargetGroups[targets[0]]) { + targets = TargetGroups[targets[0]]; + } } + await buildTargets(targets); - await runCommand('yarn clean:build'); - switch (target) { - case appimage: - await runCommand('yarn run webpack --config webpack.prod.js'); - await runCommand( - 'yarn run electron-builder --linux --x64 --ia32 -c.linux.target=AppImage --publish=never' - ); - break; - case appimageX64: - await runCommand('yarn run webpack --config webpack.prod.js'); - await runCommand( - 'yarn run electron-builder --linux --x64 -c.linux.target=AppImage --publish=never' - ); - break; - case appimageArm64: - await runCommand('yarn run webpack --config webpack.prod.js', arm64Env); - await runCommand( - 'yarn run electron-builder --linux --arm64 -c.linux.target=AppImage --publish=never', - arm64Env - ); - break; - case deb: - await runCommand('yarn run webpack --config webpack.prod.js --env deb'); - await runCommand( - 'yarn run electron-builder --linux --x64 --ia32 -c.linux.target=deb --publish=never' - ); - break; - case debArm64: - await runCommand( - 'yarn run webpack --config webpack.prod.js --env deb', - arm64Env - ); - await runCommand( - 'yarn run electron-builder --linux --arm64 -c.linux.target=deb --publish=never', - { npm_config_target_arch: 'arm64', USE_SYSTEM_FPM: 'true' } - ); - break; - case mac: - await runCommand('yarn run webpack --config webpack.prod.js'); - await runCommand( - 'yarn run electron-builder --mac --x64 --publish=never' - ); - await runCommand('node scripts/fix-mac-zip'); - break; - case macArm64: - await runCommand('yarn run webpack --config webpack.prod.js'); - await runCommand( - 'yarn run electron-builder --mac --arm64 --publish=never' - ); - break; - case macAll: - await runCommand('yarn run webpack --config webpack.prod.js'); - await runCommand( - 'yarn run electron-builder --macos --arm64 --x64 --publish=never' - ); - break; - case dir: - await runCommand('yarn run webpack --config webpack.prod.js'); - await runCommand( - 'yarn run electron-builder --linux --x64 -c.linux.target=dir --publish=never' - ); - break; - case dirArm64: - await runCommand('yarn run webpack --config webpack.prod.js', arm64Env); - await runCommand( - 'yarn run electron-builder --linux --arm64 -c.linux.target=dir --publish=never', - arm64Env - ); - break; - case snap: - await runCommand( - 'yarn run webpack --config webpack.prod.js --env snap' - ); - await runCommand( - 'yarn run electron-builder --linux --x64 -c.linux.target=snap --publish=never' - ); - break; - case snapArm64: - await runCommand( - 'yarn run webpack --config webpack.prod.js --env snap', - arm64Env - ); - await runCommand( - 'yarn run electron-builder --linux --arm64 -c.linux.target=snap --publish=never', - { - npm_config_target_arch: 'arm64', - SNAPCRAFT_BUILD_ENVIRONMENT: 'host', - } - ); - break; - case windows: - await runCommand('yarn run webpack --config webpack.prod.js'); - await runCommand( - 'yarn run electron-builder --windows --x64 --ia32 --publish=never' - ); - break; + if (input === MainstreamTargetGroup) { + await runCommand(Command('node scripts/sums.mjs')); + await runCommand(Command('node scripts/create-draft-release.mjs')); + await publishSnap(); } } catch (e) { console.error(e); diff --git a/web b/web index 9dfa0bde..78213427 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit 9dfa0bde88ce9ee9c60a1f3cee9a83bd3015efa8 +Subproject commit 78213427fa42b3b36b3306ef2ed1686ccce68cbc