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 相关文章推荐
JavaScript 使用技巧精萃(.net html
Apr 25 Javascript
Javascript学习笔记4 Eval函数
Jan 11 Javascript
中文输入法不触发onkeyup事件的解决办法
Jul 09 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
May 03 Javascript
javascript从定义到执行 你不知道的那些事
Jan 04 Javascript
jQuery 中的 DOM 操作
Apr 26 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
Jul 19 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
Apr 04 Javascript
详解滑动穿透(锁body)终极探索
Apr 16 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
Jan 07 Javascript
js实现蒙版效果
Jan 11 Javascript
JS中如何优雅的使用async await详解
Oct 05 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文件上传的例子及参数详解
2013/12/12 PHP
用php简单实现加减乘除计算器
2014/01/06 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
在线编辑器的实现原理(兼容IE和FireFox)
2007/03/09 Javascript
初学Javascript的一些总结
2008/11/03 Javascript
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
Prototype 工具函数 学习
2009/07/23 Javascript
javascript 函数调用规则
2009/08/26 Javascript
Jquery Ajax请求代码(2)
2011/01/07 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
JavaScript动态数量的文件上传控件
2016/11/18 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
js通过指定下标或指定元素进行删除数组的实例
2017/01/12 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
微信小程序实现点击效果
2019/06/21 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
JQuery复选框全选效果如何实现
2020/05/08 jQuery
工作中常用js功能汇总
2020/11/07 Javascript
[01:34]DAC2018主赛事第四日五佳镜头 Gh巨牙海民助Miracle-死里逃生
2018/04/07 DOTA
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
python定时按日期备份MySQL数据并压缩
2019/04/19 Python
Python Flask框架扩展操作示例
2019/05/03 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
python 中不同包 类 方法 之间的调用详解
2020/03/09 Python
Python实现SMTP邮件发送
2020/06/16 Python
python源文件的字符编码知识点详解
2021/03/04 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
《搭石》教学反思
2014/04/07 职场文书
助人为乐模范事迹材料
2014/06/02 职场文书
2014领导干部四风问题查摆思想汇报
2014/09/13 职场文书
西湖英语导游词
2015/02/06 职场文书
2015年银行客户经理工作总结
2015/04/01 职场文书
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫