Vue-CLI 3 scp2自动部署项目至服务器的方法


Posted in Javascript onJuly 24, 2020

一 安装scp2

npm install scp2 --save-dev

二、配置测试/生产环境 服务器SSH远程登陆账号信息

在项目根目录下, 创建 .env.dev 文件 (测试环境变量)

VUE_APP_SERVER_ID变量表示 当前需部署的测试服务器ID为0

// .env.dev文件中
VUE_APP_SERVER_ID=0

在项目根目录下, 创建 .env.prod 文件 (生产环境变量)
VUE_APP_SERVER_ID变量表示 当前需部署的生产服务器ID为1

// .env.prod文件中
VUE_APP_SERVER_ID=1

在项目根目录下, 创建 yirenck/products.js 文件

/*
 *读取env环境变量
 */
const fs = require('fs');
const path = require('path');
// env 文件 判断打包环境指定对应的服务器id
const envfile = process.env.NODE_ENV === 'prod' ? '../.env.prod' : '../.env.dev';
// env环境变量的路径
const envPath = path.resolve(__dirname, envfile);
// env对象
const envObj = parse(fs.readFileSync(envPath, 'utf8'));
const SERVER_ID = parseInt(envObj['VUE_APP_SERVER_ID']);

function parse(src) {
 // 解析KEY=VAL的文件
 const res = {};
 src.split('\n').forEach(line => {
  // matching "KEY' and 'VAL' in 'KEY=VAL'
  // eslint-disable-next-line no-useless-escape
  const keyValueArr = line.match(/^\s*([\w\.\-]+)\s*=\s*(.*)?\s*$/);
  // matched?
  if (keyValueArr != null) {
   const key = keyValueArr[1];
   let value = keyValueArr[2] || '';

   // expand newlines in quoted values
   const len = value ? value.length : 0;
   if (len > 0 && value.charAt(0) === '"' && value.charAt(len - 1) === '"') {
    value = value.replace(/\\n/gm, '\n');
   }

   // remove any surrounding quotes and extra spaces
   value = value.replace(/(^['"]|['"]$)/g, '').trim();

   res[key] = value;
  }
 });
 return res;
}

/*
 *定义多个服务器账号 及 根据 SERVER_ID 导出当前环境服务器账号
 */
const SERVER_LIST = [
 {
  id: 0,
  name: 'A-生产环境',
  domain: 'www.prod.com',// 域名可以忽略
  host: '46.106.38.24',// ip
  port: 22,// 端口
  username: 'root', // 登录服务器的账号
  password: 'Rock@sz18!', // 登录服务器的账号
  path: '/mdm/nginx/dist' // 发布至静态服务器的项目路径
 },
 {
  id: 1,
  name: 'B-测试环境',
  domain: 'test.xxx.com',
  host: 'XX.XX.XX.XX',
  port: 22,
  username: 'root',
  password: 'xxxxxxx',
  path: '/usr/local/www/xxx_program_test/'
 }
];

module.exports = SERVER_LIST[SERVER_ID];

三、使用scp2库,创建自动化部署脚本

在项目根目录下, 创建 yirenck/index.js 文件

// yirenck/index.js里面
const scpClient = require('scp2');
const ora = require('ora');
const chalk = require('chalk');
const server = require('./products');
const spinner = ora(
 '正在发布到' +
  (process.env.NODE_ENV === 'prod' ? '生产' : '测试') +
  '服务器...'
);

var Client = require('ssh2').Client;

var conn = new Client();
conn
 .on('ready', function() {
  // rm 删除dist文件,\n 是换行 换行执行 重启nginx命令 我这里是用docker重启nginx
  conn.exec('rm -rf /opt/nginx_fdfs/manager\ndocker restart nginx', function(
   err,
   stream
  ) {
   if (err) throw err;
   stream
    .on('close', function(code, signal) {
     // 在执行shell命令后,把开始上传部署项目代码放到这里面
     spinner.start();
     scpClient.scp(
      './dist',
      {
       host: server.host,
       port: server.port,
       username: server.username,
       password: server.password,
       path: server.path
      },
      function(err) {
       spinner.stop();
       if (err) {
        console.log(chalk.red('发布失败.\n'));
        throw err;
       } else {
        console.log(
         chalk.green(
          'Success! 成功发布到' +
           (process.env.NODE_ENV === 'prod'
            ? '生产'
            : '测试') +
           '服务器! \n'
         )
        );
       }
      }
     );

     conn.end();
    })
    .on('data', function(data) {
     console.log('STDOUT: ' + data);
    })
    .stderr.on('data', function(data) {
     console.log('STDERR: ' + data);
    });
  });
 })
 .connect({
  host: server.host,
  port: server.port,
  username: server.username,
  password: server.password
  //privateKey: require('fs').readFileSync('/home/admin/.ssh/id_dsa')
 });

四、安装 cross-env判断生产环境还是测试环境

这里用到了cross_env ,cross-env能跨平台地设置及使用环境变量,这里用来设置是生产环境还是测试环境

npm i --save-dev cross-env cross-env

五、添加 package.json 中的 scripts 命令, 自定义名称为 "yirenck"

发布到测试环境命令为 npm run yirenck:dev,生产环境为 npm run yirenck:prod

"scripts": {
  "serve": "vue-cli-service serve --mode dev",
  "build": "vue-cli-service build --mode prod",
  "yirenck:dev": "npm run build && cross-env NODE_ENV=dev node ./yirenck",
  "yirenck:prod": "npm run build && cross-env NODE_ENV=prod node ./yirenck",
 },

到此这篇关于Vue-CLI 3 scp2自动部署项目至服务器的方法的文章就介绍到这了,更多相关Vue-CLI 3 scp2自动部署内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Javascript 相关文章推荐
脚本吧 - 幻宇工作室用到js,超强推荐base.js
Dec 23 Javascript
js DOM模型操作
Dec 28 Javascript
Knockoutjs快速入门(经典)
Dec 24 Javascript
深入理解JavaScript系列(36):设计模式之中介者模式详解
Mar 04 Javascript
jQuery+HTML5美女瀑布流布局实现方法
Sep 21 Javascript
Javascript中的对象和原型(二)
Aug 12 Javascript
JavaScript错误处理和堆栈追踪详解
Apr 18 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
Sep 27 Javascript
JQuery选中select组件被选中的值方法
Mar 08 jQuery
Vue退出登录时清空缓存的实现
Nov 12 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
Oct 31 Javascript
vue 中使用print.js导出pdf操作
Nov 13 Javascript
vue data对象重新赋值无效(未更改)的解决方式
Jul 24 #Javascript
VUE项目axios请求头更改Content-Type操作
Jul 24 #Javascript
vue+axios全局添加请求头和参数操作
Jul 24 #Javascript
vue在响应头response中获取自定义headers操作
Jul 24 #Javascript
vuex存取值和映射函数使用说明
Jul 24 #Javascript
js实现金山打字通小游戏
Jul 24 #Javascript
vuex中store存储store.commit和store.dispatch的用法
Jul 24 #Javascript
You might like
使用PHP 5.0创建图形的巧妙方法
2010/10/12 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
关于JS管理作用域的问题
2013/04/10 Javascript
用js判断输入是否为中文的函数
2014/03/10 Javascript
js四舍五入数学函数round使用实例
2014/05/09 Javascript
JQuery实现鼠标滚轮滑动到页面节点
2015/07/28 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
JS延时提示框实现方法详解
2015/11/26 Javascript
jQuery选择器_动力节点Java学院整理
2017/07/05 jQuery
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
移动端滑动切换组件封装 vue-swiper-router实例详解
2018/11/25 Javascript
vuex页面刷新后数据丢失的方法
2019/01/17 Javascript
Vue指令指令大全
2019/02/09 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
详解如何在Javascript和Sass之间共享变量
2019/11/13 Javascript
[01:01]2020完美高校联赛(秋)西安落幕
2021/03/11 DOTA
讲解Python中if语句的嵌套用法
2015/05/14 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
Python tkinter的grid布局及Text动态显示方法
2018/10/11 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
python opencv 实现读取、显示、写入图像的方法
2020/06/08 Python
python算的上脚本语言吗
2020/06/22 Python
荷兰鞋类购物网站:Donelli
2019/05/24 全球购物
党员思想汇报范文
2013/12/30 职场文书
商场促销活动方案
2014/02/08 职场文书
爽歪歪广告词
2014/03/20 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
创业计划书之儿童理发店
2019/09/27 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python
2021年最新用于图像处理的Python库总结
2021/06/15 Python