GitHub CI/CD | PM2 之 Node 应用文件监听自动重启
前言
PM2 是什么?
首先,简单介绍下 PM2, 可能还有小伙伴不知道什么是 PM2
,PM2
是 node 进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。更多使用说明请查看官方文档
常用命令
# 启动
$ pm2 start [file_name]
# 重启
$ pm2 restart [app_name|app_id|all]
# 删除
$ pm2 delete [app_name|app_id|all]
# 停止
$ pm2 stop [app_name|app_id|all]
# 显示所有进程状态列表
$ pm2 list
# 查看单个进程详细信息
$ pm2 describe [app_name|app_id]
# 查看进程日志
$ pm2 logs [app_name|app_id]
# 监控
$ pm2 monit
PM2 文件监听-自动重启
最简单的方式就是我们可以再上面的启动命令后面添加 --watch
,例如:
pm2 start ./app.js --name app1 --watch
不过 --watch
的方式只能监听 app.js
文件变更,如果想监听特定的文件或文件夹,就得通过配置文件启动。
PM2 配置文件方式启动
除了上面的基础命令行方式启动,我们还可以指定一个配置文件来启动,需要创建一个 ecosystem.config.js
文件。
配置文件
module.exports = {
apps : [{
name : "app1",
script : "./app.js"
}]
}
apps
中可以同时设置多个应用。通过下面的命令我们就可以批量启动或停止多个应用。
通用配置文件启动
# Start all applications
pm2 start ecosystem.config.js
# Stop all
pm2 stop ecosystem.config.js
# Restart all
pm2 restart ecosystem.config.js
# Reload all
pm2 reload ecosystem.config.js
# Delete all
pm2 delete ecosystem.config.js
最重要的一点就是,我们可以有更多的可选项,例如设置 监听路径
。
module.exports = {
apps : [{
name : "app1", // app name
script : "./app.js", // 启动执行文件
cwd: '/www/server/node/app1/', // script 执行目录
watch: [ // 监听文件路径
'app.js',
'config',
'controller',
'utils',
'models',
'router',
'views',
],
watch_delay: 1000, // 文件变化后,延迟重启时间
ignore_watch: ['node_modules', 'bin', 'client-vue'] // 监听忽略路径
}]
}
上面最重要的属性就是 watch
属性,它可以为 Boolean, 为 true 时等价于 pm2 start ./app.js --name app1 --watch
。watch 为 Array 时,就可以自定义监听文件路径。
配置文件基础选项
除了上面示例配置项,还有如下常用选项,更多请查看 PM2官网-高级选项
字段 | 类型 | 示例 | 描述 |
---|---|---|---|
name | (string) | “my-api” | 应用名称(默认启动文件名) |
script | (string) | ”./api/app.js” | 启动文件的相对路径 |
cwd | (string) | “/var/www/” | 启动文件所在的目录 |
args | (string) | “-a 13 -b 12” | 传给启动脚本的参数 |
interpreter | (string) | “/usr/bin/python” | 启动文件解释器绝对路径(默认 node) |
interpreter_args | (string) | ”–harmony” | 传给解释器选项 |
node_args | (string) | 解释器选项别名 |
github action 前后端完整部署流程
name: release
on:
push:
branches: master
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 签出代码
uses: actions/checkout@master
- name: 安装 nodejs
uses: actions/setup-node@v2
with:
node-version: "14"
- name: 安装依赖
run: npm install
working-directory: client-vue/mobile
- name: 前端项目打包
run: npm run build
working-directory: client-vue/mobile
- name: 发布腾讯云
uses: wlixcc/SFTP-Deploy-Action@v1.0
with:
username: 'root'
server: '${{ secrets.TENCENT_SERVER_HOST }}'
ssh_private_key: '${{ secrets.TENCENT_SERVER_PRIVATE_KEY }}'
local_path: 'client-vue/mobile/dist/*'
remote_path: '/www/wwwroot/app1-cline/'
args: "-o ConnectTimeout=5"
deploy-serve:
runs-on: ubuntu-latest
steps:
- name: 签出代码
uses: actions/checkout@master
- name: 准备好要发布的文件
run: |
mkdir deploy
rsync -av --progress . deploy --exclude .github --exclude client-vue --exclude .gitignore --exclude .github --exclude .git
- name: 发布腾讯云
uses: wlixcc/SFTP-Deploy-Action@v1.0
with:
username: 'root'
server: '${{ secrets.TENCENT_SERVER_HOST }}'
ssh_private_key: '${{ secrets.TENCENT_SERVER_PRIVATE_KEY }}'
local_path: 'deploy/*'
remote_path: '/www/server/node/app1-server/'
args: "-o ConnectTimeout=5"
总结
通过上面的操作,上传的服务器的 node 后端代码,就能自动重启 Node 服务器。至此,也彻底将我的一个 记账本 app
实现了全流程 DevOps
。修改代码提交,就能前后端自动部署的体验确实方便不少,能让开发者更加专注业务开发,而不必花费大量时间在繁琐的部署流程。
转载自:https://juejin.cn/post/7132430106626261028