前言:通常情况下,一个项目会有开发环境、内网环境、测试环境、生产环境等多个环境,通过请求不同的服务器来获取数据,如果可不修改代码,通过执行不同命令就能着急部署不同环境,我们的效率会得到很大提升。
实现:
一、配置多个服务器端请求地址
- const getServerApi = () => {
- let info = {};
- // 当node内置的环境变量 process.env.NODE_ENV存在时进入
- switch (process.env.NODE_ENV) {
- case 'test1': //开发环境
- info.baseUrl = '192.168.xx.xx:1001/test1'; //基础地址
- info.portalUrl = '139.xxx.xx.xx:8091'; //登录地址
- break;
- case 'test2': //内网环境
- info.baseUrl = '192.168.xx.xx:1002/test2';
- info.portalUrl = '139.xxx.xx.xx:8091';
- break;
- case 'test3': //测试环境
- info.baseUrl = '192.168.xx.xx:1003/test3';
- info.portalUrl = '139.xxx.xx.xx:8091';
- break;
- case 'production': //生产环境
- info.baseUrl = '218.xx.xx.xxx:8090';
- info.portalUrl = '218.xx.xx.xxx:8088';
- break;
- default: //默认
- info.baseUrl = '192.168.xx.xx:1001/test1';
- info.portalUrl = '139.xxx.xx.xx:8091';
- break;
- }
- return info;
- };
-
- //默认导出基础地址和登录地址
- export default {
- baseUrl: `//${getServerApi().baseUrl}`,
- portal: `//${getServerApi().portal}`,
- };
- import axios from 'axios';
- import config from './config' //引入配置的服务地址
- const BASE_URI = config.baseUrl; //使用基础路径
二、scp2自动化部署项目至服务器实现
npm install scp2 --save-dev
npm i --save-dev cross-env cross-env
- // deploy/index.js里面
- const scpClient = require('scp2');
- const ora = require('ora'); //一个优雅的终端微调器
- const chalk = require('chalk'); //颜色插件
- const server = require('./products');
- const spinner = ora('正在发布到' + server.name + '服务器...');
-
- var Client = require('ssh2').Client; //连接远程服务器
- var conn = new Client();
- conn.on('ready', function() {
- // rm 删除dist文件,\n 是换行 换行执行 重启nginx命令 我这里是用docker重启nginx
- conn.exec('cd ' + server.path + '\nrm -rf css img js fonts index.html', 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! 成功发布到' + server.name + '服务器! \n'));
- }
- }
- );
- conn.end();
- })
- .on('data', function(data) {
- console.log('STDOUT: ' + data);
- })
- .stderr.on('data', function(data) {
- console.log('STDERR: ' + data);
- });
- });
- })
- .on('error', function(err) {
- console.log('xxx' + err);
- })
- .connect({
- host: server.host,
- port: server.port,
- username: server.username,
- password: server.password,
- });
- /*
- *定义多个服务器账号 及 根据 SERVER_ID 导出当前环境服务器账号
- */
- const SERVER_LIST = [{
- id: 'text1',
- name: '开发环境',
- host: '139.xx.xx.xxx', // 服务器ip
- port: 22, // 登录服务器端口,一般为22 或 21
- username: 'root', // 登录服务器的账号
- password: 'xxxxxx', // 登录服务器的账号
- path: '/usr/local/nginx/html/xxx' // 项目上传到服务器的路径,要服务器上的绝对路径
- },
- {
- id: 'test2',
- name: '内网环境',
- host: '139.xxx.xxx.xxx',
- port: 22,
- username: 'root',
- password: 'xxxxxx',
- path: '/etc/nginx/html/test2/xxx'
- },
- {
- id: 'test3',
- name: '测试环境',
- host: '139.xxx.xxx.xxx',
- port: 22,
- username: 'root',
- password: 'xxxxxx',
- path: '/etc/nginx/html/test3/xxx'
- },
- {
- id: 'production',
- name: '生产环境',
- host: '218.xxx.xxx.xxx',
- port: 22,
- username: 'root',
- password: 'xxxxxx',
- path: '/etc/nginx/dist'
- },
- ];
- /**
- *读取env环境变量
- */
- const getServer = () => {
- return SERVER_LIST.find(item => {
- return item.id == process.env.NODE_ENV
- })
- }
-
- module.exports = getServer();
- "scripts": {
- "serve": "vue-cli-service serve",
- "build": "vue-cli-service build",
- "lint": "vue-cli-service lint",
- "deploy:test1": "cross-env NODE_ENV=test1 cnpm run build && cross-env NODE_ENV=test1 node ./deploy",
- "deploy:test2": "cross-env NODE_ENV=test2 cnpm run build && cross-env NODE_ENV=test2 node ./deploy",
- "deploy:test3": "cross-env NODE_ENV=test3 cnpm run build && cross-env NODE_ENV=test3 node ./deploy",
- "build:production": "cross-env NODE_ENV=production vue-cli-service build"
- },