轻量级日志监控与告警系统(二,下):CI/CD 具体部署实战,一行推送实现秒级更新

轻量级日志监控与告警系统(二,下):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 秒,无需任何人工干预!

五、为什么这个方案好?

对比项 传统方式 本次方案
部署步骤 scpsystemctl 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 能力。这再次证明:

优秀的工程实践,不在于工具多炫酷,而在于是否真正解决问题。


附录

相关推荐
要站在顶端10 小时前
基于 curl 实现 Jenkins 上传制品到 JFrog Artifactory
运维·ci/cd·jenkins
4***99741 天前
DevOps在云原生中的CI/CD流水线
ci/cd·云原生·devops
西部森林牧歌2 天前
Arbess从基础到高阶(14) - 使用Arbess+GitLab+SonarQube实现代码扫描完成后自动化部署
ci/cd·gitlab·sonarqube·arbess·tiklab devops
青靴2 天前
虚拟机上实现最简 CI/CD
ci/cd·devops
青靴2 天前
轻量级 CI/CD:Git Hooks 自动部署 Node.js 应用(CICD-demo)
git·ci/cd·node.js
青靴3 天前
轻量级 CI/CD 实战(四):本地开发钉钉告警 → 自动部署云服务器 Kafka 消费者容器
ci/cd·docker·钉钉
奔跑吧邓邓子3 天前
Jenkins自动化持续集成:从入门到实战
ci/cd·自动化·实战·jenkins·自动化持续集成
青靴3 天前
Git Hooks 实现 CI/CD 进阶实践 -- 根据实际需求添加功能
git·elasticsearch·ci/cd
DreamLife☼3 天前
Docker-CI/CD:集成 GitHub Actions 实现自动化构建与部署
ci/cd·docker·自动化部署·github actions·镜像构建·trivy 扫描·compose 部署