obcon-scada / app /bin /deploy.js
chanmin0723
전체 동기화: 사진 3,395장(압축), 35일 측정데이터, 실사용 코드/에셋 전부
d6dbc7d
Raw
History Blame Contribute Delete
9.61 kB
'use strict'
/**
* 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();