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 相关文章推荐
ie和firefox中img对象区别的困惑
Dec 27 Javascript
Mootools 1.2教程 滚动条(Slider)
Sep 15 Javascript
function foo的原型与prototype属性解惑
Nov 19 Javascript
js动态加载以及确定加载完成的代码
Jul 31 Javascript
Jquery选中或取消radio示例
Sep 29 Javascript
js实现checkbox全选和反选示例
May 01 Javascript
JS实现OCX控件的事件响应示例
Sep 17 Javascript
简单谈谈javascript中this的隐式绑定
Feb 22 Javascript
AngularJs表单验证实例代码解析
Nov 29 Javascript
VueCli3构建TS项目的方法步骤
Nov 07 Javascript
vue路由守卫,限制前端页面访问权限的例子
Nov 11 Javascript
使用vue实现通过变量动态拼接url
Jul 22 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
mysql总结之explain
2012/02/27 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
js查找父节点的简单方法
2008/06/28 Javascript
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
javascript简单实现类似QQ头像弹出效果的方法
2015/08/03 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
原生js实现倒计时功能(多种格式调用)
2017/01/12 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
Python实现的生成自我描述脚本分享(很有意思的程序)
2014/07/18 Python
详解Python发送email的三种方式
2018/10/18 Python
python读取各种文件数据方法解析
2018/12/29 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
Django haystack实现全文搜索代码示例
2020/11/28 Python
Application Cache未缓存文件无法访问无法加载问题
2014/05/31 HTML / CSS
极度干燥澳大利亚官方网站:Superdry澳大利亚
2019/03/28 全球购物
网站编辑求职信
2013/10/17 职场文书
总经理职责
2013/12/22 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
小学端午节活动方案
2014/03/13 职场文书
2014年母亲节演讲稿范文
2014/05/07 职场文书
关于安全演讲稿
2014/05/09 职场文书
大学英语专业求职信
2014/06/21 职场文书
2014和解协议书范文
2014/09/15 职场文书
2014年公路养护工作总结
2014/12/04 职场文书
2016年党员干部公开承诺书
2016/03/24 职场文书
关于感恩的作文
2019/08/26 职场文书
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle