Spaces:
Sleeping
Sleeping
| /** | |
| * Copyright (c) 2017~2021, OBCon Inc. | |
| * All rights reserved. | |
| */ | |
| /** | |
| * @file | |
| * @copyright 2017~2021, OBCon Inc. | |
| * @author gye hyun james kim [pnuskgh@gmail.com] | |
| */ | |
| const fs = require('fs'); | |
| const path = require('path'); | |
| const archiver = require('archiver'); | |
| const readline = require("readline"); | |
| // const inquirer = require('inquirer'); | |
| // const util = require('util'); | |
| class Deploy { | |
| constructor(answer) { | |
| this._version = null; | |
| this._folderSource = null; | |
| this._folderTarget = null; | |
| this._ident = 0; | |
| this._answer = answer; | |
| this.init(); | |
| } | |
| init() { | |
| //--- 환경 변수 등 설정 | |
| process.env.NODE_ENV = 'production'; | |
| process.chdir(path.join(__dirname, '..')); | |
| global.appl = { | |
| root: process.cwd().replace(/\\/g, '/') | |
| }; | |
| let configFile = 'config_scada_override.js'; | |
| switch (this._answer) { | |
| case '1': //--- OBCon SCADA | |
| default: | |
| appl.name = 'OBCon SCADA'; | |
| appl.type = 'obcon_scada'; | |
| configFile = 'config_scada_override.js'; | |
| break; | |
| } | |
| if (!fs.existsSync(path.join(appl.root, configFile))) { | |
| console.error(`Error: 설정 파일이 존재하지 않습니다 - ${configFile}`); | |
| process.exit(3); | |
| } | |
| //--- 설정 정보 로딩 | |
| global.config = require(path.join(appl.root, configFile)); | |
| config.logger.filename = 'deploy_%DATE%.log'; | |
| //--- Global Utility 함수 로드 | |
| global.utils = require(path.join(appl.root, 'include', 'global_utils.js')); | |
| global.utils = utils.getClass('include', 'global_utils.js'); //--- utils을 사용하여 utils을 다시 로드 | |
| //--- Global Logger 설정 : logger.info(), logger.warn(), logger.error() | |
| global.logger = utils.getModule('include', 'logger.js').createLogger(); | |
| //--- __dirname, __filename | |
| logger.debug('설정 정보 로딩'); | |
| logger.debug('Global Utility 함수 로드'); | |
| logger.debug('Global Logger 설정'); | |
| this._folderSource = appl.root; | |
| this._folderTarget = path.join(appl.root, 'dist', appl.type); | |
| this._version = utils.getModule('include', 'Version.js'); | |
| } | |
| copyFile(filename, folder='', ident=0) { | |
| let source = path.join(this._folderSource, folder, filename); | |
| let target = path.join(this._folderTarget, folder); | |
| fs.existsSync(target) || fs.mkdirSync(target); | |
| fs.existsSync(source) && fs.copyFileSync(source, path.join(target, filename)); | |
| // console.log(''.padStart(ident, ' '), path.join(folder, filename)); | |
| } | |
| copyFolder(folder='', ident=0, filenames=null, isCurrentFolder=false) { | |
| // console.log(''.padStart(ident, ' '), 'Folder :', `${folder}/`); | |
| let target = path.join(this._folderTarget, folder); | |
| fs.existsSync(target) || fs.mkdirSync(target); | |
| let data = filenames || fs.readdirSync(path.join(this._folderSource, folder)); | |
| data.forEach(name => { | |
| if (fs.statSync(path.join(this._folderSource, folder, name)).isDirectory()) { | |
| if (isCurrentFolder == false) { | |
| this.copyFolder(path.join(folder, name), ident + 4); | |
| } | |
| } else { | |
| this.copyFile(name, folder, ident + 4); | |
| } | |
| }); | |
| } | |
| deleteFile(filename, folder='', ident=0) { | |
| let target = path.join(this._folderTarget, folder, filename); | |
| fs.existsSync(target) && fs.unlinkSync(target); | |
| // console.log(''.padStart(ident, ' '), path.join(folder, filename)); | |
| } | |
| deleteFolder(folder='', ident=0) { | |
| // console.log(''.padStart(ident, ' '), 'Folder :', `${folder}/`); | |
| let data = fs.readdirSync(path.join(this._folderTarget, folder)); | |
| data.forEach(name => { | |
| if (fs.statSync(path.join(this._folderTarget, folder, name)).isDirectory()) { | |
| this.deleteFolder(path.join(folder, name), ident + 4); | |
| } else { | |
| this.deleteFile(name, folder, ident + 4); | |
| } | |
| }); | |
| fs.rmdirSync(path.join(this._folderTarget, folder)); | |
| } | |
| makeZip(folder, zipFilename) { | |
| fs.existsSync(zipFilename) && fs.unlinkSync(zipFilename); | |
| let archive = archiver('zip'); | |
| let output = fs.createWriteStream(zipFilename); | |
| output.on('close', function () { | |
| console.log(`${zipFilename} file : ${archive.pointer()} bytes`); | |
| }); | |
| archive.on('error', function(err) { | |
| throw err; | |
| }); | |
| archive.pipe(output); | |
| archive.directory(folder, false); | |
| archive.finalize(); | |
| } | |
| async deploy() { | |
| try { | |
| console.log(); | |
| console.log('------------------------------------------------------------'); | |
| console.log('--- Deploy'); | |
| console.log(`Source folder : ${this._folderSource}`); | |
| console.log(`Target folder : ${this._folderTarget}`); | |
| console.log(`Version : ${this._version.version.version}`); | |
| fs.existsSync(this._folderTarget) || fs.mkdirSync(this._folderTarget); | |
| console.log(); | |
| this.deleteFolder(); | |
| fs.mkdirSync(this._folderTarget); | |
| //--- Folder : .nyc_output/ | |
| //--- Folder : coverage/ | |
| //--- Folder : dist/ | |
| //--- Folder : files/ | |
| //--- Folder : install/ | |
| //--- Folder : logs/ | |
| //--- Folder : manual/ | |
| //--- Folder : node_modules/ | |
| //--- Folder : sessions/ | |
| //--- Folder : src/ | |
| //--- Folder : test/ | |
| //--- Folder : upgrades/ | |
| //--- Folder : zztest/ | |
| switch (appl.type) { | |
| case 'obcon_scada': | |
| default: | |
| await this.deploy_obcon_scada(); | |
| break; | |
| } | |
| //--- zip 파일 생성 | |
| let version = this._version.version.version.replace(/\./g, ''); | |
| let zipFilename = `${this._folderTarget}_${version}.zip`; | |
| this.makeZip(this._folderTarget, zipFilename); | |
| this._version.next(); | |
| this._version.write(); | |
| console.log(); | |
| } catch(err) { | |
| console.log('Error', err); | |
| } | |
| } | |
| async deploy_obcon_scada() { | |
| try { | |
| let filenames = []; | |
| //--- Folder : bin/ | |
| filenames = [ | |
| 'clearService.bash', 'watchfiles.js', 'findContent.js' | |
| ]; | |
| this.copyFolder('bin', 0, filenames); | |
| //--- Folder : conf/ | |
| filenames = [ | |
| 'config.js' | |
| ]; | |
| this.copyFolder('conf', 0, filenames); | |
| //--- Folder : custom/ | |
| //--- To-Do: 향후 해당 서비스에 해당하는 폴더만 복사할 것 | |
| this.copyFolder('custom', 0); | |
| //--- Folder : include/ | |
| this.copyFolder('include', 0); | |
| //--- Folder : interfaces/ | |
| filenames = [ | |
| 'interfaces.js', 'thing_plug.js' | |
| ]; | |
| this.copyFolder('interfaces', 0, filenames); | |
| this.copyFolder(path.join('interfaces', 'v100'), 4); | |
| this.copyFolder(path.join('interfaces', 'v101'), 4); | |
| this.copyFolder(path.join('interfaces', 'v102'), 4); | |
| //--- Folder : modules/ | |
| filenames = [ | |
| 'modules.js', | |
| 'http_app.js', | |
| 'tcp_app.js', 'tcp_server.js', 'tcp_server_client.js', | |
| 'udp_app.js', 'udp_server.js', | |
| 'mqtt_app.js', 'mqtt_client.js', | |
| 'proxy_client.js' | |
| ]; | |
| this.copyFolder('modules', 0, null, true); | |
| config.service.modules.forEach(folder => { | |
| this.copyFolder(path.join('modules', folder), 4); | |
| }); | |
| this.copyFolder(path.join('modules', 'batch'), 4); | |
| this.copyFolder(path.join('modules', 'markdowns'), 4); | |
| //--- Folder : openapis/ | |
| this.copyFolder('openapis', 0); | |
| //--- Folder : themes/ | |
| //--- To-Do: 향후 해당 서비스에 해당하는 폴더만 복사할 것 | |
| this.copyFolder('modules', 0, [], true); | |
| fs.existsSync(path.join(this._folderTarget, 'themes')) || fs.mkdirSync(path.join(this._folderTarget, 'themes')); | |
| this.copyFolder(path.join('themes', 'default'), 4); | |
| this.copyFolder(path.join('themes', 'service_scada_caprotec'), 4); | |
| this.copyFolder(path.join('themes', 'service_scada_ursc'), 4); | |
| this.copyFolder(path.join('themes', 'service_scada_techpalm'), 4); | |
| this.copyFolder(path.join('themes', 'theme_obcon_2021'), 4); | |
| } catch(err) { | |
| console.log('Error', err); | |
| } | |
| } | |
| } | |
| console.time('경과 시간'); | |
| console.group('Application 이름을 선택 하세요.'); | |
| console.log('%d. %cOBCon SCADA', 1, 'color:blue; font-size:40px;'); | |
| console.groupEnd(); | |
| let deploy = new Deploy('1'); | |
| // const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); | |
| // rl.on('line', async function(answer) { | |
| // rl.close(); | |
| // await deploy.deploy(); | |
| // console.timeEnd('경과 시간'); | |
| // }); | |
| deploy.deploy(); | |