通过 SSH 推送代码,终端中信息呈现逻辑错误

代码推送脚本

代码推送的流程为:

  1. 前端代码构建
  2. 压缩构建后的代码
  3. ssh 连接
  4. 上传压缩文件到指定目录
  5. ssh 交互 cd 到指定目录
  6. ssh 交互 unzip 压缩包,并且删除一些文件
  7. ssh 退出登录

代码如下:

const chalk = require('chalk');
const ora = require('ora');
let open = require("open");

const spinner = ora({
  text: 'connecting sever...',
  color: 'cyan'
})

const { exec } = require('child_process');
const compressing = require('compressing');
const Client = require('ssh2').Client;

// SSH 连接配置
const server = {
  host: '',
  port: 22,
  username: '',
  password: ''
};

// 代码推送地址配置
const config = {
  sourcePath: 'dist',
  remotePath: '/data/temp',
};

const connect = new Client();

/**
 * @description 连接服务器
 */
function conn(callback) {
  connect.on('ready', () => {
    spinner.succeed();
    callback && callback();
  });

  connect.on('error', (err) => {
    console.error(err);
    console.log(chalk.red('connect error.\n'))
  });
  
  connect.on('end', () => {
    console.log(chalk.cyan('connect end.\n'))
  });
  
  connect.on('close', (err) => {
    if (err) {
      console.log(err)
      console.log(chalk.red('connect closed.\n'))
    }
  })
  
  spinner.start('connect server...');
  connect.connect(server);
}

/**
 * @description 文件上传
 */
function upload() {
  spinner.start("upload file...\n")
  connect.sftp((err, sftp) => {
    if (err) throw err
    sftp.fastPut(
      `${config.sourcePath}.zip`,
      `${config.remotePath}/${config.sourcePath}.zip`,
      (err, res) => {
      if (err) {
        console.log(err)
        spinner.fail('upload failed')
        connect.end()
        return
      }
      spinner.succeed()
      unzipShell()
    })
  });
}

/**
 * @description 服务器解压命令
 */
function unzipShell() {
  spinner.start('unzip...')
  connect.shell((err, stream) => {
    if (err) throw err
    let buf = "";
    stream.on('close', err => {
      if (err) {
        console.error(err)
        return
      }
      spinner.succeed()
      connect.end()
      open('https://www.baidu.com', 'chrome');
    });
    
    stream.on('data', data => {
      buf += data
      /**
       * TODO 这里有一个问题是打印的日志比较乱, 不是顺序打印的
       * 需要优化逻辑, 暂时没想到办法, 先注释代码
       */
      console.log(data.toString())
    });

    stream.write(`cd ${config.remotePath} && unzip -o ${config.sourcePath}.zip \n`)
    stream.write(`cd ${config.sourcePath} && /bin/cp -r -f * ../ \n`)
    stream.write(`cd ../ && rm -rf ${config.sourcePath} \n`)
    stream.write(`rm -f ${config.sourcePath}.zip \n`)
    stream.write(`exit\n`)
  })
}

/**
 * @description 文件压缩
 */
function compress() {
  spinner.start('compress file...');
  compressing
    .zip
    .compressDir(`${config.sourcePath}`, `${config.sourcePath}.zip`)
    .then(() => {
      spinner.succeed();
      conn(upload);
    });
}

/**
 * @description 构建镜像
 */
function buildImage() {}

/**
 * @description 代码打包
 */
function compile() {
  // const bat = exec('npm run build', (err, stdout, stderr) => {
  //   if (err) {
  //     console.error(`exec error: ${err}`);
  //     return;
  //   }
  //   console.log(chalk.cyan('build success'))
  //   compress()
  // })
  compress()
}

// 流程开始
compile()

其打印日志如下,有一部分的内容显示逻辑没有处理好:

通过 SSH 推送代码,终端中信息呈现逻辑错误_第1张图片

希望的流程是以问答的方式展现,和在终端操作的方式一样,现在的体验太差了,如果你有解决办法,希望你能告诉我,谢谢。

你可能感兴趣的:(通过 SSH 推送代码,终端中信息呈现逻辑错误)