nuxt+pm2 自动化部署及打包后文件自动上传阿里云 oss(精华)

2020-03-17 14:21:31

参考地址 nuxt+pm2 自动化部署及打包后文件自动上传阿里云 oss

在读这篇文档时,希望你对 nuxt 及 pm2,有简单的了解

前期准备

安装 pm2 及构建 nuxt

$ npm i pm2 -g
$ npx create-nuxt-app <项目名>

ssh 密钥配置

  • pm2 代码自动发布依赖于 git 工具,先将 ssh 密钥配置再你的代码仓库(github 或者 gitLab),具体操作自行 google 或者点击github 配置 ssh

  • 使用 ssh 密钥链接服务器 s $ ssh-copy-id root@1.2.3.4 # 把本机的 SSH 秘钥添加至服务器,配置成功后,以后就不需要再执行这条 SSH 命令了

pm2 自动部署

生成 pm2 配置文件

$ pm2 ecosystem

运行后会在项目根目录生成 ecosystem.config.js 文件

这是个简单的配置文件,供大家参考

module.exports = {
  apps: [
    {
      name: "my-app",
      autorestart: true,
      script: "server/index.js",
      env: {
        NODE_ENV: "development"
      },
      env_production: {
        NODE_ENV: "production"
      }
    }
  ],
  deploy: {
    dev: {
      // 服务器操作用户      user: "root",
      // 服务器ip      host: "1.2.3.4",
      ref: "origin/master",
      repo: "https://github.com/faner11/angular-case.git",
      path: "/root/my-app",
      "post-deploy":
        "rm -rf node_modules && npm install && npm run build && pm2 startOrReload ecosystem.config.js --env production"
    }};

post-deploy中做了哪些操作 + rm -rf node_modules 删除 node_modules + npm install 重新安装包 + npm run build 运行打包 + pm2 startOrReload ecosystem.config.js --env production pm2 启动应用

初始化项目并发布

  • 本机初始化远程服务器上的项目pm2 deploy dev setup,命令中的dev是在上面配置文件中写的部署环境的名称。

  • git 提交代码,git push origin master将代码提交至远程仓库。

  • 部署项目pm2 deploy dev,这个命令执行后服务器把前面从本机提交至 git 仓库上的最新代码拉下拉,并且运行post-deploy中的命令。一般没什么问题的话,经过这几步操作,就能部署成功了。

打包后文件上传 oss

参考文档

上传代码

在根目录新建upload.js文件

const OSS = require("ali-oss");const fs = require("fs");const path = require("path");const os = require("os");const PUBLIC_PATH = path.join(__dirname, "/");const client = new OSS({
  accessKeyId: "your access key",
  accessKeySecret: "your access secret",
  bucket: "your bucket name",
  region: "oss-cn-hangzhou"});/** *获取文件目录并删除 * @param {*} dir //文件目录 */async function deleteDir(dir) {
  let result = await client.list({
    prefix: dir + "/",
    delimiter: "/"
  });
  if (result.objects) {
    let aa = [];
    result.objects.forEach(function(obj) {
      aa.push(obj.name);
    });
    try {
      await client.deleteMulti(aa, {
        quiet: true
      });
      console.log("删除成功");
    } catch (e) {
      console.log("文件删除失败", e);
    }
  }}/** * 遍历文件夹递归上传 * @param {path} src 本地路径 * @param {string} dist oos文件夹名 www|kouzi */function addFileToOSSSync(src, dist) {
  let docs = fs.readdirSync(src);
  docs.forEach(function(doc) {
    let _src = src + "/" + doc,
      _dist = dist + "/" + doc;
    let st = fs.statSync(_src);
    // 判断是否为文件    if (st.isFile() && doc !== ".DS_Store") {
      putOSS(_src, _dist);
    }
    // 如果是目录则递归调用自身    else if (st.isDirectory()) {
      addFileToOSSSync(_src, _dist);
    }
  });}/** *单个文件上传至oss */async function putOSS(src, dist) {
  try {
    await client.put("/" + dist, src);
  } catch (e) {
    console.log("上传失败".e);
  }}/** *上传文件启动 *@param {string} dirName 将要上传的文件名 */async function upFile(dirName) {
  try {
    await deleteDir(dirName);
    await addFileToOSSSync(PUBLIC_PATH + ".nuxt/dist/client", dirName);
    console.log(dirName + "上传oss成功");
  } catch (err) {
    console.log(dirName + "上传oss成功失败", err);
  }}upFile("www");

修改package.json

scripts中的build改为如下:

{
  "scripts": {
    "build": "nuxt build && node upload.js"
  }}

修改nuxt.config.js

export default {
  build: {
    publicPath: "https://cdn.nuxtjs.org"
  }};

结束

至此我们的自动化部署加文件自动上传阿里云 oss 就完成了。 以后只需执行pm2 deploy dev就可以了。


  • 2018-08-18 20:30:12

    laravel5.5 路由分割成不同文件

    routes.php/api.php文件用来放置laravel路由,当项目越来越大,相应的路由文件也会越来越多。如果能够将不同功能的路由分割到不同的文件,那么对以后的维护将很有帮助。

  • 2018-08-20 15:26:19

    关于OnTouch 和OnClick同时调用冲突的解决方案

    大家在搞轮播图的时候会碰到这样的情况,点击进入webview界面,长按轮播图停止轮播,手松开图又开始轮播,这里就涉及到了OnTouch 和OnClick同时调用。两者是有冲突的。这里简单介绍,给大家提供思路。

  • 2018-08-20 15:29:11

    揭开RecyclerView的神秘面纱(二):处理RecyclerView的点击事件

    主要讲述了RecyclerView的基本使用方法,不同的布局管理器而造成的多样化展示方式,展示了数据之后,一般都会与用户进行交互,因此我们需要处理用户的点击事件。在ListView和GridView提供了onItemClickListener这个监听器,然而我们查找RecyclerView的API却没有类似的监听器,因此我们需要自己手动处理它的点击事件。 以下提供两种方法来实现处理RecyclerView点击事件的功能,以下代码均基于上一篇文章的代码做出修改。

  • 2018-08-20 22:58:46

    onInterceptTouchEvent和onTouchEvent调用关系详解 ...

    老实说,这两个小东东实在是太麻烦了,很不好懂,我自己那api文档都头晕,在网上找到很多资料,才知道是怎么回事,这里总结一下,记住这个原则就会很清楚了:

  • 2018-08-23 15:32:18

    map对象拷贝问题

    最后面是使用序列化的方式,发现,更改引用类型的数据的时候,mapNew对象并没有发生变化,所以产生了深拷贝。 上述的工具类,可以实现对象的深拷贝,不仅限于HashMap,前提是实现了Serlizeable接口。

  • 2018-08-24 11:33:17

    总结和分析几种判断 RecyclerView 到达底部的方法

    SwipeRefreshLayout 写一个 RecyclerView 的上下拉 ,里面有一个判断 RecyclerView 是否到达底部的方法 isBottom。我的同事用了这个上下拉之后发现有些小 bug,没考虑周全,譬如各个子项高度不统一的时候,然后我找到原因是因为这个判断上下拉的问题。所以,我就去网上查到几种判断 RecyclerView 到达底部的方法,发现各有千秋。以下的分析都以上一篇文章的 SwipeRecyclerView 为例

  • 2018-08-26 00:18:04

    RecyclerView 图片错位空白的问题

    1.图片错位的原因是因为图片异步记载返回去展示出的问题。图片空白,是item刷新,请求图片时间上的问题。 2。viewHolder.setIsRecyclable(false); 就没有tag,不设置 就有tag,但是有没有没啥区别 设置tag,

  • 2018-08-28 10:00:24

    laravel使用队列的简单步骤

    最近需要导入大量的excel文件,数量达到十万之多。 而我又不想修改服务器的超时时间,因为这样可能影响服务器的堵塞。 而php又没有很好的异步。 后来发现了令laravel最为骄傲的部分,队列。具体文档参考下方链接。