mirror of
https://github.com/caprover/caprover
synced 2026-09-23 15:15:36 +00:00
deploy working
This commit is contained in:
@@ -15,116 +15,120 @@ const ValidationsHandler_1 = require("../utils/ValidationsHandler");
|
||||
const StorageHelper_1 = require("../utils/StorageHelper");
|
||||
const CliHelper_1 = require("../utils/CliHelper");
|
||||
const DeployHelper_1 = require("../utils/DeployHelper");
|
||||
// async function deployAsStateless(host: string, appName: string, branch: string, pass: string) {
|
||||
// const isStateless = host && appName && branch && pass;
|
||||
// if (isStateless) {
|
||||
// // login first
|
||||
// StdOutUtil.printMessage(`Trying to login to ${host}\n`);
|
||||
// const { name } = DeployApi.machineToDeploy;
|
||||
// const response = await LoginApi.loginMachine(host, pass);
|
||||
// const data = JSON.parse(response);
|
||||
// const newToken = data.token;
|
||||
// // Update the token to the machine that corresponds (if needed)
|
||||
// MachineHelper.updateMachineAuthToken(name, newToken);
|
||||
// if (data) {
|
||||
// StdOutUtil.printMessage(`Starting stateless deploy to\n${host}\n${branch}\n${appName}`);
|
||||
// deployFromGitProject();
|
||||
// }
|
||||
// } else {
|
||||
// StdOutUtil.printError(
|
||||
// 'You are missing parameters for deploying on stateless. <host> <password> <app name> <branch>'
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
// async function deployFromTarFile(tarFile: string) {
|
||||
// try {
|
||||
// const isValidAuthentication = await validateAuthentication();
|
||||
// if (isValidAuthentication) {
|
||||
// // Send from tar file
|
||||
// const filePath = tarFile;
|
||||
// const gitHash = 'sendviatarfile';
|
||||
// await uploadFile(filePath, gitHash);
|
||||
// } else {
|
||||
// StdOutUtil.printError('Incorrect login details', true);
|
||||
// }
|
||||
// } catch (e) {
|
||||
// StdOutUtil.printError(e.message, true);
|
||||
// }
|
||||
// }
|
||||
const CliApiManager_1 = require("../api/CliApiManager");
|
||||
function deploy(options) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
const possibleApp = StorageHelper_1.default.get()
|
||||
.getDeployedDirectories()
|
||||
.find((dir) => dir.cwd === process.cwd());
|
||||
if (!options.tarFile) {
|
||||
StdOutUtil_1.default.printMessage('Preparing deployment to Captain...\n');
|
||||
let deployParams = { deploySource: {} };
|
||||
if (options.default) {
|
||||
deployParams = {
|
||||
captainMachine: possibleApp ? StorageHelper_1.default.get().findMachine(possibleApp.machineNameToDeploy) : undefined,
|
||||
deploySource: possibleApp ? possibleApp.deploySource : {},
|
||||
appName: possibleApp ? possibleApp.appName : undefined
|
||||
};
|
||||
}
|
||||
if (options.appName) {
|
||||
deployParams.appName = options.appName;
|
||||
}
|
||||
if (options.branch) {
|
||||
deployParams.deploySource.branchToPush = options.branch;
|
||||
}
|
||||
if (options.tarFile) {
|
||||
deployParams.deploySource.tarFilePath = options.tarFile;
|
||||
}
|
||||
if (!deployParams.deploySource.tarFilePath) {
|
||||
if (!ValidationsHandler_1.validateIsGitRepository() || !ValidationsHandler_1.validateDefinitionFile()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
StdOutUtil_1.default.printMessage('Preparing deployment to Captain...\n');
|
||||
let deployParams = possibleApp
|
||||
? {
|
||||
captainNameToDeploy: possibleApp.machineNameToDeploy,
|
||||
branchToPush: possibleApp.branchToPush,
|
||||
appName: possibleApp.appName
|
||||
if (options.pass || options.host) {
|
||||
if (options.pass && options.host) {
|
||||
deployParams.captainMachine = {
|
||||
authToken: '',
|
||||
baseUrl: options.host,
|
||||
name: ''
|
||||
};
|
||||
yield CliApiManager_1.default.get(deployParams.captainMachine).getAuthToken(options.pass);
|
||||
}
|
||||
else {
|
||||
StdOutUtil_1.default.printError('host and pass should be either both defined or both undefined', true);
|
||||
return;
|
||||
}
|
||||
: {};
|
||||
if (options.default) {
|
||||
//deployAsDefaultValues();
|
||||
//}
|
||||
// else if (options.stateless) {
|
||||
// deployAsStateless(options.host, options.appName, options.branch, options.pass);
|
||||
// }
|
||||
// else if (options.tarFile) {
|
||||
// deployFromTarFile(options.tarFile);
|
||||
}
|
||||
else {
|
||||
// Show questions for what is being missing in deploy params
|
||||
let allApps = undefined;
|
||||
if (deployParams.captainMachine) {
|
||||
allApps = yield ValidationsHandler_1.ensureAuthentication(deployParams.captainMachine);
|
||||
}
|
||||
{
|
||||
const questions = [
|
||||
{
|
||||
type: 'list',
|
||||
name: 'captainNameToDeploy',
|
||||
default: possibleApp ? possibleApp.machineNameToDeploy : '',
|
||||
message: 'Select the Captain Machine you want to deploy to:',
|
||||
choices: CliHelper_1.default.get().getMachinesAsOptions()
|
||||
choices: CliHelper_1.default.get().getMachinesAsOptions(),
|
||||
when: () => !deployParams.captainMachine,
|
||||
filter: (capName) => __awaiter(this, void 0, void 0, function* () {
|
||||
deployParams.captainMachine = StorageHelper_1.default.get().findMachine(capName);
|
||||
if (deployParams.captainMachine)
|
||||
allApps = yield ValidationsHandler_1.ensureAuthentication(deployParams.captainMachine);
|
||||
return capName;
|
||||
})
|
||||
},
|
||||
{
|
||||
type: 'input',
|
||||
default: possibleApp ? possibleApp.branchToPush : 'master',
|
||||
default: possibleApp && possibleApp.deploySource.branchToPush
|
||||
? possibleApp.deploySource.branchToPush
|
||||
: 'master',
|
||||
name: 'branchToPush',
|
||||
message: "Enter the 'git' branch you would like to deploy:",
|
||||
when: (answers) => !!answers.captainNameToDeploy
|
||||
filter: (branchToPushEntered) => __awaiter(this, void 0, void 0, function* () {
|
||||
deployParams.deploySource.branchToPush = branchToPushEntered;
|
||||
return branchToPushEntered;
|
||||
}),
|
||||
when: (answers) => !deployParams.deploySource.branchToPush &&
|
||||
!deployParams.deploySource.tarFilePath &&
|
||||
!!deployParams.captainMachine
|
||||
},
|
||||
{
|
||||
type: 'input',
|
||||
type: 'list',
|
||||
default: possibleApp ? possibleApp.appName : '',
|
||||
name: 'appName',
|
||||
message: 'Enter the Captain app name this directory will be deployed to:',
|
||||
when: (answers) => !!answers.branchToPush
|
||||
choices: (answers) => {
|
||||
return CliHelper_1.default.get().getAppsAsOptions(allApps);
|
||||
},
|
||||
filter: (appNameEntered) => __awaiter(this, void 0, void 0, function* () {
|
||||
deployParams.appName = appNameEntered;
|
||||
return appNameEntered;
|
||||
}),
|
||||
when: (answers) => (!!deployParams.deploySource.branchToPush || !!deployParams.deploySource.tarFilePath) &&
|
||||
!deployParams.appName
|
||||
},
|
||||
{
|
||||
type: 'confirm',
|
||||
name: 'confirmedToDeploy',
|
||||
message: 'Note that uncommitted files and files in gitignore (if any) will not be pushed to server. Please confirm so that deployment process can start.',
|
||||
default: true,
|
||||
when: (answers) => !!answers.appName
|
||||
when: (answers) => !!deployParams.appName &&
|
||||
!!deployParams.captainMachine &&
|
||||
(!!deployParams.deploySource.branchToPush || !!deployParams.deploySource.tarFilePath)
|
||||
}
|
||||
];
|
||||
const answers = (yield inquirer.prompt(questions));
|
||||
if (!answers.confirmedToDeploy) {
|
||||
const answersToIgnore = (yield inquirer.prompt(questions));
|
||||
if (!answersToIgnore.confirmedToDeploy) {
|
||||
StdOutUtil_1.default.printMessage('\nOperation cancelled by the user...\n');
|
||||
process.exit(0);
|
||||
return;
|
||||
}
|
||||
deployParams = answers;
|
||||
}
|
||||
const branchToPush = deployParams.branchToPush;
|
||||
const appName = deployParams.appName;
|
||||
const capMachine = StorageHelper_1.default.get()
|
||||
.getMachines()
|
||||
.find((machine) => machine.name === deployParams.captainNameToDeploy);
|
||||
try {
|
||||
yield new DeployHelper_1.default(capMachine, appName, branchToPush) //
|
||||
.deployFromGitProject();
|
||||
yield new DeployHelper_1.default(deployParams) //
|
||||
.startDeploy();
|
||||
}
|
||||
catch (e) {
|
||||
StdOutUtil_1.default.printError(e.message, true);
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
||||
@@ -8,6 +8,23 @@ class CliHelper {
|
||||
CliHelper.instance = new CliHelper();
|
||||
return CliHelper.instance;
|
||||
}
|
||||
getAppsAsOptions(apps) {
|
||||
const firstItemInOption = [
|
||||
{
|
||||
name: '-- CANCEL --',
|
||||
value: '',
|
||||
short: ''
|
||||
}
|
||||
];
|
||||
const listOfApps = apps.map((app) => {
|
||||
return {
|
||||
name: `${app.appName}`,
|
||||
value: `${app.appName}`,
|
||||
short: `${app.appName}`
|
||||
};
|
||||
});
|
||||
return [...firstItemInOption, ...listOfApps];
|
||||
}
|
||||
getMachinesAsOptions() {
|
||||
const machines = StorageHelper_1.default.get().getMachines();
|
||||
const firstItemInOption = [
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"CliHelper.js","sourceRoot":"","sources":["../../src/utils/CliHelper.ts"],"names":[],"mappings":";;AAAA,mDAA4C;AAE5C,6CAAsC;AAEtC,MAAqB,SAAS;IAG7B,MAAM,CAAC,GAAG;QACT,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,SAAS,CAAC,QAAQ,GAAG,IAAI,SAAS,EAAE,CAAC;QAC9D,OAAO,SAAS,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAED,oBAAoB;QACnB,MAAM,QAAQ,GAAG,uBAAa,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAA;QAClD,MAAM,iBAAiB,GAAG;YACzB;gBACC,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,EAAE;aACT;SACD,CAAC;QACF,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAC/C,OAAO;gBACN,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,OAAO,EAAE;gBAC7C,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE;gBACxB,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,OAAO,EAAE;aAC9C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAE,GAAG,iBAAiB,EAAE,GAAG,cAAc,CAAE,CAAC;IACpD,CAAC;IAED,aAAa,CAAC,WAAmB;QAChC,MAAM,cAAc,GAAI,uBAAa,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACvE,oBAAU,CAAE,YAAY,CAAC,+BAA+B,cAAc,CAAC,IAAI,OAAO,cAAc,CAAC,OAAO,OAAO,CAAC,CAAC;IAClH,CAAC;IAGD,sBAAsB;QACrB,IAAI,aAAa,GAAG,uBAAa,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC;QAElB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE;YAC1C,aAAa,EAAE,CAAC;SAChB;QAED,OAAO,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC;IAED,kBAAkB,CAAC,MAAc;QAChC,MAAM,YAAY,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAEzD,OAAO,WAAW,YAAY,EAAE,CAAC;IAClC,CAAC;IAED,aAAa,CAAC,YAAoB;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC;QAClB,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,uBAAa,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,OAAiB,EAAE,EAAE;YAC3D,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE;gBAC3D,KAAK,GAAG,KAAK,CAAC;aACd;QACF,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACd,CAAC;CACD;AA9DD,4BA8DC"}
|
||||
{"version":3,"file":"CliHelper.js","sourceRoot":"","sources":["../../src/utils/CliHelper.ts"],"names":[],"mappings":"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"}
|
||||
@@ -15,36 +15,41 @@ const child_process_1 = require("child_process");
|
||||
const StdOutUtil_1 = require("../utils/StdOutUtil");
|
||||
const ProgressBar = require('progress');
|
||||
const commandExistsSync = require('command-exists').sync;
|
||||
const ValidationsHandler_1 = require("../utils/ValidationsHandler");
|
||||
const CliApiManager_1 = require("../api/CliApiManager");
|
||||
const SpinnerHelper_1 = require("../utils/SpinnerHelper");
|
||||
class DeployHelper {
|
||||
constructor(machineToDeploy, appName, branchToPush) {
|
||||
this.machineToDeploy = machineToDeploy;
|
||||
this.appName = appName;
|
||||
this.branchToPush = branchToPush;
|
||||
constructor(deployParams) {
|
||||
this.deployParams = deployParams;
|
||||
this.lastLineNumberPrinted = -10000; // we want to show all lines to begin with!
|
||||
//
|
||||
}
|
||||
gitArchiveFile(zipFileFullPath) {
|
||||
gitArchiveFile(zipFileFullPath, branchToPush) {
|
||||
const self = this;
|
||||
return new Promise(function (resolve, reject) {
|
||||
child_process_1.exec(`git archive --format tar --output "${zipFileFullPath}" ${self.branchToPush}`, (err, stdout, stderr) => {
|
||||
// Removes the temporary file created
|
||||
if (fs.pathExistsSync(zipFileFullPath))
|
||||
fs.removeSync(zipFileFullPath);
|
||||
if (!commandExistsSync('git')) {
|
||||
StdOutUtil_1.default.printError("'git' command not found...\nCaptain needs 'git' to create tar file of your source files...", true);
|
||||
reject("Captain needs 'git' to create tar file of your source files...");
|
||||
return;
|
||||
}
|
||||
child_process_1.exec(`git archive --format tar --output "${zipFileFullPath}" ${branchToPush}`, (err, stdout, stderr) => {
|
||||
if (err) {
|
||||
StdOutUtil_1.default.printError(`TAR file failed\n${err}\n`);
|
||||
fs.removeSync(zipFileFullPath);
|
||||
reject(new Error('TAR file failed'));
|
||||
return;
|
||||
}
|
||||
child_process_1.exec(`git rev-parse ${self.branchToPush}`, (err, stdout, stderr) => {
|
||||
child_process_1.exec(`git rev-parse ${branchToPush}`, (err, stdout, stderr) => {
|
||||
const gitHash = (stdout || '').trim();
|
||||
if (err || !/^[a-f0-9]{40}$/.test(gitHash)) {
|
||||
StdOutUtil_1.default.printError(`Cannot find hash of last commit on this branch: ${self.branchToPush}\n${gitHash}\n${err}\n`);
|
||||
StdOutUtil_1.default.printError(`Cannot find hash of last commit on this branch: ${branchToPush}\n${gitHash}\n${err}\n`);
|
||||
reject(new Error('rev-parse failed'));
|
||||
return;
|
||||
}
|
||||
StdOutUtil_1.default.printMessage(`Pushing last commit on ${self.branchToPush}: ${gitHash}`);
|
||||
resolve();
|
||||
StdOutUtil_1.default.printMessage(`Pushing last commit on ${branchToPush}: ${gitHash}`);
|
||||
resolve(gitHash);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -63,50 +68,55 @@ class DeployHelper {
|
||||
});
|
||||
fileStream.on('end', () => {
|
||||
StdOutUtil_1.default.printMessage('This might take several minutes. PLEASE BE PATIENT...');
|
||||
SpinnerHelper_1.default.start('Building your source code...');
|
||||
SpinnerHelper_1.default.start('Building your source code...\n');
|
||||
SpinnerHelper_1.default.setColor('yellow');
|
||||
});
|
||||
return fileStream;
|
||||
}
|
||||
deployFromGitProject() {
|
||||
startDeploy() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
const appName = this.appName;
|
||||
const branchToPush = this.branchToPush;
|
||||
const machineToDeploy = this.machineToDeploy;
|
||||
if (!appName || !branchToPush || !machineToDeploy) {
|
||||
StdOutUtil_1.default.printError('Default deploy failed. Missing appName or branchToPush or machineToDeploy.', true);
|
||||
const appName = this.deployParams.appName;
|
||||
const branchToPush = this.deployParams.deploySource.branchToPush;
|
||||
const tarFilePath = this.deployParams.deploySource.tarFilePath;
|
||||
const machineToDeploy = this.deployParams.captainMachine;
|
||||
if (!appName || (!branchToPush && !tarFilePath) || !machineToDeploy) {
|
||||
StdOutUtil_1.default.printError('Default deploy failed. Missing appName or branchToPush/tarFilePath or machineToDeploy.', true);
|
||||
return;
|
||||
}
|
||||
if (!commandExistsSync('git')) {
|
||||
StdOutUtil_1.default.printError("'git' command not found...");
|
||||
StdOutUtil_1.default.printError("Captain needs 'git' to create tar file of your source files...", true);
|
||||
if (branchToPush && tarFilePath) {
|
||||
StdOutUtil_1.default.printError('Default deploy failed. branchToPush/tarFilePath cannot both be present.', true);
|
||||
return;
|
||||
}
|
||||
let tarFileCreatedByCli = false;
|
||||
const tarFileNameToDeploy = tarFilePath ? tarFilePath : 'temporary-captain-to-deploy.tar';
|
||||
const tarFileFullPath = tarFileNameToDeploy.startsWith('/')
|
||||
? tarFileNameToDeploy // absolute path
|
||||
: path.join(process.cwd(), tarFileNameToDeploy); // relative path
|
||||
let gitHash = '';
|
||||
if (branchToPush) {
|
||||
tarFileCreatedByCli = true;
|
||||
StdOutUtil_1.default.printMessage(`Saving tar file to:\n${tarFileFullPath}\n`);
|
||||
gitHash = yield this.gitArchiveFile(tarFileFullPath, branchToPush);
|
||||
}
|
||||
StdOutUtil_1.default.printMessage(`Deploying ${appName} to ${machineToDeploy.name}`);
|
||||
yield ValidationsHandler_1.ensureAuthentication(machineToDeploy);
|
||||
const zipFileNameToDeploy = 'temporary-captain-to-deploy.tar';
|
||||
const zipFileFullPath = path.join(process.cwd(), zipFileNameToDeploy);
|
||||
StdOutUtil_1.default.printMessage(`Saving tar file to:\n${zipFileFullPath}\n`);
|
||||
// Removes the temporary file created
|
||||
if (fs.pathExistsSync(zipFileFullPath))
|
||||
fs.removeSync(zipFileFullPath);
|
||||
yield this.gitArchiveFile(zipFileFullPath);
|
||||
try {
|
||||
StdOutUtil_1.default.printMessage(`Uploading the file to ${machineToDeploy.baseUrl}`);
|
||||
yield CliApiManager_1.default.get(machineToDeploy).uploadAppData(appName, this.getFileStream(zipFileFullPath));
|
||||
yield CliApiManager_1.default.get(machineToDeploy).uploadAppData(appName, this.getFileStream(tarFileFullPath));
|
||||
StdOutUtil_1.default.printMessage(`Upload done.`);
|
||||
fs.removeSync(zipFileFullPath);
|
||||
if (tarFileCreatedByCli && fs.pathExistsSync(tarFileFullPath))
|
||||
fs.removeSync(tarFileFullPath);
|
||||
this.startFetchingBuildLogs(machineToDeploy, appName);
|
||||
}
|
||||
catch (e) {
|
||||
if (fs.pathExistsSync(zipFileFullPath))
|
||||
fs.removeSync(zipFileFullPath);
|
||||
if (tarFileCreatedByCli && fs.pathExistsSync(tarFileFullPath))
|
||||
fs.removeSync(tarFileFullPath);
|
||||
throw e;
|
||||
}
|
||||
});
|
||||
}
|
||||
onLogRetrieved(data, machineToDeploy, appName) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
const self = this;
|
||||
if (data) {
|
||||
const lines = data.logs.lines;
|
||||
const firstLineNumberOfLogs = data.logs.firstLineNumber;
|
||||
@@ -130,8 +140,11 @@ class DeployHelper {
|
||||
}
|
||||
if (data && !data.isAppBuilding) {
|
||||
if (!data.isBuildFailed) {
|
||||
const appUrl = self.deployParams.captainMachine.baseUrl
|
||||
.replace('https://', 'http://')
|
||||
.replace('//captain.', '//' + appName + '.');
|
||||
StdOutUtil_1.default.printGreenMessage(`Deployed successfully: ${appName}`);
|
||||
StdOutUtil_1.default.printMagentaMessage(`App is available`, true); // TODO add url
|
||||
StdOutUtil_1.default.printMagentaMessage(`App is available at ${appUrl}`, true);
|
||||
}
|
||||
else {
|
||||
StdOutUtil_1.default.printError(`\nSomething bad happened. Cannot deploy "${appName}"\n`, true);
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -17,6 +17,9 @@ class StorageHelper {
|
||||
getMachines() {
|
||||
return Utils_1.default.copyObject(this.data.get(CAP_MACHINES) || []);
|
||||
}
|
||||
findMachine(machineName) {
|
||||
return this.getMachines().find((m) => m.name === machineName);
|
||||
}
|
||||
removeMachine(machineName) {
|
||||
const machines = this.getMachines();
|
||||
const removedMachine = machines.filter((machine) => machine.name === machineName)[0];
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"StorageHelper.js","sourceRoot":"","sources":["../../src/utils/StorageHelper.ts"],"names":[],"mappings":";;AACA,2CAA2C;AAC3C,mCAA4B;AAE5B,MAAM,YAAY,GAAG,aAAa,CAAC;AACnC,MAAM,aAAa,GAAG,cAAc,CAAC;AAErC,MAAqB,aAAa;IAGjC,MAAM,CAAC,GAAG;QACT,IAAI,CAAC,aAAa,CAAC,QAAQ;YAAE,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC1E,OAAO,aAAa,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAID;QACC,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CAAC,qBAAqB,CAAC,CAAC;QACnD,qBAAqB;IACtB,CAAC;IAED,WAAW;QACV,OAAO,eAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,aAAa,CAAC,WAAmB;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAEzC,OAAO,cAAc,CAAC;IACvB,CAAC;IAED,WAAW,CAAC,qBAA+B;QAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACxC,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACzD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,OAAO,CAAC,IAAI,KAAK,qBAAqB,CAAC,IAAI,EAAE;gBAChD,cAAc,GAAG,IAAI,CAAC;gBACtB,YAAY,CAAC,KAAK,CAAC,GAAG,qBAAqB,CAAC;gBAC5C,MAAM;aACN;SACD;QAED,IAAI,CAAC,cAAc,EAAE;YACpB,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;SACzC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC3C,CAAC;IAED,sBAAsB;QACrB,OAAO,eAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,qBAAqB,CAAC,uBAA2C;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC/C,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,OAAO,CAAC,GAAG,KAAK,uBAAuB,CAAC,GAAG,EAAE;gBAChD,UAAU,GAAG,IAAI,CAAC;gBAClB,QAAQ,CAAC,KAAK,CAAC,GAAG,uBAAuB,CAAC;gBAC1C,MAAM;aACN;SACD;QAED,IAAI,CAAC,UAAU,EAAE;YAChB,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;SACvC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;CACD;AArED,gCAqEC"}
|
||||
{"version":3,"file":"StorageHelper.js","sourceRoot":"","sources":["../../src/utils/StorageHelper.ts"],"names":[],"mappings":";;AACA,2CAA2C;AAC3C,mCAA4B;AAE5B,MAAM,YAAY,GAAG,aAAa,CAAC;AACnC,MAAM,aAAa,GAAG,cAAc,CAAC;AAErC,MAAqB,aAAa;IAGjC,MAAM,CAAC,GAAG;QACT,IAAI,CAAC,aAAa,CAAC,QAAQ;YAAE,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC1E,OAAO,aAAa,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAID;QACC,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CAAC,qBAAqB,CAAC,CAAC;QACnD,qBAAqB;IACtB,CAAC;IAED,WAAW;QACV,OAAO,eAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,WAAW,CAAC,WAAmB;QAC9B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;IAC/D,CAAC;IAED,aAAa,CAAC,WAAmB;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAEzC,OAAO,cAAc,CAAC;IACvB,CAAC;IAED,WAAW,CAAC,qBAA+B;QAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACxC,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACzD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,OAAO,CAAC,IAAI,KAAK,qBAAqB,CAAC,IAAI,EAAE;gBAChD,cAAc,GAAG,IAAI,CAAC;gBACtB,YAAY,CAAC,KAAK,CAAC,GAAG,qBAAqB,CAAC;gBAC5C,MAAM;aACN;SACD;QAED,IAAI,CAAC,cAAc,EAAE;YACpB,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;SACzC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC3C,CAAC;IAED,sBAAsB;QACrB,OAAO,eAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,qBAAqB,CAAC,uBAA2C;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC/C,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,OAAO,CAAC,GAAG,KAAK,uBAAuB,CAAC,GAAG,EAAE;gBAChD,UAAU,GAAG,IAAI,CAAC;gBAClB,QAAQ,CAAC,KAAK,CAAC,GAAG,uBAAuB,CAAC;gBAC1C,MAAM;aACN;SACD;QAED,IAAI,CAAC,UAAU,EAAE;YAChB,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;SACvC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;CACD;AAzED,gCAyEC"}
|
||||
@@ -62,16 +62,18 @@ exports.isIpAddress = isIpAddress;
|
||||
function ensureAuthentication(machine) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
let isAuthenticated = false;
|
||||
let allApps = undefined;
|
||||
try {
|
||||
let ignoreVal = yield CliApiManager_1.default.get(machine).getAllApps();
|
||||
isAuthenticated = true;
|
||||
allApps = yield CliApiManager_1.default.get(machine).getAllApps();
|
||||
}
|
||||
catch (e) {
|
||||
// ignore
|
||||
}
|
||||
if (!isAuthenticated) {
|
||||
if (!allApps) {
|
||||
const loggedInStatus = yield requestLogin_1.default(machine);
|
||||
allApps = yield CliApiManager_1.default.get(machine).getAllApps();
|
||||
}
|
||||
return allApps;
|
||||
});
|
||||
}
|
||||
exports.ensureAuthentication = ensureAuthentication;
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"ValidationsHandler.js","sourceRoot":"","sources":["../../src/utils/ValidationsHandler.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,6CAAsC;AAEtC,wDAAiD;AACjD,2DAAoD;AAEpD,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAE/B,SAAgB,uBAAuB;IACtC,MAAM,eAAe,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAEpD,IAAI,CAAC,eAAe,EAAE;QACrB,oBAAU,CAAC,UAAU,CACpB,gHAAgH,EAChH,IAAI,CACJ,CAAC;KACF;IAED,OAAO,CAAC,CAAC,eAAe,CAAC;AAC1B,CAAC;AAXD,0DAWC;AAED,SAAgB,sBAAsB;IACrC,MAAM,uBAAuB,GAAG,EAAE,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC;IAE1E,IAAI,CAAC,uBAAuB,EAAE;QAC7B,oBAAU,CAAC,UAAU,CAAC,gFAAgF,EAAE,IAAI,CAAC,CAAC;KAC9G;SAAM;QACN,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,YAAY,GAAG,IAAI,CAAC;QAExB,IAAI;YACH,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;SACpC;QAAC,OAAO,CAAC,EAAE;YACX,oBAAU,CAAC,UAAU,CAAC,yEAAyE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;SAC1G;QAED,IAAI,YAAY,EAAE;YACjB,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;gBAChC,oBAAU,CAAC,UAAU,CACpB,2EAA2E,EAC3E,IAAI,CACJ,CAAC;aACF;iBAAM,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE;gBACrE,oBAAU,CAAC,UAAU,CACpB,2FAA2F,EAC3F,IAAI,CACJ,CAAC;aACF;iBAAM,IAAI,YAAY,CAAC,UAAU,IAAI,YAAY,CAAC,eAAe,EAAE;gBACnE,oBAAU,CAAC,UAAU,CACpB,qGAAqG,EACrG,IAAI,CACJ,CAAC;aACF;iBAAM;gBACN,OAAO,IAAI,CAAC;aACZ;SACD;KACD;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAtCD,wDAsCC;AAED,SAAgB,WAAW,CAAC,SAAiB;IAC5C,IACC,kKAAkK,CAAC,IAAI,CACtK,SAAS,CACT,EACA;QACD,OAAO,IAAI,CAAC;KACZ;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAVD,kCAUC;AACD,SAAsB,oBAAoB,CAAC,OAAiB;;QAC3D,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI;YACH,IAAI,SAAS,GAAG,MAAM,uBAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;YAC9D,eAAe,GAAG,IAAI,CAAC;SACvB;QAAC,OAAO,CAAC,EAAE;YACX,SAAS;SACT;QAED,IAAI,CAAC,eAAe,EAAE;YACrB,MAAM,cAAc,GAAG,MAAM,sBAAY,CAAC,OAAO,CAAC,CAAC;SACnD;IACF,CAAC;CAAA;AAZD,oDAYC"}
|
||||
{"version":3,"file":"ValidationsHandler.js","sourceRoot":"","sources":["../../src/utils/ValidationsHandler.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,6CAAsC;AAEtC,wDAAiD;AACjD,2DAAoD;AAEpD,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAE/B,SAAgB,uBAAuB;IACtC,MAAM,eAAe,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAEpD,IAAI,CAAC,eAAe,EAAE;QACrB,oBAAU,CAAC,UAAU,CACpB,gHAAgH,EAChH,IAAI,CACJ,CAAC;KACF;IAED,OAAO,CAAC,CAAC,eAAe,CAAC;AAC1B,CAAC;AAXD,0DAWC;AAED,SAAgB,sBAAsB;IACrC,MAAM,uBAAuB,GAAG,EAAE,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC;IAE1E,IAAI,CAAC,uBAAuB,EAAE;QAC7B,oBAAU,CAAC,UAAU,CAAC,gFAAgF,EAAE,IAAI,CAAC,CAAC;KAC9G;SAAM;QACN,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,YAAY,GAAG,IAAI,CAAC;QAExB,IAAI;YACH,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;SACpC;QAAC,OAAO,CAAC,EAAE;YACX,oBAAU,CAAC,UAAU,CAAC,yEAAyE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;SAC1G;QAED,IAAI,YAAY,EAAE;YACjB,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;gBAChC,oBAAU,CAAC,UAAU,CACpB,2EAA2E,EAC3E,IAAI,CACJ,CAAC;aACF;iBAAM,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE;gBACrE,oBAAU,CAAC,UAAU,CACpB,2FAA2F,EAC3F,IAAI,CACJ,CAAC;aACF;iBAAM,IAAI,YAAY,CAAC,UAAU,IAAI,YAAY,CAAC,eAAe,EAAE;gBACnE,oBAAU,CAAC,UAAU,CACpB,qGAAqG,EACrG,IAAI,CACJ,CAAC;aACF;iBAAM;gBACN,OAAO,IAAI,CAAC;aACZ;SACD;KACD;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAtCD,wDAsCC;AAED,SAAgB,WAAW,CAAC,SAAiB;IAC5C,IACC,kKAAkK,CAAC,IAAI,CACtK,SAAS,CACT,EACA;QACD,OAAO,IAAI,CAAC;KACZ;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAVD,kCAUC;AACD,SAAsB,oBAAoB,CAAC,OAAiB;;QAC3D,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,OAAO,GAAG,SAAS,CAAC;QACxB,IAAI;YACH,OAAO,GAAG,MAAM,uBAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;SACxD;QAAC,OAAO,CAAC,EAAE;YACX,SAAS;SACT;QAED,IAAI,CAAC,OAAO,EAAE;YACb,MAAM,cAAc,GAAG,MAAM,sBAAY,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,GAAG,MAAM,uBAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;SACxD;QAED,OAAO,OAAO,CAAA;IACf,CAAC;CAAA;AAfD,oDAeC"}
|
||||
@@ -3,108 +3,115 @@
|
||||
import * as inquirer from 'inquirer';
|
||||
import StdOutUtil from '../utils/StdOutUtil';
|
||||
import { validateIsGitRepository, validateDefinitionFile, ensureAuthentication } from '../utils/ValidationsHandler';
|
||||
import { IMachine, IDeployedDirectory } from '../models/storage/StoredObjects';
|
||||
import { IMachine, IDeployedDirectory, IDeploySource, IDeployParams } from '../models/storage/StoredObjects';
|
||||
import StorageHelper from '../utils/StorageHelper';
|
||||
import CliHelper from '../utils/CliHelper';
|
||||
import { IHashMapGeneric } from '../models/IHashMapGeneric';
|
||||
import DeployHelper from '../utils/DeployHelper';
|
||||
|
||||
// async function deployAsStateless(host: string, appName: string, branch: string, pass: string) {
|
||||
// const isStateless = host && appName && branch && pass;
|
||||
|
||||
// if (isStateless) {
|
||||
// // login first
|
||||
// StdOutUtil.printMessage(`Trying to login to ${host}\n`);
|
||||
|
||||
// const { name } = DeployApi.machineToDeploy;
|
||||
// const response = await LoginApi.loginMachine(host, pass);
|
||||
// const data = JSON.parse(response);
|
||||
// const newToken = data.token;
|
||||
|
||||
// // Update the token to the machine that corresponds (if needed)
|
||||
// MachineHelper.updateMachineAuthToken(name, newToken);
|
||||
|
||||
// if (data) {
|
||||
// StdOutUtil.printMessage(`Starting stateless deploy to\n${host}\n${branch}\n${appName}`);
|
||||
|
||||
// deployFromGitProject();
|
||||
// }
|
||||
// } else {
|
||||
// StdOutUtil.printError(
|
||||
// 'You are missing parameters for deploying on stateless. <host> <password> <app name> <branch>'
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
// async function deployFromTarFile(tarFile: string) {
|
||||
// try {
|
||||
// const isValidAuthentication = await validateAuthentication();
|
||||
|
||||
// if (isValidAuthentication) {
|
||||
// // Send from tar file
|
||||
// const filePath = tarFile;
|
||||
// const gitHash = 'sendviatarfile';
|
||||
|
||||
// await uploadFile(filePath, gitHash);
|
||||
// } else {
|
||||
// StdOutUtil.printError('Incorrect login details', true);
|
||||
// }
|
||||
// } catch (e) {
|
||||
// StdOutUtil.printError(e.message, true);
|
||||
// }
|
||||
// }
|
||||
import CliApiManager from '../api/CliApiManager';
|
||||
|
||||
async function deploy(options: any) {
|
||||
const possibleApp = StorageHelper.get()
|
||||
.getDeployedDirectories()
|
||||
.find((dir: IDeployedDirectory) => dir.cwd === process.cwd());
|
||||
|
||||
if (!options.tarFile) {
|
||||
StdOutUtil.printMessage('Preparing deployment to Captain...\n');
|
||||
|
||||
let deployParams: IDeployParams = { deploySource: {} };
|
||||
|
||||
if (options.default) {
|
||||
deployParams = {
|
||||
captainMachine: possibleApp ? StorageHelper.get().findMachine(possibleApp.machineNameToDeploy) : undefined,
|
||||
deploySource: possibleApp ? possibleApp.deploySource : {},
|
||||
appName: possibleApp ? possibleApp.appName : undefined
|
||||
};
|
||||
}
|
||||
|
||||
if (options.appName) {
|
||||
deployParams.appName = options.appName;
|
||||
}
|
||||
|
||||
if (options.branch) {
|
||||
deployParams.deploySource.branchToPush = options.branch;
|
||||
}
|
||||
|
||||
if (options.tarFile) {
|
||||
deployParams.deploySource.tarFilePath = options.tarFile;
|
||||
}
|
||||
|
||||
if (!deployParams.deploySource.tarFilePath) {
|
||||
if (!validateIsGitRepository() || !validateDefinitionFile()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
StdOutUtil.printMessage('Preparing deployment to Captain...\n');
|
||||
if (options.pass || options.host) {
|
||||
if (options.pass && options.host) {
|
||||
deployParams.captainMachine = {
|
||||
authToken: '',
|
||||
baseUrl: options.host,
|
||||
name: ''
|
||||
};
|
||||
await CliApiManager.get(deployParams.captainMachine).getAuthToken(options.pass);
|
||||
} else {
|
||||
StdOutUtil.printError('host and pass should be either both defined or both undefined', true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
let deployParams: IHashMapGeneric<string> = possibleApp
|
||||
? {
|
||||
captainNameToDeploy: possibleApp.machineNameToDeploy,
|
||||
branchToPush: possibleApp.branchToPush,
|
||||
appName: possibleApp.appName
|
||||
}
|
||||
: {};
|
||||
// Show questions for what is being missing in deploy params
|
||||
let allApps: any = undefined;
|
||||
if (deployParams.captainMachine) {
|
||||
allApps = await ensureAuthentication(deployParams.captainMachine);
|
||||
}
|
||||
|
||||
if (options.default) { // TODO
|
||||
//deployAsDefaultValues();
|
||||
//}
|
||||
// else if (options.stateless) {
|
||||
// deployAsStateless(options.host, options.appName, options.branch, options.pass);
|
||||
// }
|
||||
// else if (options.tarFile) {
|
||||
// deployFromTarFile(options.tarFile);
|
||||
} else {
|
||||
{
|
||||
const questions = [
|
||||
{
|
||||
type: 'list',
|
||||
name: 'captainNameToDeploy',
|
||||
default: possibleApp ? possibleApp.machineNameToDeploy : '',
|
||||
message: 'Select the Captain Machine you want to deploy to:',
|
||||
choices: CliHelper.get().getMachinesAsOptions()
|
||||
choices: CliHelper.get().getMachinesAsOptions(),
|
||||
when: () => !deployParams.captainMachine,
|
||||
filter: async (capName: string) => {
|
||||
deployParams.captainMachine = StorageHelper.get().findMachine(capName);
|
||||
if (deployParams.captainMachine) allApps = await ensureAuthentication(deployParams.captainMachine);
|
||||
return capName;
|
||||
}
|
||||
},
|
||||
{
|
||||
type: 'input',
|
||||
default: possibleApp ? possibleApp.branchToPush : 'master',
|
||||
default:
|
||||
possibleApp && possibleApp.deploySource.branchToPush
|
||||
? possibleApp.deploySource.branchToPush
|
||||
: 'master',
|
||||
name: 'branchToPush',
|
||||
message: "Enter the 'git' branch you would like to deploy:",
|
||||
when: (answers: IHashMapGeneric<string>) => !!answers.captainNameToDeploy
|
||||
filter: async (branchToPushEntered: string) => {
|
||||
deployParams.deploySource.branchToPush = branchToPushEntered;
|
||||
return branchToPushEntered;
|
||||
},
|
||||
when: (answers: IHashMapGeneric<string>) =>
|
||||
!deployParams.deploySource.branchToPush &&
|
||||
!deployParams.deploySource.tarFilePath &&
|
||||
!!deployParams.captainMachine
|
||||
},
|
||||
{
|
||||
type: 'input',
|
||||
type: 'list',
|
||||
default: possibleApp ? possibleApp.appName : '',
|
||||
name: 'appName',
|
||||
message: 'Enter the Captain app name this directory will be deployed to:',
|
||||
when: (answers: IHashMapGeneric<string>) => !!answers.branchToPush
|
||||
choices: (answers: IHashMapGeneric<string>) => {
|
||||
return CliHelper.get().getAppsAsOptions(allApps);
|
||||
},
|
||||
filter: async (appNameEntered: string) => {
|
||||
deployParams.appName = appNameEntered;
|
||||
return appNameEntered;
|
||||
},
|
||||
when: (answers: IHashMapGeneric<string>) =>
|
||||
(!!deployParams.deploySource.branchToPush || !!deployParams.deploySource.tarFilePath) &&
|
||||
!deployParams.appName
|
||||
},
|
||||
{
|
||||
type: 'confirm',
|
||||
@@ -112,28 +119,24 @@ async function deploy(options: any) {
|
||||
message:
|
||||
'Note that uncommitted files and files in gitignore (if any) will not be pushed to server. Please confirm so that deployment process can start.',
|
||||
default: true,
|
||||
when: (answers: IHashMapGeneric<string>) => !!answers.appName
|
||||
when: (answers: IHashMapGeneric<string>) =>
|
||||
!!deployParams.appName &&
|
||||
!!deployParams.captainMachine &&
|
||||
(!!deployParams.deploySource.branchToPush || !!deployParams.deploySource.tarFilePath)
|
||||
}
|
||||
];
|
||||
const answers = (await inquirer.prompt(questions)) as IHashMapGeneric<string>;
|
||||
const answersToIgnore = (await inquirer.prompt(questions)) as IHashMapGeneric<string>;
|
||||
|
||||
if (!answers.confirmedToDeploy) {
|
||||
if (!answersToIgnore.confirmedToDeploy) {
|
||||
StdOutUtil.printMessage('\nOperation cancelled by the user...\n');
|
||||
process.exit(0);
|
||||
return;
|
||||
}
|
||||
deployParams = answers;
|
||||
}
|
||||
|
||||
const branchToPush = deployParams.branchToPush;
|
||||
const appName = deployParams.appName;
|
||||
const capMachine = StorageHelper.get()
|
||||
.getMachines()
|
||||
.find((machine) => machine.name === deployParams.captainNameToDeploy)!;
|
||||
|
||||
try {
|
||||
await new DeployHelper(capMachine, appName, branchToPush) //
|
||||
.deployFromGitProject();
|
||||
await new DeployHelper(deployParams) //
|
||||
.startDeploy();
|
||||
} catch (e) {
|
||||
StdOutUtil.printError(e.message, true);
|
||||
}
|
||||
|
||||
@@ -11,9 +11,20 @@ export interface IOldSavedApp {
|
||||
machineToDeploy: IMachine;
|
||||
}
|
||||
|
||||
export interface IDeploySource {
|
||||
branchToPush?: string;
|
||||
tarFilePath?: string;
|
||||
}
|
||||
|
||||
export interface IDeployedDirectory {
|
||||
cwd: string;
|
||||
appName: string;
|
||||
branchToPush: string;
|
||||
deploySource: IDeploySource;
|
||||
machineNameToDeploy: string;
|
||||
}
|
||||
|
||||
export interface IDeployParams {
|
||||
deploySource: IDeploySource;
|
||||
captainMachine?: IMachine;
|
||||
appName?: string;
|
||||
}
|
||||
|
||||
@@ -10,8 +10,27 @@ export default class CliHelper {
|
||||
return CliHelper.instance;
|
||||
}
|
||||
|
||||
getAppsAsOptions(apps: any[]) {
|
||||
const firstItemInOption = [
|
||||
{
|
||||
name: '-- CANCEL --',
|
||||
value: '',
|
||||
short: ''
|
||||
}
|
||||
];
|
||||
const listOfApps = apps.map((app) => {
|
||||
return {
|
||||
name: `${app.appName}`,
|
||||
value: `${app.appName}`,
|
||||
short: `${app.appName}`
|
||||
};
|
||||
});
|
||||
|
||||
return [ ...firstItemInOption, ...listOfApps ];
|
||||
}
|
||||
|
||||
getMachinesAsOptions() {
|
||||
const machines = StorageHelper.get().getMachines()
|
||||
const machines = StorageHelper.get().getMachines();
|
||||
const firstItemInOption = [
|
||||
{
|
||||
name: '-- CANCEL --',
|
||||
@@ -31,11 +50,10 @@ export default class CliHelper {
|
||||
}
|
||||
|
||||
logoutMachine(machineName: string) {
|
||||
const removedMachine = StorageHelper.get().removeMachine(machineName);
|
||||
StdOutUtil. printMessage(`You are now logged out from ${removedMachine.name} at ${removedMachine.baseUrl}...\n`);
|
||||
const removedMachine = StorageHelper.get().removeMachine(machineName);
|
||||
StdOutUtil.printMessage(`You are now logged out from ${removedMachine.name} at ${removedMachine.baseUrl}...\n`);
|
||||
}
|
||||
|
||||
|
||||
findDefaultCaptainName() {
|
||||
let currentSuffix = StorageHelper.get().getMachines().length + 1;
|
||||
const self = this;
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import * as inquirer from 'inquirer';
|
||||
import * as fs from 'fs-extra';
|
||||
import * as path from 'path';
|
||||
import { exec } from 'child_process';
|
||||
import StdOutUtil from '../utils/StdOutUtil';
|
||||
const ProgressBar = require('progress');
|
||||
const commandExistsSync = require('command-exists').sync;
|
||||
import { validateIsGitRepository, validateDefinitionFile, ensureAuthentication } from '../utils/ValidationsHandler';
|
||||
import { IMachine, IDeployedDirectory } from '../models/storage/StoredObjects';
|
||||
import { IMachine, IDeployParams } from '../models/storage/StoredObjects';
|
||||
import CliApiManager from '../api/CliApiManager';
|
||||
import SpinnerHelper from '../utils/SpinnerHelper';
|
||||
import IBuildLogs from '../models/IBuildLogs';
|
||||
@@ -16,42 +14,51 @@ import IBuildLogs from '../models/IBuildLogs';
|
||||
export default class DeployHelper {
|
||||
private lastLineNumberPrinted = -10000; // we want to show all lines to begin with!
|
||||
|
||||
constructor(private machineToDeploy: IMachine, private appName: string, private branchToPush: string) {
|
||||
constructor(private deployParams: IDeployParams) {
|
||||
//
|
||||
}
|
||||
|
||||
private gitArchiveFile(zipFileFullPath: string) {
|
||||
private gitArchiveFile(zipFileFullPath: string, branchToPush: string) {
|
||||
const self = this;
|
||||
return new Promise(function(resolve, reject) {
|
||||
exec(
|
||||
`git archive --format tar --output "${zipFileFullPath}" ${self.branchToPush}`,
|
||||
(err, stdout, stderr) => {
|
||||
if (err) {
|
||||
StdOutUtil.printError(`TAR file failed\n${err}\n`);
|
||||
return new Promise<string>(function(resolve, reject) {
|
||||
// Removes the temporary file created
|
||||
if (fs.pathExistsSync(zipFileFullPath)) fs.removeSync(zipFileFullPath);
|
||||
|
||||
fs.removeSync(zipFileFullPath);
|
||||
if (!commandExistsSync('git')) {
|
||||
StdOutUtil.printError(
|
||||
"'git' command not found...\nCaptain needs 'git' to create tar file of your source files...",
|
||||
true
|
||||
);
|
||||
reject("Captain needs 'git' to create tar file of your source files...");
|
||||
return;
|
||||
}
|
||||
|
||||
exec(`git archive --format tar --output "${zipFileFullPath}" ${branchToPush}`, (err, stdout, stderr) => {
|
||||
if (err) {
|
||||
StdOutUtil.printError(`TAR file failed\n${err}\n`);
|
||||
|
||||
fs.removeSync(zipFileFullPath);
|
||||
|
||||
reject(new Error('TAR file failed'));
|
||||
return;
|
||||
}
|
||||
|
||||
exec(`git rev-parse ${branchToPush}`, (err, stdout, stderr) => {
|
||||
const gitHash = (stdout || '').trim();
|
||||
|
||||
if (err || !/^[a-f0-9]{40}$/.test(gitHash)) {
|
||||
StdOutUtil.printError(
|
||||
`Cannot find hash of last commit on this branch: ${branchToPush}\n${gitHash}\n${err}\n`
|
||||
);
|
||||
reject(new Error('rev-parse failed'));
|
||||
|
||||
reject(new Error('TAR file failed'));
|
||||
return;
|
||||
}
|
||||
|
||||
exec(`git rev-parse ${self.branchToPush}`, (err, stdout, stderr) => {
|
||||
const gitHash = (stdout || '').trim();
|
||||
|
||||
if (err || !/^[a-f0-9]{40}$/.test(gitHash)) {
|
||||
StdOutUtil.printError(
|
||||
`Cannot find hash of last commit on this branch: ${self.branchToPush}\n${gitHash}\n${err}\n`
|
||||
);
|
||||
reject(new Error('rev-parse failed'));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
StdOutUtil.printMessage(`Pushing last commit on ${self.branchToPush}: ${gitHash}`);
|
||||
resolve();
|
||||
});
|
||||
}
|
||||
);
|
||||
StdOutUtil.printMessage(`Pushing last commit on ${branchToPush}: ${gitHash}`);
|
||||
resolve(gitHash);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -72,7 +79,7 @@ export default class DeployHelper {
|
||||
fileStream.on('end', () => {
|
||||
StdOutUtil.printMessage('This might take several minutes. PLEASE BE PATIENT...');
|
||||
|
||||
SpinnerHelper.start('Building your source code...');
|
||||
SpinnerHelper.start('Building your source code...\n');
|
||||
|
||||
SpinnerHelper.setColor('yellow');
|
||||
});
|
||||
@@ -80,49 +87,56 @@ export default class DeployHelper {
|
||||
return fileStream;
|
||||
}
|
||||
|
||||
async deployFromGitProject() {
|
||||
const appName = this.appName;
|
||||
const branchToPush = this.branchToPush;
|
||||
const machineToDeploy = this.machineToDeploy;
|
||||
async startDeploy() {
|
||||
const appName = this.deployParams.appName;
|
||||
const branchToPush = this.deployParams.deploySource.branchToPush;
|
||||
const tarFilePath = this.deployParams.deploySource.tarFilePath;
|
||||
const machineToDeploy = this.deployParams.captainMachine;
|
||||
|
||||
if (!appName || !branchToPush || !machineToDeploy) {
|
||||
StdOutUtil.printError('Default deploy failed. Missing appName or branchToPush or machineToDeploy.', true);
|
||||
if (!appName || (!branchToPush && !tarFilePath) || !machineToDeploy) {
|
||||
StdOutUtil.printError(
|
||||
'Default deploy failed. Missing appName or branchToPush/tarFilePath or machineToDeploy.',
|
||||
true
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!commandExistsSync('git')) {
|
||||
StdOutUtil.printError("'git' command not found...");
|
||||
|
||||
StdOutUtil.printError("Captain needs 'git' to create tar file of your source files...", true);
|
||||
if (branchToPush && tarFilePath) {
|
||||
StdOutUtil.printError('Default deploy failed. branchToPush/tarFilePath cannot both be present.', true);
|
||||
return;
|
||||
}
|
||||
|
||||
let tarFileCreatedByCli = false;
|
||||
const tarFileNameToDeploy = tarFilePath ? tarFilePath : 'temporary-captain-to-deploy.tar';
|
||||
|
||||
const tarFileFullPath = tarFileNameToDeploy.startsWith('/')
|
||||
? tarFileNameToDeploy // absolute path
|
||||
: path.join(process.cwd(), tarFileNameToDeploy); // relative path
|
||||
|
||||
let gitHash = '';
|
||||
|
||||
if (branchToPush) {
|
||||
tarFileCreatedByCli = true;
|
||||
|
||||
StdOutUtil.printMessage(`Saving tar file to:\n${tarFileFullPath}\n`);
|
||||
|
||||
gitHash = await this.gitArchiveFile(tarFileFullPath, branchToPush);
|
||||
}
|
||||
|
||||
StdOutUtil.printMessage(`Deploying ${appName} to ${machineToDeploy.name}`);
|
||||
|
||||
await ensureAuthentication(machineToDeploy);
|
||||
|
||||
const zipFileNameToDeploy = 'temporary-captain-to-deploy.tar';
|
||||
const zipFileFullPath = path.join(process.cwd(), zipFileNameToDeploy);
|
||||
|
||||
StdOutUtil.printMessage(`Saving tar file to:\n${zipFileFullPath}\n`);
|
||||
|
||||
// Removes the temporary file created
|
||||
if (fs.pathExistsSync(zipFileFullPath)) fs.removeSync(zipFileFullPath);
|
||||
|
||||
await this.gitArchiveFile(zipFileFullPath);
|
||||
|
||||
try {
|
||||
StdOutUtil.printMessage(`Uploading the file to ${machineToDeploy.baseUrl}`);
|
||||
|
||||
await CliApiManager.get(machineToDeploy).uploadAppData(appName, this.getFileStream(zipFileFullPath));
|
||||
await CliApiManager.get(machineToDeploy).uploadAppData(appName, this.getFileStream(tarFileFullPath));
|
||||
|
||||
StdOutUtil.printMessage(`Upload done.`);
|
||||
|
||||
fs.removeSync(zipFileFullPath);
|
||||
if (tarFileCreatedByCli && fs.pathExistsSync(tarFileFullPath)) fs.removeSync(tarFileFullPath);
|
||||
|
||||
this.startFetchingBuildLogs(machineToDeploy, appName);
|
||||
} catch (e) {
|
||||
if (fs.pathExistsSync(zipFileFullPath)) fs.removeSync(zipFileFullPath);
|
||||
if (tarFileCreatedByCli && fs.pathExistsSync(tarFileFullPath)) fs.removeSync(tarFileFullPath);
|
||||
|
||||
throw e;
|
||||
}
|
||||
@@ -155,7 +169,7 @@ export default class DeployHelper {
|
||||
|
||||
if (data && !data.isAppBuilding) {
|
||||
if (!data.isBuildFailed) {
|
||||
const appUrl = self.machineToDeploy.baseUrl
|
||||
const appUrl = self.deployParams.captainMachine!.baseUrl
|
||||
.replace('https://', 'http://')
|
||||
.replace('//captain.', '//' + appName + '.');
|
||||
StdOutUtil.printGreenMessage(`Deployed successfully: ${appName}`);
|
||||
|
||||
@@ -24,6 +24,10 @@ export default class StorageHelper {
|
||||
return Utils.copyObject(this.data.get(CAP_MACHINES) || []);
|
||||
}
|
||||
|
||||
findMachine(machineName: string) {
|
||||
return this.getMachines().find((m) => m.name === machineName);
|
||||
}
|
||||
|
||||
removeMachine(machineName: string) {
|
||||
const machines = this.getMachines();
|
||||
const removedMachine = machines.filter((machine) => machine.name === machineName)[0];
|
||||
|
||||
@@ -71,14 +71,17 @@ export function isIpAddress(ipaddress: string) {
|
||||
}
|
||||
export async function ensureAuthentication(machine: IMachine) {
|
||||
let isAuthenticated = false;
|
||||
let allApps = undefined;
|
||||
try {
|
||||
let ignoreVal = await CliApiManager.get(machine).getAllApps();
|
||||
isAuthenticated = true;
|
||||
allApps = await CliApiManager.get(machine).getAllApps();
|
||||
} catch (e) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
if (!isAuthenticated) {
|
||||
if (!allApps) {
|
||||
const loggedInStatus = await requestLogin(machine);
|
||||
allApps = await CliApiManager.get(machine).getAllApps();
|
||||
}
|
||||
|
||||
return allApps
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user