树莓派本地Node.js服务器自动拉取GitHub代码并重启方案咨询
自动拉取GitHub代码并重启树莓派上的Node.js服务器
一、拉取最新代码
既然你已经搞定了新提交的感知逻辑,直接在触发逻辑里加代码拉取操作就行,两种常用方式:
1. Git原生拉取
如果你的项目目录本身就是Git仓库,直接执行shell命令:
# 切换到项目目录 cd /path/to/your/node-project # 先暂存本地临时修改(避免拉取冲突,不需要的话可以跳过) git stash # 拉取对应分支的最新代码,把main换成你的分支名(比如master) git pull origin main # 如果之前暂存了修改,需要恢复就执行 git stash pop
关键:提前给树莓派配置GitHub免密拉取——生成SSH密钥,把公钥加到GitHub账户的SSH Keys里,不然拉取会卡在密码输入环节。
2. 同步依赖(可选但建议)
如果拉取后package.json有变动,一定要重新装依赖:
npm install # 用yarn的话就换成 yarn install
二、重启Node服务器
因为你的服务涉及多端口和数据库,数据库如果是独立运行的(比如MySQL、MongoDB),一般不用重启,重点是平滑重启Node进程,推荐用pm2管理进程:
1. 用pm2管理(强烈推荐)
pm2能帮你实现平滑重启、进程监控,还能自动拉起崩溃的进程。
- 先装pm2:
npm install -g pm2
- 启动你的服务:
cd /path/to/your/node-project pm2 start app.js --name "my-node-server" # 替换成你的入口文件和自定义服务名
- 拉取代码后重启:
pm2 restart my-node-server # 服务多的话可以用 pm2 restart all
平滑重启的好处是新进程先启动,旧进程再关闭,几乎不会有服务中断。
2. 原生方式(不推荐)
不想用pm2的话,只能手动杀进程再重启:
# 找到Node进程ID PID=$(ps aux | grep "node app.js" | grep -v grep | awk '{print $2}') # 杀掉进程 kill $PID # 后台重启服务,输出日志到server.log nohup node app.js > server.log 2>&1 &
这种方式容易因为进程没找到报错,而且重启过程会有明显的服务中断,不建议用在生产环境。
三、整合到你的感知逻辑里
把上面的命令整合到你现有的触发代码里,比如用Node的child_process执行shell命令:
const { exec } = require('child_process'); // 感知到新提交后调用这个函数 async function updateAndRestart() { // 拉取代码 exec('cd /path/to/your/node-project && git stash && git pull origin main', (err, stdout, stderr) => { if (err) { console.error('拉取代码失败:', stderr); return; } console.log('代码拉取完成:', stdout); // 安装依赖 exec('cd /path/to/your/node-project && npm install', (err, stdout, stderr) => { if (err) { console.error('依赖安装失败:', stderr); return; } console.log('依赖安装完成:', stdout); // 重启服务 exec('pm2 restart my-node-server', (err, stdout, stderr) => { if (err) { console.error('重启服务失败:', stderr); return; } console.log('服务重启成功:', stdout); }); }); }); }
注意:执行这段代码的Node进程要有足够权限,比如能读写项目目录、执行pm2命令。
四、额外提醒
- 确保树莓派能正常访问GitHub,网络别出问题;
- 如果代码涉及数据库结构变更,要在重启前先跑迁移脚本(比如
npx sequelize-cli db:migrate,根据你的ORM工具调整); - 把所有操作的日志输出到文件,方便出问题时排查;
- 先手动跑一遍所有命令,确认没有权限或路径错误再自动化。
内容的提问来源于stack exchange,提问作者vishnu nair
相关产品推荐
相关产品推荐

