vue项目前端服务器,【前端技术】vue自动部署项目到服务器

想要的功能

前端打包之后自动上传文件夹到服务器

在不提交代码的前提下,也可以完成上述功能

经过各种百度谷歌,最后有两种方案可以选择

第一种是写一个shell,通过lftp上传文件夹,但是会有个权限的问题,需要更改nginx配置才可以解决

第二种就是使用node来实现,个人推荐使用这个

第三种就是jenkins, 但是我又不想提交代码,不满足,放弃

使用shell自动传输文件夹到服务器

思路

1. 安装lftp

2. 编写shell脚本自动传输文件夹到服务器

3. lftp 传输文件成功之后会访问目录会报一个ngxin 403的权限错误,(如果说测试大佬不同意改ngxin配置的话, 那就放弃把)

ftp安装和常用命令介绍

linux安装vftp

rpm -qa | grep initscripts

查看ftp安装是否成功

which vsftpd

查看ftp 服务器状态

service vsftpd status

启动ftp服务器

service vsftpd start

重启ftp服务器

service vsftpd restart

查看服务有没有启动

netstat -an | grep 21 //默认端口为21

tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN

如果看到以上信息,证明ftp服务已经开启。

如果需要开启root用户的ftp权限要修改以下两个文件

vi /etc/vsftpd/ftpusers 中注释掉root

vi /etc/vsftpd/user_list 中也注释掉root

然后重新启动ftp服务 service vsftpd restart

ftpusers和user_list文件详解

1460000022743856

安装lftp

为啥要安装lftp

ftp不可以传文件夹,lftp可以,lftp可以使用帐号密码登录

安装步骤

window

choco 安装

choco install lftp

1460000022743855

没有安装choco 请点下方链接,自己食用

1460000022743857

linux

linux下安装FTP的过程和使用的整体过程

第一步

1460000022743858

第二步

1460000022743859

第三步

1460000022743860

【Linux】缺少service命令的解决办法

lftp 常用命令介绍

Shell 教程

为啥要 ./qq.sh 这样执行, 好像有坑

bVbHBzW

shell使用ftp传输文件

请确保ftp服务已经开启,再做下面的操作

新建一个qq.sh文件,大致就是是用ftp链接远程服务器,并传输一个zip文件

bVbHBz9

shell源码:

#!/bin/sh

# 出现异常不往直接报错

set -e

# 打包

tar -czvf social.zip social

# 远端服务器ip

ip="192.168.1.99"

# 部署到远程服务器的目录 自行更换

remote="/usr/abcd/"

# 帐号 自行更换

userName="admin"

# 密码 自行更换

password="123456"

# 传输方式

ftpFransferType="binary"

# 传输的文件名

ftpPutFileName="social.zip"

#lcd 应该使用相对路径

#格式:lcd [directory]

#说明:directory 指定要更改的本地计算机上的目录。如果没有指定directory,将显示本地计算机中当前的工作目录

#从本地向FTP批量上传文档

echo "-------------------------------------- 开始上传 ${ftpPutFileName} 文件--------------------------------------"

ftp -v -n<

open $ip

user $userName $password

$ftpFransferType

cd $remote

pwd

prompt

put $ftpPutFileName

bye

EOF

echo "-------------------------------------- 上传 ${ftpPutFileName} 文件成功 --------------------------------------"

shell使用lftp传输文件夹

直接把文件夹丢到服务器

1460000022743865

shell源码:

#!/bin/bash

#--------------------------------------------

# 自动传输文件到不同环境

# author:qinyuanqi

#--------------------------------------------

#出现异常不往下面走

set -e

# SFTP配置信息

# IP

IP="192.168.1.199"

# 端口

PORT=22

# 用户名

USER="user"

# 密码

PASSWORD="password"

# 需要上传的文件所在目录

CLIENTDIR='./social'

# 上传到目标服务器的目录

remote="/usr/local/nginx/html/h5/"

#echo "$IP---$USER--$PASSWORD"

if [ -d $CLIENTDIR ]

then

echo "$CLIENTDIR 是一个文件夹"

elif [ -f $CLIENTDIR ]

then

echo "$CLIENTDIR 是一个文件"

else

echo "$CLIENTDIR 不存在"

fi

if [ "$1"x == "test"x ]

then

echo "---- 准备传输 $CLIENTDIR 文件到 ----测试环境"

# 这样传输到服务器,访问项目,nginx会报403,测试大佬说不能改nginx 配置,难搞哦,不知道怎么解决了

IP="192.168.1.166"

USER="测试环境的用户"

PASSWORD="测试环境的密码"

else

echo "---- 准备传输 $CLIENTDIR 文件到 ----开发环境"

fi

echo "---- 开始上传 ${CLIENTDIR} 文件 ----"

lftp -u $USER,$PASSWORD $IP <

cd ${remote}

mirror -R $CLIENTDIR

by

EOF

echo "---- 上传 ${CLIENTDIR} 文件成功 ----"

lftp 传输文件成功之后,访问web程序会报一个ngxin 403的权限错误,(如果说测试大佬不同意改ngxin配置的话, 那就放弃把)

解决ngxin 403:

使用node

思路:

使用node-ssh 来帮助我们实现自动部署

安装依赖

package.json文件

{

"devDependencies": {

"chalk": "^4.0.0",

"compressing": "^1.5.1",

"node-ssh": "^10.0.2"

}

}

npm install node-ssh –save-dev 传输文件夹

npm install compressing –save-dev 压缩文件

npm install chalk -save-dev 美化log

实例分析

实现功能

开发环境和测试环境自动打包并传输文件

生产环境自动生成压缩包

定义调用方式

调用方式 ,vue打包完成之后,删除soucemap文件,然后使用node 自动发布

1460000022743869

定义配置

1460000022743867

配置不同环境不同操作

1460000022743868

使用nodessh上传文件夹

1460000022743870

js源码:

// 开发和测试自动打包到对一个环境,生产自动打zip包,直接丢给领导上线

//命令行颜色

const chalk = require('chalk')

const log = console.log

const path = require('path')

// 连接传输到服务器插件

const NodeSSH = require('node-ssh')

const ssh = new NodeSSH()

// 取到node执行文件的参数,进行打包区分

const argv = process.argv.slice(2)

// 引入压缩文件插件

const compressing = require('compressing')

// 打包后的目录名称

const buildDirName = 'social'

// 打包后文件的路径

const distDir = './' + buildDirName

// 打包后的压缩名称

const distZipPath = './' + buildDirName + '.zip'

// 服务器配置

let remoteConfig = {}

// node deploy.js qq 取到qq来做判断,判断是那个环境,然后做不同的处理

switch (argv[0]) {

// 开发环境的一些配置

case 'dev':

log(chalk.blue('----开始打包到开发环境----'))

remoteConfig = {

host: '开发服务器ip',

// 远程端口,默认是21

// port:21

username: '开发服务器用户名',

password: '开发服务器密码',

remotePath: '服务器部署的地址',

}

upload()

break

// 测试环境的一些配置

case 'test':

log(chalk.blue('----开始打包到测试环境----'))

remoteConfig = {

host: '测试服务器ip',

// 远程端口,默认是21

// port:21

username: '测试服务器用户名',

password: '测试服务器密码',

remotePath: '测试服务器部署地址',

}

upload()

break

// 生产环境就自动压缩文件,不做别的处理

case 'production':

log(chalk.blue('----生产环境----开始压缩文件----'))

compressing.zip

.compressDir(distDir, distZipPath)

.then(() => {

log(chalk.green(`压缩 ${distZipPath} 成功`))

})

.catch(() => {

log(chalk.red(`压缩 ${distZipPath} 失败`))

})

break

default:

log(chalk.keyword('orange')('deploy走了没有处理的方式'))

break

}

/**

* 上传文件到服务器

* node 7.6 以上都支持 async 语法

*/

async function upload() {

const failed = []

const successful = []

try {

// 连接服务器

await ssh.connect({

host: remoteConfig.host,

username: remoteConfig.username,

password: remoteConfig.password,

})

// 刪除目录再上传

await ssh.execCommand('rm -rf ../' + buildDirName, { cwd: remoteConfig.remotePath })

// 开始上传文件到远程指定目录下

await ssh.putDirectory(distDir, remoteConfig.remotePath, {

recursive: true,

concurrency: 10,

validate: function(itemPath) {

const baseName = path.basename(itemPath)

console.log(baseName)

return (

baseName.substr(0, 1) !== '.' && baseName !== 'node_modules' // do not allow dot files

) // do not allow node_modules

},

tick: function(localPath, remotePath, error) {

if (error) {

failed.push(localPath)

} else {

successful.push(localPath)

}

},

})

} catch (error) {

log(chalk.red('upload 上传失败,错误信息如下==>', error))

return false

}

log(chalk.green('传输完成'))

log(chalk.green('传输成功文件数==>', successful.length))

log(chalk.green('传输失败文件数==>', failed.length))

// 退出

process.exit()

}

node 自动打包遗留问题

多个项目,每个项目都要引入deploy.js文件,感觉有点难受,暂时没想到啥好方法。各位观众老爷,有啥好方案,带带我呗~

结束语

本文如有错误,欢迎指正,非常感谢

觉得有用的老铁,点个双击,小红心走一波

欢迎灌水,来呀,互相伤害哈 o(∩_∩)o 哈哈

参考资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1027 打印沙漏 (20 分)

1027 打印沙漏 (20 分) 简单题。 #include<iostream> #include<string> #include<math.h> using namespace std; int main() {int n;char ch;cin>>n>>ch;int i;for (i1;;i){if (2*i*i-1>n) {ii-1;break;}}for (int j1;j<2*i;j){for (int…

你所不了解的五条面试忠告

今天不聊代码也不谈架构&#xff0c;今天我只想说说对每个人来说都必不可少又并非最重要的工作环节之一——面试。 几乎各大培训结构在他们的学员即将毕业的时候都会开一两节有关面试的课程&#xff0c;无非是教大家如何因对考官的问题或者如何在一些冷门知识上回答让对方满意。…

官狼服务器临时维护,官狼三分钟新模式,跑跑狼人杀如何边跑边杀

作为风靡全球的桌游&#xff0c;狼人杀一度成为了国内白领、学生党的国民游戏。随着网络的普及&#xff0c;很多玩家开始转求线上网杀&#xff0c;网易《狼人杀官方》因为玩法最多画风好看&#xff0c;一直是大多数人的选择。而就在最近&#xff0c;《狼人杀官方》重磅推出了年…

二叉搜索树相关题目

//二叉查找树的第k大节点&#xff1a;利用二叉搜索树的中序遍历序列是递增排序的性质&#xff0c;递归实现 struct BinaryTreeNode{int m_nValue;BinaryTreeNode* m_pLeft;BinaryTreeNode* m_pRight; }; BinaryTreeNode* FindKthNodeCore(BinaryTreeNode* pRoot, unsigned int …

三星s6 信号无服务器,手机没信号的原因以及解决方法

现在手机是一件很普遍的通讯工具&#xff0c;因为现在手机功能的强大&#xff0c;所以基本上人人一部手机。目前在社会上比较流行的牌子就是苹果或者三星手机。不过想必大家在用手机的时候都会出现手机没有信号这个问题。这个问题是一件比较麻烦的问题&#xff0c;有的时候急需…

2017书单3

30.围城 钱钟书的一部经典文学作品&#xff0c;只在高中刚开学的时候读过一点&#xff0c;听当时的老帅、班主任王家友讲过一点。王老师的音容笑貌依然在心呀&#xff01;话说这本书&#xff0c;写的是出国留洋的方鸿进&#xff0c;买了野鸡大学的假文凭后的一系列遭遇&#xf…

不同型号服务器如何做双击热备,服务器做双机热备教程

服务器做双机热备教程 内容精选换一换将GaussDB(DWS)提供的ODBC DRIVER(psqlodbcw.so)配置到数据源中便可使用。配置数据源需要配置“odbc.ini”和“odbcinst.ini”两个文件(在编译安装unixODBC过程中生成且默认放在“/usr/local/etc”目录下)&#xff0c;并在服务器端进行配置…

143. 最大异或对

模板&#xff1a;tire 复杂度&#xff1a;O&#xff08;nlogn&#xff09; 143. 最大异或对 #include <iostream> #include <algorithm> using namespace std; const int maxn 100010, M 31 * maxn; int ch[maxn]; int n; int son[M][2], idx 0; void insert(i…

windows service 2008 内存吃尽解决方案

最近用windows2008&#xff0c;发现系统运行一段时间后&#xff0c;内存吃紧&#xff0c;赶紧打开资源查看器&#xff0c;发现当前运行的程序占有内存都很小&#xff0c;后经查资料&#xff0c;原来是被windows2008的文件缓存吃尽了&#xff0c;这是windows2008的新机制&#x…

文档上传到服务器上,将文件上传到服务器上

将文件上传到服务器上 内容精选换一换为了实现NAT Server、SAP HANA主备节点和SAP S/4HANA主备节点互相通过SSH协议跳转的功能&#xff0c;需要配置云服务器之间的互信。在本地PC上&#xff0c;生成登录NAT Server的密钥文件。在创建NAT Server时&#xff0c;指定了NAT Server的…

深入理解C# 静态类与非静态类、静态成员的区别 [转载]

静态类静态类与非静态类的重要区别在于静态类不能实例化&#xff0c;也就是说&#xff0c;不能使用 new 关键字创建静态类类型的变量。在声明一个类时使用static关键字&#xff0c;具有两个方面的意义&#xff1a;首先&#xff0c;它防止程序员写代码来实例化该静态类&#xff…

win10配置JAVA和tomacat环境变量

一、配置JAVA_HOME 二、配置CATALINA_HOME &#xff08;tomacat的环境变量&#xff09; 三、配置PATH 四、命令行检验配置结果&#xff1a; 1、命令行输入java 2、命令行输入javac 3、命令行输入startup.bat 注&#xff1a;如果以上三个命令无报错表示配置成功 转载于:https://…

1032 挖掘机技术哪家强 (20 分)

1032 挖掘机技术哪家强 (20 分) #include<iostream> using namespace std; int main() {int n,k,h,ch[100101]{0},hh0,hhh1;cin>>n;for (int i0;i<n;i){cin>>k>>h;ch[k]h;if (ch[k]>hh) {hhch[k];hhhk;}}cout<<hhh<<" "&…

E20170830-mk

translation n. 翻译; 译本; 转化; 转变; calculate vt. 计算; 估计; 打算&#xff0c;计划; 旨在;erase vt. 抹去; 清除; 擦掉;转载于:https://www.cnblogs.com/lancgg/p/8281741.html

1033 旧键盘打字 (20 分)

1033 旧键盘打字 (20 分) #include<iostream> using namespace std; int main() {int ch[1011]{0};string str1,str2;getline(cin,str1);getline(cin,str2);int len1str1.length(),len2str2.length();for (int i0;i<len1;i) {if (str1[i]>A&&str1[i]<Z…

3485. 最大异或和

最大异或和 #include <iostream> #include <algorithm> using namespace std; const int maxn 100010, M 31 * maxn; int ch[maxn]; int n; int son[M][2], idx 0; int cnt[M];//M一定要这么大 void insert(int x, int v) {int p 0;for (int i 30; ~i; i--){…

B. Sifid and Strange Subsequences

B. Sifid and Strange Subsequences A sequence (b1,b2,…,bk) is called strange, if the absolute difference between any pair of its elements is greater than or equal to the maximum element in the sequence. Formally speaking, it’s strange if for every pair (…

剑指offer 重建二叉树

重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}&#xff0c;则重建二叉树并返回思路&#xff1a;…

y总nb

一般ACM或者笔试题的时间限制是1秒或2秒。 在这种情况下&#xff0c;C代码中的操作次数控制在 107∼108107∼108 为最佳。 下面给出在不同数据范围下&#xff0c;代码的时间复杂度和算法该如何选择&#xff1a; n≤30n≤30, 指数级别, dfs剪枝&#xff0c;状态压缩dp n≤100n…

设计模式 策略模式2 c++11

根据需求的不同 选择不同的策略算法 之前是保存的各种策略类的指针 这里直接使用 function bind 选择对应的算法 代码 // 005.cpp: 定义控制台应用程序的入口点。 //#include "stdafx.h" #include <functional> #include <iostream>using namespace std…