Trying to deploy to WebApp with some improvements.

This commit is contained in:
Rodrigo Rodriguez 2018-09-24 19:56:11 -03:00
parent 5b869c7313
commit b94b9952aa
3 changed files with 147 additions and 150 deletions

View file

@ -75,160 +75,155 @@ export class GBDeployer {
) { ) {
let _this = this; let _this = this;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
try { let totalPackages = 0;
let totalPackages = 0; let additionalPath = GBConfigService.get("ADDITIONAL_DEPLOY_PATH");
let additionalPath = GBConfigService.get("ADDITIONAL_DEPLOY_PATH"); let paths = [GBDeployer.deployFolder];
let paths = [GBDeployer.deployFolder]; if (additionalPath) {
if (additionalPath) { paths = paths.concat(additionalPath.toLowerCase().split(";"));
paths = paths.concat(additionalPath.toLowerCase().split(";")); }
} let botPackages = new Array<string>();
let botPackages = new Array<string>(); let gbappPackages = new Array<string>();
let gbappPackages = new Array<string>(); let generalPackages = new Array<string>();
let generalPackages = new Array<string>();
function doIt(path) { function doIt(path) {
const isDirectory = source => Fs.lstatSync(source).isDirectory(); const isDirectory = source => Fs.lstatSync(source).isDirectory();
const getDirectories = source => const getDirectories = source =>
Fs.readdirSync(source) Fs.readdirSync(source)
.map(name => Path.join(source, name)) .map(name => Path.join(source, name))
.filter(isDirectory); .filter(isDirectory);
let dirs = getDirectories(path); let dirs = getDirectories(path);
dirs.forEach(element => { dirs.forEach(element => {
if (element.startsWith(".")) { if (element.startsWith(".")) {
logger.info(`Ignoring ${element}...`); logger.info(`Ignoring ${element}...`);
} else {
if (element.endsWith(".gbot")) {
botPackages.push(element);
} else if (element.endsWith(".gbapp")) {
gbappPackages.push(element);
} else {
generalPackages.push(element);
}
}
});
}
logger.info(
`Starting looking for packages (.gbot, .gbtheme, .gbkb, .gbapp)...`
);
paths.forEach(e => {
logger.info(`Looking in: ${e}...`);
doIt(e);
});
/** Deploys all .gbapp files first. */
let appPackagesProcessed = 0;
gbappPackages.forEach(e => {
// Skips .gbapp inside deploy folder.
if (!e.startsWith("deploy")) {
logger.info(`Deploying app: ${e}...`);
import(e)
.then(m => {
let p = new m.Package();
p.loadPackage(core, core.sequelize);
appPackages.push(p);
logger.info(`App (.gbapp) deployed: ${e}.`);
appPackagesProcessed++;
})
.catch(err => {
logger.error(`Error deploying App (.gbapp): ${e}: ${err}`);
appPackagesProcessed++;
});
} else { } else {
appPackagesProcessed++; if (element.endsWith(".gbot")) {
botPackages.push(element);
} else if (element.endsWith(".gbapp")) {
gbappPackages.push(element);
} else {
generalPackages.push(element);
}
} }
}); });
WaitUntil()
.interval(1000)
.times(10)
.condition(function(cb) {
logger.info(`Waiting for app package deployment...`);
cb(appPackagesProcessed == gbappPackages.length);
})
.done(async result => {
logger.info(`App Package deployment done.`);
try{
await core.syncDatabaseStructure();
}catch(e){
throw e;
}
/** Deploys all .gbot files first. */
botPackages.forEach(e => {
logger.info(`Deploying bot: ${e}...`);
_this.deployBot(e);
logger.info(`Bot: ${e} deployed...`);
});
/** Then all remaining generalPackages are loaded. */
generalPackages = generalPackages.filter(p => !p.endsWith(".git"));
generalPackages.forEach(filename => {
let filenameOnly = Path.basename(filename);
logger.info(`Deploying package: ${filename}...`);
/** Handles apps for general bots - .gbapp must stay out of deploy folder. */
if (
Path.extname(filename) === ".gbapp" ||
Path.extname(filename) === ".gblib"
) {
/** Themes for bots. */
} else if (Path.extname(filename) === ".gbtheme") {
server.use("/themes/" + filenameOnly, express.static(filename));
logger.info(
`Theme (.gbtheme) assets accessible at: ${"/themes/" +
filenameOnly}.`
);
/** Knowledge base for bots. */
} else if (Path.extname(filename) === ".gbkb") {
server.use(
"/kb/" + filenameOnly + "/subjects",
express.static(UrlJoin(filename, "subjects"))
);
logger.info(
`KB (.gbkb) assets accessible at: ${"/kb/" + filenameOnly}.`
);
} else if (Path.extname(filename) === ".gbui") {
// Already Handled
} else {
/** Unknown package format. */
let err = new Error(`Package type not handled: ${filename}.`);
reject(err);
}
totalPackages++;
});
WaitUntil()
.interval(100)
.times(5)
.condition(function(cb) {
logger.info(`Waiting for package deployment...`);
cb(totalPackages == generalPackages.length);
})
.done(function(result) {
if (botPackages.length === 0) {
logger.warn(
"The server is running with no bot instances, at least one .gbot file must be deployed."
);
} else {
logger.info(`Package deployment done.`);
}
resolve();
});
});
} catch (err) {
logger.error(err);
reject(err);
} }
logger.info(
`Starting looking for packages (.gbot, .gbtheme, .gbkb, .gbapp)...`
);
paths.forEach(e => {
logger.info(`Looking in: ${e}...`);
doIt(e);
});
/** Deploys all .gbapp files first. */
let appPackagesProcessed = 0;
gbappPackages.forEach(e => {
// Skips .gbapp inside deploy folder.
if (!e.startsWith("deploy")) {
logger.info(`Deploying app: ${e}...`);
import(e)
.then(m => {
let p = new m.Package();
p.loadPackage(core, core.sequelize);
appPackages.push(p);
logger.info(`App (.gbapp) deployed: ${e}.`);
appPackagesProcessed++;
})
.catch(err => {
logger.error(`Error deploying App (.gbapp): ${e}: ${err}`);
appPackagesProcessed++;
});
} else {
appPackagesProcessed++;
}
});
WaitUntil()
.interval(1000)
.times(10)
.condition(function(cb) {
logger.info(`Waiting for app package deployment...`);
cb(appPackagesProcessed == gbappPackages.length);
})
.done(async result => {
logger.info(`App Package deployment done.`);
try {
await core.syncDatabaseStructure();
} catch (e) {
throw e;
}
/** Deploys all .gbot files first. */
botPackages.forEach(e => {
logger.info(`Deploying bot: ${e}...`);
_this.deployBot(e);
logger.info(`Bot: ${e} deployed...`);
});
/** Then all remaining generalPackages are loaded. */
generalPackages = generalPackages.filter(p => !p.endsWith(".git"));
generalPackages.forEach(filename => {
let filenameOnly = Path.basename(filename);
logger.info(`Deploying package: ${filename}...`);
/** Handles apps for general bots - .gbapp must stay out of deploy folder. */
if (
Path.extname(filename) === ".gbapp" ||
Path.extname(filename) === ".gblib"
) {
/** Themes for bots. */
} else if (Path.extname(filename) === ".gbtheme") {
server.use("/themes/" + filenameOnly, express.static(filename));
logger.info(
`Theme (.gbtheme) assets accessible at: ${"/themes/" +
filenameOnly}.`
);
/** Knowledge base for bots. */
} else if (Path.extname(filename) === ".gbkb") {
server.use(
"/kb/" + filenameOnly + "/subjects",
express.static(UrlJoin(filename, "subjects"))
);
logger.info(
`KB (.gbkb) assets accessible at: ${"/kb/" + filenameOnly}.`
);
} else if (Path.extname(filename) === ".gbui") {
// Already Handled
} else {
/** Unknown package format. */
let err = new Error(`Package type not handled: ${filename}.`);
reject(err);
}
totalPackages++;
});
WaitUntil()
.interval(100)
.times(5)
.condition(function(cb) {
logger.info(`Waiting for package deployment...`);
cb(totalPackages == generalPackages.length);
})
.done(function(result) {
if (botPackages.length === 0) {
logger.warn(
"The server is running with no bot instances, at least one .gbot file must be deployed."
);
} else {
logger.info(`Package deployment done.`);
}
resolve();
});
});
}); });
} }

View file

@ -58,7 +58,7 @@
"request-promise-native": "^1.0.5", "request-promise-native": "^1.0.5",
"sequelize": "^4.38.1", "sequelize": "^4.38.1",
"sequelize-typescript": "^0.6.6", "sequelize-typescript": "^0.6.6",
"sqlite3": "^4.0.2", "sqlite3": "^3.1.13",
"swagger-client": "^3.8.21", "swagger-client": "^3.8.21",
"tedious": "^2.6.4", "tedious": "^2.6.4",
"url-join": "^4.0.0", "url-join": "^4.0.0",

View file

@ -156,6 +156,8 @@ export class GBServer {
throw `Operating storage is out of sync or there is a storage connection error. Try setting STORAGE_SYNC to true in .env file. Error: ${ throw `Operating storage is out of sync or there is a storage connection error. Try setting STORAGE_SYNC to true in .env file. Error: ${
error.message error.message
}.`; }.`;
} else {
throw `Cannot connect to operating storage: ${error.message}.`;
} }
} }
@ -178,7 +180,7 @@ export class GBServer {
return core; return core;
} catch (err) { } catch (err) {
logger.info(`STOP: ${err} ${err.stack ? err.stack : ""}`); logger.error(`STOP: ${err} ${err.stack ? err.stack : ""}`);
process.exit(1); process.exit(1);
} }
})(); })();