方案一 配置 gitLab 的 commit 钩子函数
项目是 gitLab 做 git 服务器,可以配置 commit 的钩子函数,实现自动部署和线上发布,就相当服务器监听你的提交,在你 commit 之后,服务器自动执行了一下 npm run build,放到对应的测试服务器目录,配置文件在根目录下有 .gitlab-ci.yml 文件,起作用的是下边一段代码,script 是 linux 脚本,拷贝文件到指定的静态资源 CDN 目录和web服务器目录,这块知识点是 gitlab-ci 持续集成,可以关注一下。
配置说明:
1 | before_script: |
配置案例:
1 | npm-build-test: |
如果团队有用 Jenkins 可以配置 gitlab commit 后自动触发 Jenkins 构建,构建脚本在 Jenkins 中配置,我们项目组就是这样设置。网上教程很多,这里就不说明了。
方案二 利用scp2自动化部署到静态文件服务器(Nginx)
scp2 是一个基于 ssh2 增强实现,纯粹使用 JavaScript 编写。而 ssh2 就是一个使用 nodejs 对于 SSH2 的模拟实现。scp,是 secure copy 的缩写, scp 是 Linux 系统下基于 SSH 登陆进行安全的远程文件拷贝命令。这里我们就用这个功能,在 Vue 编译构建成功之后,将项目推送至测试/生产环境,以方便测试,提高效率。
安装
1 | npm install scp2 --save-dev |
配置测试/生产环境 服务器SSH远程登陆账号信息
1.在项目根目录下, 创建 .env.dev 文件 (测试环境变量)
VUE_APP_SERVER_ID 变量表示 当前需部署的测试服务器ID为0
1 | // .env.dev文件中 |
2.在项目根目录下, 创建 .env.prod 文件 (生产环境变量)
VUE_APP_SERVER_ID变量表示 当前需部署的生产服务器ID为1
1 | // .env.prod文件中 |
3.在项目根目录下, 创建 deploy/products.js 文件
1 |
|
使用scp2库,创建自动化部署脚本
在项目根目录下, 创建 deploy/index.js 文件
1 | const scpClient = require('scp2'); |
添加 package.json 中的 scripts 命令, 自定义名称为 “deploy”
发布到测试环境命令为 npm run deploy:dev,生产环境为 npm run deploy:prod
1 | "scripts": { |
ps 这里用到了cross_env 得安装 npm i –save-dev cross-env cross-env能跨平台地设置及使用环境变量,这里用来设置是生产环境还是测试环境。
删除 dist 文件
打包每次hash值不同,dist里面文件岂不是越来越多,可以用 ssh2 先把dist文件删除,删除后重启nginx再上传至服务器。
1 | // deploy/index.js里面 |
方案二内容来自:
方案三 github webhook
自动部署的关键就在于webhook ,主流的代码托管平台都有这个功能,包括coding , github等,在仓库里可以设置,以github为例:
在 setting 中点击 Webhooks 即可,在 Webhooks 中 可以填写一个自己服务器的接口地址和一个 seret 用于验证 , 填写完了仓库会监听 push 操作 , 一旦有 push 操作,webhook 就会发出一个 post 请求到你设置的接口,然后在服务器端执行脚本进行 git pull 操作,把最新的代码拉下来,就完成了部署。
其实简单的 shell 脚本写起来非常简单,例如:
部署node服务
1 | echo "开始更新 服务1 服务器端" |
部署前端服务
1 | echo "开始更新前端文件" |
以上都是只用到了比较简单的 shell 语法。
方案四 利用 webpack 插件
其实就是在 Webpack 即将退出时再附加一些额外的操作,例如在 Webpack 成功编译和输出了文件后执行发布操作把输出的文件上传到服务器。
要实现该插件,需要借助两个事件:
done:在成功构建并且输出了文件后,Webpack 即将退出时发生;
failed:在构建出现异常导致构建失败,Webpack 即将退出时发生;
实现该插件非常简单,完整代码如下:
1 | class EndWebpackPlugin { |
使用该插件时方法如下:
1 | module.exports = { |
案例:webpack打包后自动发布插件UploadPlugin(以上传到七牛网为例),代码来自网上
UploadPlugin.js
1 | class UploadPlugin { |
1 | let webpack = require('webpack'); |