From 8c5da0b7d31cd0bb7c395eb8f7adfee6e59dce22 Mon Sep 17 00:00:00 2001 From: Nishchit Dhanani Date: Mon, 24 Apr 2023 14:42:18 +0530 Subject: [PATCH] refactor: release script refactoring --- scripts/build.js | 77 +--------- scripts/deprecated/build.js | 132 +++++++++++++++++ scripts/deprecated/constants.js | 16 ++ scripts/deprecated/release.js | 254 ++++++++++++++++++++++++++++++++ scripts/release.js | 216 +-------------------------- 5 files changed, 410 insertions(+), 285 deletions(-) create mode 100644 scripts/deprecated/build.js create mode 100644 scripts/deprecated/constants.js create mode 100644 scripts/deprecated/release.js diff --git a/scripts/build.js b/scripts/build.js index d563580c..9c8ad221 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -2,10 +2,9 @@ require('dotenv').config(); const fs = require('fs'); const path = require('path'); -// const colors = require('colors'); +require('shelljs/global'); const { Environment, AppFormat } = require('./constants'); const build = require('../webpack.prod'); -require('shelljs/global'); const env = process.env.NODE_ENV; @@ -36,15 +35,6 @@ module.exports = async () => { if (!fs.existsSync(directoryPath)) mkdir(directoryPath); }); - // Copy build-scripts to generate build - // cp( - // '-R', - // path.join( - // `${__dirname}/../packages/firecamp-desktop-app/src/build-scripts/*` - // ), - // `${buildPath}/build-scripts` - // ); - // Copy react app assets cp( '-R', @@ -55,74 +45,9 @@ module.exports = async () => { // generate package.json and manifest based on app environment // exec(`node ${buildPath}/build-scripts/init-package.js`); - // Generate .html - // exec( - // `pug -O "{ env: '${env}' }" -o ${buildPath} ${path.join( - // __dirname, - // '../platform/firecamp-platform/public/views/' - // )}` - // ); - - // cp( - // '-R', - // path.join( - // `${__dirname}/../packages/firecamp-desktop-app/public/splashscreen.html` - // ), - // `${buildPath}` - // ); - - // Copy electron agent assets, config and services - if ( - env === Environment.Production && - process.env.AppFormat !== AppFormat.WebApp - ) { - // Copy electron agent services - cp( - '-R', - path.join( - `${__dirname}/../packages/firecamp-desktop-app/dist/services/*` - ), - `${buildPath}/services` - ); - - // Copy http executor - cp( - '-R', - path.join(`${__dirname}/../packages-executors/*`), - `${buildPath}/packages-executors` - ); - - // Copy dmg app assets - if (process.env.AppFormat === AppFormat.Dmg) { - mkdir(`${buildPath}/build`); - - cp( - '-R', - path.join( - `${__dirname}/../packages/firecamp-desktop-app/public/assets/${env}/mac/*` - ), - `${buildPath}/build` - ); - } - - // Copy common assets - cp( - '-R', - path.join( - `${__dirname}/../packages/firecamp-desktop-app/public/assets/${ - [...Object.values(Environment)].includes(env) - ? 'production' - : 'canary' - }` - ), - `${buildPath}/assets` - ); - } - if (env === Environment.Production || env === Environment.Staging) { await build(); } - return Promise.resolve(); } catch (error) { return Promise.reject(error); diff --git a/scripts/deprecated/build.js b/scripts/deprecated/build.js new file mode 100644 index 00000000..d563580c --- /dev/null +++ b/scripts/deprecated/build.js @@ -0,0 +1,132 @@ +/* eslint-disable no-console */ +require('dotenv').config(); +const fs = require('fs'); +const path = require('path'); +// const colors = require('colors'); +const { Environment, AppFormat } = require('./constants'); +const build = require('../webpack.prod'); +require('shelljs/global'); + +const env = process.env.NODE_ENV; + +module.exports = async () => { + try { + // hold the build path as per the environment mode + const buildPath = path.join(`${__dirname}/../build/${env}`); + // copy project assets and generate config. + const directoryPaths = [path.join(`${__dirname}/../build`), buildPath]; + if (env === Environment.Development) { + directoryPaths.push( + path.join(`${__dirname}/../build/${env}/build-scripts`) + ); + } + if (env === Environment.Production) { + directoryPaths.push( + path.join(`${__dirname}/../build/${env}/build-scripts`), + path.join(`${__dirname}/../build/${env}/services`), + path.join(`${__dirname}/../build/${env}/packages-executors`) + ); + } + + // Remove build before start bundle + rm('-rf', buildPath); + + // Create build directories + directoryPaths.forEach((directoryPath) => { + if (!fs.existsSync(directoryPath)) mkdir(directoryPath); + }); + + // Copy build-scripts to generate build + // cp( + // '-R', + // path.join( + // `${__dirname}/../packages/firecamp-desktop-app/src/build-scripts/*` + // ), + // `${buildPath}/build-scripts` + // ); + + // Copy react app assets + cp( + '-R', + path.join(`${__dirname}/../platform/firecamp-platform/public/assets/*`), + buildPath + ); + + // generate package.json and manifest based on app environment + // exec(`node ${buildPath}/build-scripts/init-package.js`); + + // Generate .html + // exec( + // `pug -O "{ env: '${env}' }" -o ${buildPath} ${path.join( + // __dirname, + // '../platform/firecamp-platform/public/views/' + // )}` + // ); + + // cp( + // '-R', + // path.join( + // `${__dirname}/../packages/firecamp-desktop-app/public/splashscreen.html` + // ), + // `${buildPath}` + // ); + + // Copy electron agent assets, config and services + if ( + env === Environment.Production && + process.env.AppFormat !== AppFormat.WebApp + ) { + // Copy electron agent services + cp( + '-R', + path.join( + `${__dirname}/../packages/firecamp-desktop-app/dist/services/*` + ), + `${buildPath}/services` + ); + + // Copy http executor + cp( + '-R', + path.join(`${__dirname}/../packages-executors/*`), + `${buildPath}/packages-executors` + ); + + // Copy dmg app assets + if (process.env.AppFormat === AppFormat.Dmg) { + mkdir(`${buildPath}/build`); + + cp( + '-R', + path.join( + `${__dirname}/../packages/firecamp-desktop-app/public/assets/${env}/mac/*` + ), + `${buildPath}/build` + ); + } + + // Copy common assets + cp( + '-R', + path.join( + `${__dirname}/../packages/firecamp-desktop-app/public/assets/${ + [...Object.values(Environment)].includes(env) + ? 'production' + : 'canary' + }` + ), + `${buildPath}/assets` + ); + } + + if (env === Environment.Production || env === Environment.Staging) { + await build(); + } + + return Promise.resolve(); + } catch (error) { + return Promise.reject(error); + } +}; + +if (env === Environment.Development) module.exports(); diff --git a/scripts/deprecated/constants.js b/scripts/deprecated/constants.js new file mode 100644 index 00000000..92b418f7 --- /dev/null +++ b/scripts/deprecated/constants.js @@ -0,0 +1,16 @@ +const Environment = { + Development: 'development', + Staging: 'staging', // staging will be for testing purpose + Production: 'production', + Canary: 'canary', // Canary is production but for early adopter +}; + +const AppFormat = { + WebApp: 'webapp', + Dmg: 'dmg', + AppImage: 'appImage', + Snap: 'snap', + NSIS: 'nsis', +}; + +module.exports = { Environment, AppFormat }; diff --git a/scripts/deprecated/release.js b/scripts/deprecated/release.js new file mode 100644 index 00000000..0f11d408 --- /dev/null +++ b/scripts/deprecated/release.js @@ -0,0 +1,254 @@ +/* eslint-disable no-console */ +require('dotenv-vault-core').config(); +const { red, yellow } = require('colors'); +const semver = require('semver'); +require('shelljs/global'); +const build = require('./build'); +const { version } = require('../package.json'); +const { Environment, AppFormat } = require('./constants'); + +const env = process.env.NODE_ENV; + +/** + * 1. test variables + */ + +const validator = { + /** validate project version */ + version: () => { + if (!semver.valid(version)) { + console.log( + `${red('Error:')} invalid project version(${yellow(version)})` + ); + process.exit(); + } + }, + + /** validate env variables */ + variables: () => { + const variables = [ + 'FIRECAMP_API_HOST', + 'CSC_KEY_PASSWORD', + 'CSC_LINK', + 'DO_KEY_ID', + 'DO_SECRET_KEY', + ]; + + // Check if environment variables set + variables.forEach((variable) => { + if ( + !process.env.variable || + typeof process.env[variable] === 'undefined' || + process.env[variable].length < 5 + ) { + console.log( + `${red('Error:')} Env. variable ${yellow(variable)} not set` + ); + process.exit(); + } + }); + }, +}; + +const helper = { + buildWebApp: async () => { + process.env.NODE_OPTIONS = '--max-old-space-size=4096'; + + await build(); + + // Finished the process if build=chrome + if (process.env.AppFormat === AppFormat.WebApp) { + // remove unused packages + rm('-rf', `build/${env}/build-scripts`); + rm('-rf', `build/${env}/packages-executors`); + rm('-rf', `build/${env}/services`); + + // remove chrome extension app files // TODO: remove it later + rm('-rf', `build/${env}/splashscreen.html`); + rm('-rf', `build/${env}/manifest.json`); + rm('-rf', `build/${env}/background.html`); + rm('-rf', `build/${env}/window.html`); + + process.exit(); + } + }, +}; + +// set app version in the environment +process.env.APP_VERSION = version; + +// check FIRECAMP_API_HOST env. variable value does not contains invalid value +if ( + env !== Environment.Staging && + (process.env.FIRECAMP_API_HOST.includes('localhost') || + process.env.FIRECAMP_API_HOST.includes('testing') || + process.env.FIRECAMP_API_HOST.includes('127.0.0.1')) +) { + console.log( + `${red( + 'Error:' + )} invalid value set for env. variable (FIRECAMP_API_HOST ${yellow( + process.env.FIRECAMP_API_HOST + )})` + ); + process.exit(); +} + +const _exec = (command) => + new Promise((resolve) => { + let result; + + const _command = exec(command, { async: true, silent: true }); + + _command.stdout.on('data', (data) => { + result = data.toString(); + }); + + _command.on('close', (code) => { + if (code !== 0) { + console.error( + ` +${red('Error: ')}Failed to execute command: ${command}` + ); + + process.exit(); + } else { + console.log(` +✅ ${command} executed successfully`); + + resolve(result); + } + }); + }); + +const preBuildCliCommands = async () => { + // Prevent check git tag while staging build + if (env === Environment.Staging) return Promise.resolve(); + + // Check is tag was checked out or not + // await _exec('git describe --tags', { async: true }) + // .then((result) => { + // console.log(result); + // if (result.replace(/\n/g, '') !== `v${version}`) { + // console.log( + // `${red('Error:')} Please checkout tag '${yellow( + // `v${version}` + // )}' for release` + // ); + // process.exit(); + // } else return Promise.resolve(); + // }) + // .catch((e) => { + // console.log(e, 'this is the error'); + // }); +}; + +if (env === Environment.Staging) { + helper.buildWebApp(); +} +if (env === Environment.Production) { + try { + preBuildCliCommands().then(async () => { + await helper.buildWebApp(); + + // Set bundle id for electron app + if (env === Environment.Production) + process.env.appBundleId = 'com.firecamp.app'; + else if (env === Environment.Canary) + process.env.appBundleId = 'com.firecamp.canary'; + + // Copy release note and post build checks + // cp( + // '-R', + // 'packages/firecamp-desktop-app/public/release-notes.md', + // 'build/production' + // ); + + // Remove chrome extension app files + rm('-rf', 'build/production/background.html'); + rm('-rf', 'build/production/window.html'); + rm('-rf', 'build/production/js/background.bundle.js'); + + // Add library: electron + // cd('build/production'); + // exec( + // 'export NODE_ENV=development && pnpm install && pnpm add_electron && export NODE_ENV=production' + // ); + + // Add library: electron-oauth-helper + // exec('pnpm add ../../../firecamp-forks/electron-oauth-helper -W'); + + // Prepare linux os 'AppImage' build + if (process.env.AppFormat === AppFormat.AppImage) { + // do not publish the app + if (process.argv[3] === 'l') exec('electron-builder --linux AppImage'); + + // publish the app + if (process.argv[3] === 'p') { + exec( + 'electron-builder --linux AppImage -p always -c.releaseInfo.releaseNotesFile=release-notes.md' + ); + + // Get the hash value of the AppImage build + const shasum = await _exec( + `shasum -a 256 ./dist/Firecamp-${process.env.APP_VERSION}.AppImage` + ); + + console.log(`${yellow('shasum:')} ${shasum}`); + } + } + + // Prepare linux os 'Snap' build + if (process.env.AppFormat === AppFormat.Snap) { + // do not publish the app + if (process.argv[3] === 'l') exec('electron-builder --linux Snap'); + + // publish the app + if (process.argv[3] === 'p') + exec('electron-builder --linux Snap -p always'); + } + + // Prepare windows os 'nsis' build + if (process.env.AppFormat === AppFormat.NSIS) { + // do not publish the app + if (process.argv[3] === 'l') exec('electron-builder --win'); + + // publish the app + if (process.argv[3] === 'p') { + exec( + 'electron-builder --win -p always -c.releaseInfo.releaseNotesFile=release-notes.md' + ); + + // Get the hash value of the nsis build + const shasum = await _exec( + `shasum -a 256 ./dist/Firecamp-${process.env.APP_VERSION}.exe` + ); + + console.log(`${yellow('shasum:')} ${shasum}`); + } + } + + // Prepare mac os 'dmg' build + if (process.env.AppFormat === AppFormat.Dmg) { + // do not publish the app + if (process.argv[3] === 'l') exec('electron-builder --mac'); + + // publish the app + if (process.argv[3] === 'p') { + exec( + 'electron-builder --mac -p always -c.releaseInfo.releaseNotesFile=release-notes.md' + ); + + // Get the hash value of the nsis build + const shasum = await _exec( + `shasum -a 256 ./dist/Firecamp-${process.env.APP_VERSION}.dmg` + ); + + console.log(`${yellow('shasum:')} ${shasum}`); + } + } + }); + } catch (error) { + console.error(error); + } +} diff --git a/scripts/release.js b/scripts/release.js index 0f11d408..1bf2c256 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -8,69 +8,10 @@ const { version } = require('../package.json'); const { Environment, AppFormat } = require('./constants'); const env = process.env.NODE_ENV; - -/** - * 1. test variables - */ - -const validator = { - /** validate project version */ - version: () => { - if (!semver.valid(version)) { - console.log( - `${red('Error:')} invalid project version(${yellow(version)})` - ); - process.exit(); - } - }, - - /** validate env variables */ - variables: () => { - const variables = [ - 'FIRECAMP_API_HOST', - 'CSC_KEY_PASSWORD', - 'CSC_LINK', - 'DO_KEY_ID', - 'DO_SECRET_KEY', - ]; - - // Check if environment variables set - variables.forEach((variable) => { - if ( - !process.env.variable || - typeof process.env[variable] === 'undefined' || - process.env[variable].length < 5 - ) { - console.log( - `${red('Error:')} Env. variable ${yellow(variable)} not set` - ); - process.exit(); - } - }); - }, -}; - const helper = { buildWebApp: async () => { process.env.NODE_OPTIONS = '--max-old-space-size=4096'; - await build(); - - // Finished the process if build=chrome - if (process.env.AppFormat === AppFormat.WebApp) { - // remove unused packages - rm('-rf', `build/${env}/build-scripts`); - rm('-rf', `build/${env}/packages-executors`); - rm('-rf', `build/${env}/services`); - - // remove chrome extension app files // TODO: remove it later - rm('-rf', `build/${env}/splashscreen.html`); - rm('-rf', `build/${env}/manifest.json`); - rm('-rf', `build/${env}/background.html`); - rm('-rf', `build/${env}/window.html`); - - process.exit(); - } }, }; @@ -78,11 +19,12 @@ const helper = { process.env.APP_VERSION = version; // check FIRECAMP_API_HOST env. variable value does not contains invalid value +const { FIRECAMP_API_HOST = '' } = process.env; if ( env !== Environment.Staging && - (process.env.FIRECAMP_API_HOST.includes('localhost') || - process.env.FIRECAMP_API_HOST.includes('testing') || - process.env.FIRECAMP_API_HOST.includes('127.0.0.1')) + (FIRECAMP_API_HOST.includes('localhost') || + FIRECAMP_API_HOST.includes('testing') || + FIRECAMP_API_HOST.includes('127.0.0.1')) ) { console.log( `${red( @@ -94,159 +36,15 @@ if ( process.exit(); } -const _exec = (command) => - new Promise((resolve) => { - let result; - - const _command = exec(command, { async: true, silent: true }); - - _command.stdout.on('data', (data) => { - result = data.toString(); - }); - - _command.on('close', (code) => { - if (code !== 0) { - console.error( - ` -${red('Error: ')}Failed to execute command: ${command}` - ); - - process.exit(); - } else { - console.log(` -✅ ${command} executed successfully`); - - resolve(result); - } - }); - }); - const preBuildCliCommands = async () => { - // Prevent check git tag while staging build - if (env === Environment.Staging) return Promise.resolve(); - - // Check is tag was checked out or not - // await _exec('git describe --tags', { async: true }) - // .then((result) => { - // console.log(result); - // if (result.replace(/\n/g, '') !== `v${version}`) { - // console.log( - // `${red('Error:')} Please checkout tag '${yellow( - // `v${version}` - // )}' for release` - // ); - // process.exit(); - // } else return Promise.resolve(); - // }) - // .catch((e) => { - // console.log(e, 'this is the error'); - // }); + // pre conditions can be validated here + return Promise.resolve(); }; -if (env === Environment.Staging) { - helper.buildWebApp(); -} -if (env === Environment.Production) { +if ([Environment.Production, Environment.Staging].includes(env)) { try { preBuildCliCommands().then(async () => { await helper.buildWebApp(); - - // Set bundle id for electron app - if (env === Environment.Production) - process.env.appBundleId = 'com.firecamp.app'; - else if (env === Environment.Canary) - process.env.appBundleId = 'com.firecamp.canary'; - - // Copy release note and post build checks - // cp( - // '-R', - // 'packages/firecamp-desktop-app/public/release-notes.md', - // 'build/production' - // ); - - // Remove chrome extension app files - rm('-rf', 'build/production/background.html'); - rm('-rf', 'build/production/window.html'); - rm('-rf', 'build/production/js/background.bundle.js'); - - // Add library: electron - // cd('build/production'); - // exec( - // 'export NODE_ENV=development && pnpm install && pnpm add_electron && export NODE_ENV=production' - // ); - - // Add library: electron-oauth-helper - // exec('pnpm add ../../../firecamp-forks/electron-oauth-helper -W'); - - // Prepare linux os 'AppImage' build - if (process.env.AppFormat === AppFormat.AppImage) { - // do not publish the app - if (process.argv[3] === 'l') exec('electron-builder --linux AppImage'); - - // publish the app - if (process.argv[3] === 'p') { - exec( - 'electron-builder --linux AppImage -p always -c.releaseInfo.releaseNotesFile=release-notes.md' - ); - - // Get the hash value of the AppImage build - const shasum = await _exec( - `shasum -a 256 ./dist/Firecamp-${process.env.APP_VERSION}.AppImage` - ); - - console.log(`${yellow('shasum:')} ${shasum}`); - } - } - - // Prepare linux os 'Snap' build - if (process.env.AppFormat === AppFormat.Snap) { - // do not publish the app - if (process.argv[3] === 'l') exec('electron-builder --linux Snap'); - - // publish the app - if (process.argv[3] === 'p') - exec('electron-builder --linux Snap -p always'); - } - - // Prepare windows os 'nsis' build - if (process.env.AppFormat === AppFormat.NSIS) { - // do not publish the app - if (process.argv[3] === 'l') exec('electron-builder --win'); - - // publish the app - if (process.argv[3] === 'p') { - exec( - 'electron-builder --win -p always -c.releaseInfo.releaseNotesFile=release-notes.md' - ); - - // Get the hash value of the nsis build - const shasum = await _exec( - `shasum -a 256 ./dist/Firecamp-${process.env.APP_VERSION}.exe` - ); - - console.log(`${yellow('shasum:')} ${shasum}`); - } - } - - // Prepare mac os 'dmg' build - if (process.env.AppFormat === AppFormat.Dmg) { - // do not publish the app - if (process.argv[3] === 'l') exec('electron-builder --mac'); - - // publish the app - if (process.argv[3] === 'p') { - exec( - 'electron-builder --mac -p always -c.releaseInfo.releaseNotesFile=release-notes.md' - ); - - // Get the hash value of the nsis build - const shasum = await _exec( - `shasum -a 256 ./dist/Firecamp-${process.env.APP_VERSION}.dmg` - ); - - console.log(`${yellow('shasum:')} ${shasum}`); - } - } }); } catch (error) { console.error(error);