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 相关文章推荐
jQuery AnythingSlider滑动效果插件
Feb 07 Javascript
Javascript操作cookie的函数代码
Oct 03 Javascript
extjs3 combobox取value和text案例详解
Feb 06 Javascript
将json当数据库一样操作的javascript lib
Oct 28 Javascript
多引号嵌套的变量命名的问题
May 09 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
May 29 Javascript
angular基于路由控制ui-router实现系统权限控制
Sep 27 Javascript
Sequelize中用group by进行分组聚合查询
Dec 12 Javascript
微信小程序 textarea 组件详解及简单实例
Jan 10 Javascript
vue中实现在外部调用methods的方法(推荐)
Feb 08 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
Jun 17 Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
Jun 01 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函数的常用方法及注意之处小结
2011/07/10 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
基于jquery点击自以外任意处,关闭自身的代码
2012/02/10 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
JS显示下拉列表框内全部元素的方法
2015/03/31 Javascript
JavaScript基本的输出和嵌入式写法教程
2015/10/20 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
node.js使用redis储存session的方法
2018/09/26 Javascript
ligerUI的ligerDialog关闭刷新的方法
2019/09/27 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
2020/04/08 Javascript
国内常用的js类库大全(CDN公共库)
2020/06/24 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
2020/10/29 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
Python实战购物车项目的实现参考
2019/02/20 Python
Python求离散序列导数的示例
2019/07/10 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
python自动化办公操作PPT的实现
2021/02/05 Python
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
中学自我评价
2014/01/31 职场文书
融资合作协议书范本
2014/10/17 职场文书
教师个人年终总结
2015/02/11 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python