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插件之多图片异步上传
Oct 20 Javascript
AngularJS基础 ng-init 指令简单示例
Aug 02 Javascript
js 数据存储和DOM编程
Feb 09 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
Jul 17 Javascript
NW.js 简介与使用方法
Feb 01 Javascript
jQuery实现定时隐藏对话框的方法分析
Feb 12 jQuery
浅谈Vue初学之props的驼峰命名
Jul 19 Javascript
react 兄弟组件如何调用对方的方法示例
Oct 23 Javascript
微信小程序实现的图片保存功能示例
Apr 24 Javascript
微信小程序搭建自己的Https服务器
May 02 Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
Dec 31 Javascript
Vue图片裁剪组件实例代码
Jul 02 Vue.js
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/06/09 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
php array_values 返回数组的所有值详解及实例
2016/11/12 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
PHP关于foreach复制知识点总结
2019/01/28 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
js改变Iframe中Src的方法
2015/05/05 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
2016/04/29 Javascript
node.js路径处理方法以及绝对路径详解
2021/03/04 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
Vue列表渲染的示例代码
2018/11/01 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
2019/08/26 Javascript
使用Python的turtle模块画图的方法
2017/11/15 Python
Python人脸识别初探
2017/12/21 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
乌克兰移动电子产品和相关配件的在线商店:iTMag
2020/03/16 全球购物
大学生职业生涯规划书范文
2014/01/14 职场文书
幼儿园毕业寄语
2014/04/03 职场文书
奥巴马就职演讲稿
2014/05/15 职场文书
市场策划求职信
2014/08/07 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
2015年国庆节标语大全
2015/07/30 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
Redis 限流器
2022/05/15 Redis