scp2 ssh自动化部署Nuxt

scp2 ssh自动化部署Nuxt,第1张

原理
scp源码到服务器指定目录
服务端打包
重启应用
// yarn add scp2
// yarn add [email protected]
// yarn add [email protected]

const fs = require('fs');
const client = require('scp2');
const ora = require('ora');
const chalk = require('chalk');
const { Client } = require('ssh2');
const spinner = ora(chalk.green('正在上传到到服务器...'));
spinner.start();

//服务器配置
const host = 'iot.siruish.cn';
const port = 22;
const username = 'root';
const password = 'password';

//服务器项目目录和pm2名称
const path = '/home/sirui_web/';
//需要自行配置服务器npm和pm2
const pm2Name = 'sirui_web';

const config = {
    host,
    port,
    username,
    password,
    path
}

//不需要上传的目录或者文件
const blackList = ['node_modules','.nuxt','.git'];

//数组取差集
const arrDifferenceDet = (arr1, arr2) => {
    var set1 = new Set(arr1);
    var set2 = new Set(arr2);
    var subset = [];
    for (let item of set1) {
        if (!set2.has(item)) {
            subset.push(item);
        }
    }
    return subset;
}

//上传文件或者文件夹
const upload = (src,config) => {
    const newConfig = JSON.parse(JSON.stringify(config));
    newConfig.path = newConfig.path+src
    return new Promise((resolve,reject)=>{
        client.scp(src,newConfig,function(err) {
            if(!err){
                console.log(src,'upload success!');
                resolve(`${src} upload success!`);
            } else {
                // reject(err);
                resolve(upload(src,config));
            }
        })
    })
}

const files = fs.readdirSync('./');
const filesWithoutBlackList = arrDifferenceDet(files,blackList);
const uploadList = filesWithoutBlackList.map(fileName=>()=>{return upload(fileName,config)});

//promiseList串行上传
async function asyncUpload(promises) {
    for (const promise of promises){
        await promise();
    }
}

const shellCmd = `
pm2 stop ${pm2Name}
cd ${path}
npm install
npm run build
pm2 restart ${pm2Name}`

//重启Nuxt
const restartNuxt = ()=>{
    const conn = new Client();
    conn.on('ready', () => {
    console.log('Client :: ready');
    conn.exec(shellCmd, (err, stream) => {
        if (err) throw err;
        stream.on('close', (code, signal) => {
            console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
            conn.end();
        }).on('data', (data) => {
            console.log('STDOUT: ' + data);
        }).stderr.on('data', (data) => {
            console.log('STDERR: ' + data);
        });
    });
    }).connect({host,port,username,password});
}

asyncUpload(uploadList).then(()=>{
    spinner.stop();
    console.log('所有文件上传成功');
    restartNuxt();
})

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1322282.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存