Trying to deploy to WebApp with some improvements.
This commit is contained in:
parent
5b869c7313
commit
b94b9952aa
3 changed files with 147 additions and 150 deletions
|
@ -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();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
Loading…
Add table
Reference in a new issue