GitHub Webhook CI/CD:分步指南
(本博客文章是我和Mustapha El Idrissi合作作品的一部分,有关更多信息,请参阅他的 devTo 页面:https://dev.to/appsbymuss)
什么是 CI/CD
CI/CD,即持续集成和持续交付/部署,是一套自动化软件开发、测试和发布流程的实践和工具。它可以帮助开发人员更频繁、更安全、更可靠地交付代码更改。
-
持续集成:这是一种开发实践,开发人员经常将他们的代码更改集成到共享存储库中。
-
持续交付:进一步自动化整个发布流程。代码通过所有测试阶段后,将自动部署到生产环境。
有很多工具可用于执行CI和CD,例如但不限于:
- 詹金斯
- 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...");
});
(完整源代码)
步骤 2:配置 repo 的设置
-
然后我们进入 webhook 创建面板
-
[警告] 根据您网站的 SSL 状态(是否已激活),相应地选择“SSL 验证”选项。
-
[警告] 如果你想让 Github 包含一个“秘密”令牌来向你的服务器验证自己,以确保它是 Github 而不是威胁行为者,那么请输入一个秘密词,否则留空。
步骤3:准备好!
- 在您的网络服务器上设置好您的 webhook和您的 repo 的github webhook之后,您基本上就可以开始了。
宏
- 首先,开发人员会将他们的提交(代码更改)推送到 GitHub。
- 其次, GitHub 将向我们的服务器发送一个 POST 请求,特别是向我们的 webhook 路由发送一个 JSON 格式的请求,其中包含与我们刚才完成的 github 推送相关的信息。
- 第三,服务器当然会将所述请求视为一种了解生产分支上有必须尽快应用的更改的方式,因此将尝试git pull,然后执行测试和新构建等等。
- 最后,服务器将使用更新的源代码重新启动。