最近在玩 nuxt 重构了一下之前写的 blog,最后到部署阶段,踩了一些坑,所以来记录一下。

1、最简单的部署

最简单的部署就是,在本地把 nuxt.js 进行打包,运行npm run build,然后把打包生成后的.nuxt文件夹、还有 static nuxt.config.js package.json package-lock.json 这几个文件,丢到服务器上,然后在安装一下依赖,最后执行 npm run start 就好了。

2、使用 pm2 启动 node 服务

也可以使用 pm2 来启动应用,要使用 pm2 前要先全局安装。大体的流程和第一步是一样的,上传到服务器后,使用 pm2 的命令来启动服务。

pm2 是这样启动的: pm2 start npm -- start

可以这么理解,还是使用 npm 启动服务,但是这个服务交给了 pm2 来管理了。

还有一种方式,可以在项目根目录下,新建一个 json 文件,我一般都是以 pm2.config.json 来命名,在这个文件中写入的配置,然后把这个文件丢到服务器上,运行 pm2 reload pm2.config.json 这样也能启动服务。

3、持续集成、持续部署

上面的两种方式,其实都不是最好的。想想,每更新一次都要去手动打包、构建、传输到服务器、解压、安装依赖,重启服务。手工的事情太多了,事多了容易误事,不难但低效麻烦。

那,有没有工具可以帮我们去做这些东西啊?

答案是有的。可以使用 CI/CD 持续集成、持续部署这样的工具和服务来帮助我们做这些工作,可以提升工作效率。

上网一搜,这些工具还挺多的,比如:Jenkins、Travis CI、Circle CI、GitLab CI、Github Actions 等等之类的。

先简单的来说说,什么是 CI/CD

CI 可以理解成,持续集成开发人员提交的代码,然后进行构建、测试。根据测试的反馈结果,来确定新旧代码是否能集成在一起。CI 的重点是:新旧代码的测试是否可以集成在一起

CD 可以理解成,在 CI 的基础上,将集成后的代码部署到服务器上,不需要人工参与。

这篇文章描述的还挺简单易懂的:3 分钟了解清楚持续集成、持续交付、持续部署

我在工作中用的比较多的还是 CD,公司里用的是 jenkins 来自动化部署的。

使用 Github Actions

我这里使用了 Github Actions,使用它的目的呢好像还挺方便的,除了在国内网速比较慢,好像也没有其他不好的地方了(其实是不想去了解其他的)。

大致的流程主要是下面这样的:

Nuxt.js的发布部署 - 图1

要是用 Github Actions 还要去申请一个 github 的 token,只需要把 repo 仓库方面的权限勾上就可以了

Nuxt.js的发布部署 - 图2

然后啊,要去仓库 Settings->Secrets 模块加几个常量,分别如下:

  • TOKEN 你的 github token
  • HOST 服务器地址
  • PORT 服务器端口
  • USERNAME 服务器用户名
  • PASSWORD 服务器密码

Nuxt.js的发布部署 - 图3

为啥要加这几个东西啊?

因为自动部署的时候会用到的,它会登录你的服务器,然后去执行一些安装、编译、打包、重启服务的一些操作。

常量加好了之后,还要在项目根目录下新建一个 .github 的文件夹,并且在 .github 文件夹里面新建一个 workflows 文件夹,然后新建一个 main.yml 的文件。

这个文件主要是用来写 github actions 工作流的,主要是以下的代码,有点多:

  1. name: Publish And Deploy # CI/CD的名称
  2. on:
  3. push:
  4. tags: # 主要是捕获到标签tags的推送,并且是以v开头的,就开始执行下面的任务
  5. - "v*"
  6. jobs: # 工作流
  7. build-and-deploy:
  8. runs-on: ubuntu-latest
  9. steps: # 步骤
  10. # 下载源码
  11. - name: Checkout
  12. uses: actions/checkout@master
  13. # 打包构建
  14. - name: Build
  15. uses: actions/setup-node@master
  16. - run: npm install
  17. - run: npm run build
  18. - run: tar -zcvf release.tgz .nuxt static utils config.js nuxt.config.js package.json package-lock.json pm2.config.json
  19. # 发布 Release
  20. - name: Create Release
  21. id: create_release
  22. uses: actions/create-release@master
  23. env:
  24. GITHUB_TOKEN: ${{ secrets.TOKEN }} # github token
  25. with:
  26. tag_name: ${{ github.ref }}
  27. release_name: Release ${{ github.ref }}
  28. draft: false
  29. prerelease: false
  30. # 上传构建结果到 Release
  31. - name: Upload Release Asset
  32. id: upload-release-asset
  33. uses: actions/upload-release-asset@master
  34. env:
  35. GITHUB_TOKEN: ${{ secrets.TOKEN }}
  36. with:
  37. upload_url: ${{ steps.create_release.outputs.upload_url }}
  38. asset_path: ./release.tgz
  39. asset_name: release.tgz
  40. asset_content_type: application/x-tgz
  41. # 部署到服务器
  42. - name: Deploy
  43. uses: appleboy/ssh-action@master
  44. with:
  45. host: ${{ secrets.HOST }} # 服务器ip
  46. username: ${{ secrets.USERNAME }} # 服务器用户名
  47. password: ${{ secrets.PASSWORD }} # 服务器密码
  48. port: ${{ secrets.PORT }} # 服务器端口
  49. # 下面的 script 就是在服务器上运行的脚本
  50. # 1、首先先进入到一个你指定的文件夹下
  51. # cd /xxx/xxx
  52. # 2、下载github指定仓库里面最新的release包到当前文件夹
  53. # wget https://github.com/:username/:repos/releases/latest/download/release.tgz -O release.tgz
  54. # 3、解压
  55. # 4、安装依赖
  56. # 5、启动服务
  57. script: |
  58. cd /webapp/diary
  59. wget https://github.com/Aisen60/diary/releases/latest/download/release.tgz -O release.tgz
  60. tar zxvf release.tgz
  61. npm install --production
  62. pm2 reload pm2.config.json

代码太多了,我上传到了 gits 上了,有需要自取哈:https://gist.github.com/Aisen60/add6d4d8df20ad4d94a082995c4bcda9

然后,当需要发版的时候,打一个以“v”开头的标签 tag 推送到远程就可以了,github actions 就会检测到,就会开始工作了。

当下面的出现都变成绿色了,就表示部署成功了

Nuxt.js的发布部署 - 图4

然后啊,链接你的服务器,或者,直接在浏览器输入你的项目地址,看看页面有没有出来。

但是我这里遇到一个小坑啊,我的 github actions 已经构建成功了,然后我链接我的我服务器,输入 pm2 list,项目也是有运行起来的,可是就是访问不了,于是我重新构建了好多次也没解决。

然后,我链接服务器,输入 curl + ip 提示拒绝访问

Nuxt.js的发布部署 - 图5

证明,我的程序可能没起来

然后,我进入到服务器项目的路径,输入 npm run start 发现报错了

Nuxt.js的发布部署 - 图6

提示:找不到 config 文件

突然恍然大悟,我有一些自己添加的文件没有写入到 yml 构建配置里面 然后重新部署一下,就可以了