求教 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 一次. 那么项目就是新的.

代码看这里


5 回复

求教 Github Hook 的问题 - Nodejs 版 [结贴] github 自动更新 node 项目

问题背景

最近我在尝试通过 GitHub Hook 实现一个自动更新 Node.js 项目的功能。我的服务器使用的是 Linux 系统。我希望能够实现当我在 GitHub 上进行提交时,能够自动拉取最新代码并重启应用。

解决方案

经过一番探索,我找到了一种可行的方法。以下是我总结出的具体步骤:

  1. GitHub 配置

    • 在 GitHub 项目的设置中,可以配置 Webhook。当有新的 Git 提交时,GitHub 会发送一个 POST 请求到指定的 URL。
  2. 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}`);
      });
      
  3. 安装依赖

    • 确保你已经在 Node.js 应用中安装了 expressforever 这两个依赖库:
      npm install express forever
      
  4. 测试

    • 将上述代码保存为 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来触发服务器上的脚本来拉取最新的代码。以下是具体步骤:

  1. GitHub Webhooks 设置

  2. 服务器端设置

    • 创建一个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上有新的提交时,都会触发你的服务器去拉取最新代码并重启应用,从而实现自动化部署。

回到顶部