nodejs 如何实现自动化部署?
什么是自动化部署
我接触到的自动化部署概念最早是在 Vercel 上提供的,Vercel 可以提供和 github 联动的功能,通过和你自己的 github 上的某个库建立‘链接’,当你 commit 到 github 远程库时就可以自动部署,Vercel 会帮你完成以下操作(例子为一个 Webpack 项目,仅限 Web 前端,如有遗漏望补充)
Webpack打包(默认是项目package.json的打包命令)- 打包文件迁移到
Vercel的服务器上(dist目录下的文件) - 部署网站(
Vercel使用的Nginx还是Apache我就不知道了,应该是用的Nginx)
另一个自动化部署概念是在实习时接触的,公司称之为流水线,它的作用和 Vercel 差不多,不过会多了两个步骤
ESLint校验代码- 重新安装依赖
Webpack打包(默认是项目package.json的打包命令)- 打包文件迁移到
Vercel的服务器上(dist目录下的文件) - 部署网站(
Vercel使用的Nginx还是Apache我就不知道了,应该是用的Nginx)
现在自动化部署的概念炒的火热,主要是它通常还可以和 Serverless 绑定在一起,Serverless 意思是无服务器,其实就是托管应用程序到 Serverless 服务提供商的服务器上,像一些小微公司可以直接托管网站、小程序,完全不用买服务器(为啥不买服务器,因为 Serverless 便宜呀)
像 Serverless、自动化部署和它们的可视化界面就不多介绍了,但我要说腾讯云在这方面做的很烂,相反 Azure 和 Vercel 做的就很好
普通部署
说完了自动化部署那么我们平常的普通部署是怎么做的呢?以一个 nodejs 的普通接口为例(基于 express-generator 生成的项目)
# npm v5.2.0 以上版本
npx express --no-view --git
git init
npm install
执行上面的命令后得到下面的目录结构
├── .git/
├── bin/
├── node_modules/
├── public/
├── routes/
├── .gitignore
├── app.js
├── package-lock.json
└── package.json
- 第一步,在宝塔安装
pm2如果你没有的话(pm2会自动安装nodejs和npm)

- 第二步,在服务器找到一个地方放你的文件,这里项目比较小,我就直接丢上去了(一般使用
zip压缩文件,或者在服务器上重新执行npm install)

- 第三步,在你的
PM2面板里面添加项目


- 第四步,提交查看效果,是否符合本地运行预期

后续重新更新部署怎么办?很简单,将更新的文件覆盖掉原文件,在 PM2 重启一下就行了

但是如果我想本地 git 提交代码到远程库的时候能够顺便部署行不行呢?看下面的操作
自动化部署
本篇文章实现的自动化部署是基于 github 的 Webhooks 和宝塔的 WebHook 实现
那如何将上面的普通部署改成这个自动化部署呢?
- 第一步,在
github上创建对应的库(反正又不要钱,随便创)

- 第二步,在服务器拉取项目并在在
PM2添加项目(同普通部署)并查看id信息
cd /www/temp
git clone git@github.com:pandoralink/auto-deploy.git
cd auto-deploy
npm install
# 查看 Linux 的 PM2 项目 id 信息
pm2 list
id 信息如下图

在 Linux 操作 git 添加公钥私钥到远程仓库(github/gitee)可以参考 服务器上的 Git - 生成 SSH 公钥 和 远程仓库 - 远程仓库
- 第三步,安装宝塔
WebHook插件

- 第四步,添加宝塔
WebHook规则

- 第五步,获取宝塔
WebHookURL

- 第六步,配置
github的WebHooks

注意,content-type 需要选择 application/json,否则 github 请求此 URL 时,宝塔会返回 403 错误
配置结果如图

测试修改一下 public/index.html 的内容,并 push 到 github 远程仓库

成功修改并部署成功,结果如下

总结
相比于 Vercel 还是我实习公司的流水线,文章中实现的自动化部署还是过于简陋,成熟的自动化部署拥有可视化界面,完善的日志,部署进度条,这些都是需要很多努力和经验去实现的,最后给出自动化部署的流程图

参考资料
转载自:https://juejin.cn/post/7169577953272020999