我正在尝试为我们的内部品牌 hubot 实施一项新功能。该功能使用 npm 包 simple-ssh(ssh2 的包装器),基本上将环境(即“@hubot 获取版本 DEV)作为输入,获取该环境的服务器和凭据,并运行许多 bash 命令以返回每个服务器上特定软件的版本。
使用console.log()时,我可以正常运行并查看输出,但我需要附加到数组,以便可以在hubot回复中将其发送回。但是,在每个 .exec 之后,我既不能附加到响应字符串,也不能附加到我从 out(stdout) 函数中创建的数组。
如何在我对 hubot 的回复中使用每个命令的标准输出?
require('dotenv').config('../.env');
const SSH = require('simple-ssh');
const { Resolver } = require('../../../utils/Resolver');
const resolver = new Resolver();
let response = '';
let versions = [];
// parses initial request from flowdock into separate environments
function getEnvsFromRequest(reqEnvsStr) {
return reqEnvsStr.toUpperCase().replace(/AND/, '').replace(/\s+/g, '').split(',');
}
function getVersions(res) {
const env = getEnvsFromRequest(res.match[2].toString());
const resEnv = resolver.resolveEnv(env);
if (resEnv === null) {
res.reply(`${env} is not in my list of available environments.`);
return;
}
if (resEnv.length > 0) {
response = response.concat(`\nHere are the results for ${resEnv}:\n`);
response = response.concat('------------------------\n');
}
// Resolve hosts for environment
let resHosts = [];
resHosts = resolver.resolveHosts(resEnv);
// Resolve creds for environment
let resCreds = [];
resCreds = resolver.resolveCreds(resEnv);
// Loop through available hosts for each environment
resHosts.forEach((resHost) => {
dummy = [];
dummy.push(`${resHost}:\n`);
const ssh = new SSH({
host: resHost,
user: resCreds[0],
pass: resCreds[1],
});
ssh
// Example 1 version
.exec('head -3 /app/foo/foo/bar | tail -1 | cut -d \'=\' -f 2', {
// out(stdout) { response.concat(`Foo foo bar version: ${stdout}`); },
out(stdout) { dummy.push(`Foo foo bar version: ${stdout}`); },
})
// Example 2 version
.exec('cd /app/foo/bar && ls -td -- * | head -n 1', {
// out(stdout) { response.concat(`Foo bar version: ${stdout}`); },
out(stdout) { dummy.push(`Foo bar version: ${stdout}`); },
})
.start();
});
versions.push(dummy)
}
response.concat(versions.toString());
res.reply(response);