求教 Github hook的问题 - Nodejs版 [结贴] github 自动更新node项目
求教 Github hook的问题 - Nodejs版 [结贴] github 自动更新node项目
谁对github 比较了解呢 我想做个hook 要怎么弄呢 服务器是linux.
服务器要怎么控制git来clone呢?
求指导…
上面是昨天的问题.
今天已经找到解决办法了. 首先github的项目设置当中可以设置,当git commit的时候,就post一组json到你指定的url上. 根据这个,我将我的VPS上的node增加了一个接收的接口
app.post("/git-pull", git.gitpull);
然后用nodejs里的child_pross来执行git,获取到最新的版本内容.
但是我们知道app.js 一旦运行必须终止才会变成新的文件,否则执行的一直是老的文件. 所以我找到了forever. 当git pull执行以后 再forever restartall 一次. 那么项目就是新的.
求教 Github Hook 的问题 - Nodejs 版 [结贴] github 自动更新 node 项目
问题背景
最近我在尝试通过 GitHub Hook 实现一个自动更新 Node.js 项目的功能。我的服务器使用的是 Linux 系统。我希望能够实现当我在 GitHub 上进行提交时,能够自动拉取最新代码并重启应用。
解决方案
经过一番探索,我找到了一种可行的方法。以下是我总结出的具体步骤:
-
GitHub 配置
- 在 GitHub 项目的设置中,可以配置 Webhook。当有新的 Git 提交时,GitHub 会发送一个 POST 请求到指定的 URL。
-
Node.js 应用配置
- 需要在 Node.js 应用中创建一个接收 GitHub Hook 的接口。例如:
const express = require('express'); const app = express(); const { exec } = require('child_process'); // 接收 GitHub Hook 的接口 app.post('/git-pull', (req, res) => { // 执行 Git pull 命令 exec('git pull', (error, stdout, stderr) => { if (error) { console.log(`Error: ${stderr}`); return; } console.log(`stdout: ${stdout}`); }); // 重启 Node.js 应用 exec('forever restartall', (error, stdout, stderr) => { if (error) { console.log(`Error: ${stderr}`); return; } console.log(`stdout: ${stdout}`); }); res.send('Git pull and restart successful!'); }); // 启动应用 const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });
- 需要在 Node.js 应用中创建一个接收 GitHub Hook 的接口。例如:
-
安装依赖
- 确保你已经在 Node.js 应用中安装了
express
和forever
这两个依赖库:npm install express forever
- 确保你已经在 Node.js 应用中安装了
-
测试
- 将上述代码保存为
app.js
并启动你的 Node.js 应用。 - 在 GitHub 项目设置中添加 Webhook,并将 URL 设置为
http://your-server-ip:3000/git-pull
。 - 当你在 GitHub 上提交代码时,GitHub 会发送一个 POST 请求到
/git-pull
接口,从而触发 Git pull 和应用重启。
- 将上述代码保存为
总结
通过以上步骤,你可以实现当 GitHub 上有新的提交时,自动拉取最新代码并重启 Node.js 应用。这种方式可以大大提高开发效率和部署速度。希望这些信息对你有所帮助!
参考链接
如果你有任何疑问或需要进一步的帮助,请随时提问!
找到解决办法了,等我测试完,来结贴
结贴来的…
用NodeJS去跑一個Shell script, 要做什麼在shell script 執行就行。
要实现GitHub自动更新Node.js项目的功能,你可以使用GitHub Webhooks来触发服务器上的脚本来拉取最新的代码。以下是具体步骤:
-
GitHub Webhooks 设置:
- 登录你的GitHub仓库。
- 进入
Settings
->Webhooks
->Add webhook
。 - 输入一个URL(例如:https://your-server.com/git-pull),选择
Content type
为application/json
。 - 点击
Add webhook
完成设置。
-
服务器端设置:
- 创建一个Node.js应用来处理webhook请求。
- 使用
child_process
模块执行Git命令来拉取最新的代码。 - 使用
forever
来确保Node.js应用重启以加载新代码。
示例代码
// server.js
const express = require('express');
const bodyParser = require('body-parser');
const { exec } = require('child_process');
const forever = require('forever-monitor');
const app = express();
app.use(bodyParser.json());
app.post('/git-pull', (req, res) => {
// 验证GitHub的推送事件
if (req.headers['x-github-event'] === 'push') {
console.log('Received GitHub push event');
// 执行git pull命令
exec('cd /path/to/your/project && git pull origin master', (error, stdout, stderr) => {
if (error) {
console.error(`Error executing git pull: ${stderr}`);
return res.status(500).send({ message: 'Git pull failed' });
}
console.log(`Git pull completed: ${stdout}`);
// 重启应用
const child = new (forever.Monitor)('app.js', {
max: 3,
silent: true,
args: []
});
child.start();
res.send({ message: 'Git pull and restart successful' });
});
} else {
res.status(400).send({ message: 'Invalid request' });
}
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
解释
- 验证GitHub推送事件:检查请求头中的
x-github-event
是否为push
。 - 执行git pull:在指定目录中执行
git pull
命令来拉取最新代码。 - 重启应用:使用
forever
来重启Node.js应用,确保应用加载最新代码。
这样配置后,每次GitHub上有新的提交时,都会触发你的服务器去拉取最新代码并重启应用,从而实现自动化部署。