GitHub Webhook CI/CD:分步指南

2025-06-10

GitHub Webhook CI/CD:分步指南

(本博客文章是我Mustapha El Idrissi合作作品的一部分,有关更多信息,请参阅他的 devTo 页面:https://dev.to/appsbymuss

什么是 CI/CD

CI/CD,即持续集成和持续交付/部署,是一套自动化软件开发、测试和发布流程的实践和工具。它可以帮助开发人员更频繁、更安全、更可靠地交付代码更改。

  • 持续集成:这是一种开发实践,开发人员经常将他们的代码更改集成到共享存储库中。

  • 持续交付:进一步自动化整个发布流程。代码通过所有测试阶段后,将自动部署到生产环境。

有很多工具可用于执行CICD,例如但不限于:

  • 詹金斯
  • GitHub Actions
  • GitLab CI/CD
  • 特拉维斯·CI

然而,这些工具通常会受到资源使用限制或需要资金投入才能有效使用,同时初学者在软件开发生涯开始时很难使用这些工具。

  • 然而,有一种更容易引导但更难高效设置的方法来实现 CI/CD,那就是“GitHub Webhooks

如何设置 GitHub Webhook?

步骤 0:创建 repo

  • 当然,当我们有一个新项目时,我们必须为其创建一个新的存储库来存储我们的代码更改(又名提交),但在这种情况下,它对于实现我们的 CI/CD 目标也很有用。

步骤 1:为 POST-webhook 创建路由

  • 假设您已经拥有一个服务器,该服务器在特定端口上启动并运行所需的运行时环境/框架。
  • 您还必须创建一个 webhook,以便当您的 GitHub 仓库上的主/生产分支发生新的更改时,Github 能够访问您的服务器,如下所示:
require('dotenv').config();
const express = require('express');
const crypto = require('crypto');
const bodyParser = require('body-parser');
const { exec } = require('child_process');
const app = express();

const updatedAt = new Date();

function verifySignature(req, res, buf, encoding) {
    const signature = req.headers['x-hub-signature-256']; // GitHub sends the signature here

    if (!signature) {
        console.log('No signature found on request');
        return false;
    }

    const hmac = crypto.createHmac('sha256', process.env.REPO_WEBHOOK_SECRET);
    const digest = 'sha256=' + hmac.update(buf).digest('hex');

    if (signature !== digest) {
        console.log('Signature does not match');
        return false;
    }

    console.log('Signature is valid');
    return true;
}

app.use(bodyParser.json());

app.post('/cicd/github-cicd', (req, res) => {
    const buf = JSON.stringify(req.body); // The raw body of the request
    // const isValid = verifySignature(req, res, buf);

    /* if (!isValid) {
            return res.status(401).send('Invalid signature');
    }*/

    const { ref } = req.body;
    if (ref === 'refs/heads/main') {
        // PM2 is my instance manager
        exec('git pull origin main && pm2 restart cicd_app');
    }
    res.sendStatus(200);
});

app.get('/cicd/time', (req, res) => {
    res.send(`<h1>${updatedAt}</h1>`);
});

app.listen(80, () => {
    console.log("Listening on Port 80...");
});
Enter fullscreen mode Exit fullscreen mode

完整源代码

步骤 2:配置 repo 的设置

  • 前往 [YourRepo -> 设置 -> Webhooks]
    图片描述

  • 然后
    图片描述

  • 然后我们进入 webhook 创建面板

  • [警告] 根据您网站的 SSL 状态(是否已激活),相应地选择“SSL 验证”选项。

  • [警告] 如果你想让 Github 包含一个“秘密”令牌来向你的服务器验证自己,以确保它是 Github 而不是威胁行为者,那么请输入一个秘密词,否则留空。 

图片描述

步骤3:准备好!

  • 在您的网络服务器上设置好您的 webhook和您的 repo 的github webhook之后,您基本上就可以开始了。

图片描述

  • 首先,开发人员会将他们的提交(代码更改)推送到 GitHub。
  • 其次, GitHub 将向我们的服务器发送一个 POST 请求,特别是向我们的 webhook 路由发送一个 JSON 格式的请求,其中包含与我们刚才完成的 github 推送相关的信息。
  • 第三,服务器当然会将所述请求视为一种了解生产分支上有必须尽快应用的更改的方式,因此将尝试git pull,然后执行测试和新构建等等。
  • 最后,服务器将使用更新的源代码重新启动。
鏂囩珷鏉ユ簮锛�https://dev.to/techlabma/github-webhook-cicd-step-by-step-guide-1j6g
PREV
你确定想成为技术主管吗?
NEXT
高测试覆盖率的问题 测试覆盖率的含义 测试成本 风险层面 利益相关者层面 务实的方式