轻量级日志监控与告警系统(二,下):CI/CD 具体部署实战,一行推送实现秒级更新
前言 :在上一篇《轻量级日志监控与告警系统》中,我们完成了 Kafka + Python 消费者 + MySQL + 邮件告警的最小闭环,并成功上线阿里云生产环境。但每次优化逻辑仍需手动
scp脚本、systemctl restart,效率低且易出错。本文作为实操篇 ,将完整记录如何为已有服务零侵入式接入 CI/CD 能力 ------无需改代码、不依赖 Jenkins,仅用 Git Hooks + Shell,实现
git push即自动部署,让系统真正具备"可迭代"能力。
一、部署目标与原则
目标
- 修改
consumer.py后,执行git push,新代码自动生效 - 服务平滑重启,不丢 Kafka 消息
- 全程无需登录服务器
原则
- 零代码改动:仅通过部署层实现,业务逻辑不变
- 轻量可靠:仅依赖 Git + systemd,无额外组件
- 可回滚:Git 天然支持版本回退
二、环境信息(与上一篇完全一致)
| 组件 | 配置 |
|---|---|
| 服务器 | 阿里云 CentOS 7(kafka1, IP: 47.111.191.93) |
| 项目路径 | /opt/log_consumer/ |
| 主程序 | consumer.py(Kafka 消费者) |
| systemd 服务 | consumer.service |
| 用户权限 | root |
💡 提示:如果你的环境与上一篇一致,可直接复用以下步骤。
三、CI/CD 部署全流程
Step 1:备份当前代码(安全第一!)
bash
# 在 kafka1 执行
sudo cp -r /opt/log_consumer /opt/log_consumer.bak_$(date +%Y%m%d)
echo " 已备份至 /opt/log_consumer.bak_*"
Step 2:安装 Git(如未安装)
bash
sudo yum install -y git
Step 3:创建裸仓库(接收推送)
bash
sudo mkdir -p /var/repo/log-consumer.git
cd /var/repo/log-consumer.git
sudo git init --bare
Step 4:编写 post-receive 钩子(核心!)
bash
sudo tee /var/repo/log-consumer.git/hooks/post-receive <<'EOF'
#!/bin/bash
set -e
DEPLOY_PATH="/opt/log_consumer"
LOG_FILE="/var/log/log-consumer-deploy.log"
SERVICE_NAME="consumer"
# 强制检出最新代码
GIT_WORK_TREE="$DEPLOY_PATH" git --git-dir=/var/repo/log-consumer.git checkout -f
# 重启服务(systemd 自动处理启停)
systemctl restart "$SERVICE_NAME"
# 记录日志
echo "$(date '+%Y-%m-%d %H:%M:%S'): Deployed to $DEPLOY_PATH, restarted $SERVICE_NAME" >> "$LOG_FILE"
EOF
# 赋权
sudo chmod +x /var/repo/log-consumer.git/hooks/post-receive
sudo chown -R root:root /var/repo/log-consumer.git
sudo touch /var/log/log-consumer-deploy.log
sudo chmod 666 /var/log/log-consumer-deploy.log
关键说明:checkout -f 会覆盖工作目录所有文件,确保一致性
systemctl restart 触发 systemd 的 stop → start 流程,旧进程优雅退出
Kafka 消费者已开启 enable_auto_commit=True,重启后从最新 offset 继续消费,消息不丢失
Step 5:本地配置 Git 远程仓库
bash
在你自己的开发机操作
# 1. 同步当前代码(确保与服务器一致)
scp root@47.111.191.93:/opt/log_consumer/* .
# 2. 初始化本地仓库
git init
git add .
git commit -m "feat: sync with kafka1 before CI/CD"
# 3. 配置免密登录(若未配置)
ssh-keygen -t rsa # 一路回车
ssh-copy-id root@47.111.191.93
# 4. 添加远程仓库
git remote add origin root@47.111.191.93:/var/repo/log-consumer.git
git push -u origin master
四、测试验证:真的生效了吗?
本地修改(仅加注释,零风险)
python
# 在 consumer.py 顶部添加:
# CI/CD TEST v2 - auto deployed at $(date)
如图,仅加入最上面一行作为验证即可

推送:
bash
git add .
git commit -m "test: ci/cd deployment"
git push
登录 kafka1 验证
bash
# 1. 查看代码是否更新
head -n 5 /opt/log_consumer/consumer.py
# 2. 查看服务重启时间
systemctl status consumer --no-pager
# 3. 查看部署日志
cat /var/log/log-consumer-deploy.log
输出示例:
bash
2025-11-23 22:45:10: Deployed to /opt/log_consumer, restarted consumer'
效果:从修改到生效,全程 < 5 秒,无需任何人工干预!

五、为什么这个方案好?
| 对比项 | 传统方式 | 本次方案 |
|---|---|---|
| 部署步骤 | scp → systemctl restart |
git push |
| 出错概率 | 高(漏传文件、忘重启) | 极低(原子更新 + 自动重启) |
| 可追溯性 | 无 | Git 提交记录即变更日志 |
| 学习成本 | 无 | 极低(仅需基础 Git 知识) |
正如上一篇强调"轻量",本次 CI/CD 依然坚持:用系统原生能力解决问题,不做过度设计。
六、后续演进预告
本次 CI/CD 是迈向企业级可观测平台的关键一步,未来将逐步引入:
- v3:集成 Celery,异步处理 IP 定位与邮件发送
- v4:暴露指标给 Prometheus,Grafana 可视化 QPS/延迟
- v5:ELK 实现日志全文检索
- v6:Docker 容器化,一键部署多环境
- v7:AI 自然语言查询日志(如:"昨天有哪些 500 错误?")
而这一切,都将通过同一个 git push 自动交付。
七、总结
- 上一篇(v1) :解决了 "能不能监控"
- 本篇(v2) :解决了 "好不好迭代"
通过不到 20 行 Shell 脚本,我们让一个生产级日志系统具备了现代 DevOps 能力。这再次证明:
优秀的工程实践,不在于工具多炫酷,而在于是否真正解决问题。
附录
-
上一篇链接 :轻量级日志监控与告警系统(上)
-
常用命令 :
bash# 查看消费者运行日志 journalctl -u consumer -f # 查看部署记录 tail -f /var/log/log-consumer-deploy.log