(这篇博文是由 我 和 穆斯塔法·埃尔·伊德里西 合作完成的,了解更多详情请访问他的devTo页面: https://dev.to/appsbymuss)
CI/CD是什么呢
CI/CD,或 持续集成和持续交付(或部署),是一套实践和工具,用于自动化软件开发、测试和发布的流程。它帮助开发人员更频繁、更安全、更可靠地交付代码变更。
-
持续集成:这是一种开发做法,开发人员会经常将代码更改合并进入共享仓库。
- 持续交付:这更进一步将整个发布流程自动化。一旦代码通过所有测试阶段,它会被自动部署到生产环境。
有很多工具可以用来执行CI和CD等,例如:
- Jenkins (一款流行的持续集成工具)
- GitHub Actions (GitHub的自动化工作流)
- GitLab CI/CD (GitLab的持续集成和持续交付)
- Travis CI (一个持续集成服务)
然而,这样的工具通常附带资源使用限制,或者需要付费才能高效使用,而初学者刚开始软件开发时,往往难以掌握这样的工具。
- 然而,有一种更容易快速上手但更难高效配置的实现持续集成和持续部署的方法是 GitHub Webhooks (点击链接了解更多:https://www.youtube.com/watch?v=Q_VPL6KrH2o)
步骤 0:创建一个 repo(代码库)
- 当然,当我们开始一个新的项目时,我们需要为它建立一个新的代码库用于存放我们的代码变更(也就是提交),不过这次这也有助于实现我们的持续集成和持续交付的目标。
步骤一:为 POST-webhook 创建一条路由
- 假设你已经在特定端口上成功运行了所需的运行环境或框架。为了使 Github 能够在你的仓库的 main/主要分支发生新的更改时向你的服务器发送请求,你还需要设置一个 webhook。
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 在这里发送签名
if (!signature) {
console.log('请求中未找到签名');
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('签名不匹配');
return false;
}
console.log('有效签名');
return true;
}
app.use(bodyParser.json());
app.post('/cicd/github-cicd', (req, res) => {
const buf = JSON.stringify(req.body); // 请求的原始正文
// const isValid = verifySignature(req, res, buf);
/* if (!isValid) {
return res.status(401).send('无效签名');
}*/
const { ref } = req.body;
if (ref === 'refs/heads/main') {
// PM2 是我用来管理实例的工具
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('正在监听端口 80...');
});
进入全屏模式 退出
完整代码在这里:https://github.com/0xW3ston/ci_cd_basics
第二步:配置代码库的设置:
-
进入 [YourRepo -> 设置: -> Webhook]
-
那么
接着我们就来到了创建 webhook 的那个界面
-
[警告] 请根据您的网站是否已经开启了 SSL,相应地选择“SSL 校验”选项。
- [警告] 如果你想让 Github 在连接到你的服务器时使用一个“密钥令牌”来验证身份,确保是 Github 而不是恶意用户发起的连接,请填写一个密钥令牌,否则留空即可。
好了!
- 在你的 webserver 上设置好 webhook 并在你的仓库的 github webhook 中配置完成后,就可以开始了(准备就绪)。
宏指令
- 第一 开发人员会将他们的提交的代码推送到 GitHub。
- 第二 GitHub 会向我们的服务器发送一个 POST 请求,并且具体发送到我们的 webhook 路由,请求体包含刚刚推送的相关信息,格式为 JSON。
- 然后服务器会将此请求视为信号,表明生产分支上有了新的更新,需要尽快应用这些更新。因此,服务器会尝试执行 git pull,随后进行测试、构建新版本等操作。
- 最后 服务器会重新启动,加载更新后的代码。