Nodejs 有没有好的方案从 Github 自动检测更新自动 pull 和部署应用?

Nodejs 有没有好的方案从 Github 自动检测更新自动 pull 和部署应用?

Git 管理代码比较习惯了, 每次都是手动 pullforever restart挺麻烦… 加上还要 ssh 服务器, VPS 网络有不稳定的时候, 学校里用的是 Gitlab… 部署和开发可能也不会是同一个人操作. 于是觉得 Git 自动部署会不错… 我原来想的办法只有 crontab 循环进行 pullrestart, 但总重启不合适, 请问大家有用到有什么方案?


8 回复

当然可以。你提到的需求可以通过使用 GitHub Actions 或者第三方服务如 Jenkins、Travis CI 来实现自动化部署。不过,如果你想用 Node.js 来实现一个自定义的解决方案,可以考虑以下方法。

方法一:使用 GitHub Webhooks

GitHub Webhooks 可以让你在仓库发生变化时自动触发事件。你可以设置一个 Webhook,当你的 GitHub 仓库有新的提交时,GitHub 会向你的服务器发送一个 POST 请求。然后,你的服务器接收到请求后可以执行一系列脚本,例如 git pull 和重启应用。

示例代码

  1. 创建一个简单的 Express 服务器 来接收 Webhook 请求:
const express = require('express');
const bodyParser = require('body-parser');
const { exec } = require('child_process');

const app = express();
app.use(bodyParser.json());

app.post('/github-webhook', (req, res) => {
    const payload = req.body;
    
    // Check if the event is a push event
    if (payload.action === 'pushed') {
        exec('cd /path/to/your/repo && git pull', (error, stdout, stderr) => {
            if (error) {
                console.error(`exec error: ${error}`);
                return;
            }
            console.log(`stdout: ${stdout}`);
            console.log(`stderr: ${stderr}`);

            // Restart your application
            exec('pm2 restart your-app-name', (error, stdout, stderr) => {
                if (error) {
                    console.error(`exec error: ${error}`);
                    return;
                }
                console.log(`stdout: ${stdout}`);
                console.log(`stderr: ${stderr}`);
            });
        });
    }

    res.status(200).send('OK');
});

app.listen(3000, () => {
    console.log('Server listening on port 3000');
});
  1. 在 GitHub 上配置 Webhook
    • 进入你的 GitHub 仓库的设置页面。
    • 选择 “Webhooks” 选项卡。
    • 点击 “Add webhook”。
    • 在 “Payload URL” 中输入你的服务器地址(例如:http://your-server.com/github-webhook)。
    • 选择 “Content type” 为 application/json
    • 选择 “Just the push event”。
    • 点击 “Add webhook”。

解释

  • Express 服务器:我们使用 Express 创建了一个简单的 HTTP 服务器来监听来自 GitHub 的 POST 请求。
  • GitHub Webhook:当仓库有新的提交时,GitHub 会向服务器发送一个 POST 请求。
  • 执行命令:服务器接收到请求后,执行 git pull 命令拉取最新的代码,并使用 pm2 重启应用。

这种方法简单且灵活,可以根据需要调整脚本逻辑。


github有提供一个服务,在项目有更新时,会自动回调指定的URL。

点项目的“Admin”按钮 => Service Hooks => WebHook URLs

参考这里:https://help.github.com/articles/post-receive-hooks

搜了下 Git 可以设置 bare repo 从本地通过 ssh 直接推送到服务器, 并触发挂钩 http://yuguo.us/weblog/push-git-repository-to-server/ http://blog.meiweier.com/2012/08/09/利用git的hooks自动部署网站实践.html http://icyleaf.com/2010/09/apps-auto-deploy-with-git 不如一楼的 Git 好用, 但可以作为备选方案看下…

这么说是自己写 Shell 脚本, 然后用监听着 URL 的服务器调用脚本, 搜了下觉得比较考验人对 Bash 的熟悉度…

写了个小东西http://www.fancycoding.com/automatic-deploy-task-using-github-hooks/

钩子呗

Github、GitLab、Gitee使用Webhooks实现代码自动部署: http://www.awaimai.com/2203.html 比较全面的git webhooks原理解释和实现。

要实现从 GitHub 自动检测更新、自动拉取并部署应用的功能,可以使用 GitHub Webhooks 结合 Node.js 来实现。这种方式不仅更高效,而且减少了手动操作的复杂性。

方案概述

  1. GitHub Webhook: 在 GitHub 仓库中设置一个 webhook,当有新的提交时,GitHub 会向你的服务器发送一个 HTTP POST 请求。
  2. Node.js 应用: 编写一个 Node.js 应用来接收 GitHub 的 webhook 请求,并处理相应的逻辑(如拉取最新代码、重启服务等)。

示例代码

以下是一个简单的 Node.js 示例代码,展示如何实现这一功能:

const express = require('express');
const { exec } = require('child_process');

const app = express();
app.use(express.json());

// 设置 GitHub webhook 的 secret,用于验证请求
const GITHUB_SECRET = 'your-secret';

app.post('/webhook', (req, res) => {
    const signature = req.headers['x-hub-signature-256'];
    const hmac = crypto.createHmac('sha256', GITHUB_SECRET);
    const digest = `sha256=${hmac.update(JSON.stringify(req.body)).digest('hex')}`;

    if (signature !== digest) {
        return res.status(401).send('Unauthorized');
    }

    // 拉取最新的代码
    exec('git pull', (error, stdout, stderr) => {
        if (error) {
            console.log(`Error: ${stderr}`);
            return res.status(500).send('Failed to pull code');
        }
        console.log(`Pull successful: ${stdout}`);

        // 重启应用
        exec('pm2 restart your-app-name', (error, stdout, stderr) => {
            if (error) {
                console.log(`Error: ${stderr}`);
                return res.status(500).send('Failed to restart app');
            }
            console.log(`App restarted successfully: ${stdout}`);
            res.send('Deployed successfully!');
        });
    });
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is listening on port ${PORT}`);
});

解释

  1. Express 应用: 使用 Express 创建一个简单的 HTTP 服务器来接收 GitHub 的 webhook 请求。
  2. 验证签名: 验证 GitHub 发送的 webhook 请求是否合法,以防止非法请求。
  3. 执行命令: 使用 exec 方法执行 git pull 命令拉取最新代码,然后使用 pm2 restart 命令重启应用。

GitHub Webhook 设置

  1. 登录到你的 GitHub 仓库。
  2. 进入 Settings -> Webhooks
  3. 添加一个新的 webhook,URL 设置为你的服务器地址(例如:http://your-server.com/webhook),Secret 设置为你在代码中配置的值。

通过这种方式,你可以实现自动化的代码部署流程,减少人工干预的复杂性和错误。

回到顶部