说实话,刚接触敏捷开发那会儿,我对 CI/CD(持续集成/持续交付)理解还停留在“每次开发提代码都要跑自动构建,然后神秘地上生产”这种模糊的印象。直到我亲手在一个敏捷项目中从0搭建完整的 CI/CD 流水线,才真切体会到这玩意儿到底有多香。
今天就和大家聊聊我在这个过程中踩过的坑、总结的经验和一些能落地的实践。讲真,如果你还在“测试环境手动部署”、“上线靠运维打包发包”、“回滚靠人肉备份”的原始阶段,那这篇文章可能对你帮助不小。
很多人搞不清楚 CI/CD 到底是啥,搞个定义先:
这跟敏捷开发强调的“小步快跑、快速迭代、频繁交付”简直是绝配。没有 CI/CD 的敏捷开发,和脱了链的自行车一样,说跑得快,其实满地是坑。
我在的这个项目是个典型的 Spring Boot 后端 + Vue 前端 + MySQL + Redis 的电商系统。团队小但需求多,版本迭代快,一周两个 Sprint,产品经理需求像下饺子一样掉下来。
于是我搭了一套基于 GitLab + Jenkins + Docker + Kubernetes 的 CI/CD 流水线,结构如下:
开发 push -> GitLab webhook -> Jenkins 构建 + 测试 -> Docker 镜像构建推送 -> Kubernetes 滚动部署 -> Slack/DingTalk 通知
下面我分步骤说说咋落地的。
先贴一个我在 Jenkinsfile 中设置的核心 CI 流程:
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git branch: 'develop', url: 'https://git.example.com/myapp.git'
}
}
stage('Build') {
steps {
sh './mvnw clean package -DskipTests'
}
}
stage('Test') {
steps {
sh './mvnw test'
}
}
}
}
说人话就是:
踩坑提醒:一定要把 mvn test
单独拆出 stage,否则构建失败原因不明确,调试难上加难。
CD 的核心目标就是:一行代码不写,一台服务器不登,就能部署上线。
我把 Jenkins 和 Kubernetes 联动起来,实现了一套“镜像构建 + 滚动发布”逻辑:
stage('Docker Build & Push') {
steps {
sh '''
docker build -t myapp:${BUILD_NUMBER} .
docker tag myapp:${BUILD_NUMBER} registry.example.com/myapp:${BUILD_NUMBER}
docker push registry.example.com/myapp:${BUILD_NUMBER}
'''
}
}
stage('K8s Deploy') {
steps {
sh '''
kubectl set image deployment/myapp myapp=registry.example.com/myapp:${BUILD_NUMBER} --record
'''
}
}
部署完之后,我还搞了个“回滚机制”:
kubectl rollout undo deployment/myapp
有问题一键回滚,开发不怕试错,老板不怕翻车。
讲实话,CI/CD 不是搭个 Jenkins 装个插件就完事,以下这些坑,能让你少走点弯路:
我们最后采用了标准的 Git Flow 模式:
master
: 生产develop
: 日常开发feature/*
: 功能开发release/*
: 预发布hotfix/*
: 紧急修复结合 GitLab 的权限控制 + merge request + Jenkins 多分支流水线,避免了“刚上线就炸”的事故。
我后来将 CI/CD 流程抽象为以下 5 个阶段,每个阶段独立失败不会影响全局追踪:
阶段 | 内容 | 说明 |
---|---|---|
Checkout | 拉代码 | 检查提交记录 |
Build | 编译打包 | 失败最多的地方 |
Test | 单元测试 | 保质量 |
Docker | 镜像构建 | 产出交付物 |
Deploy | Kubernetes发布 | 真正上线 |
上线不是 CI/CD 的结束,而是另一个监控流程的开始。我配置了 Prometheus + Grafana + Loki,实现以下告警:
真正做到:问题一出现,10秒内手机震动。
CI/CD 看似是一堆工具和流水线的组合,实则是一种团队文化。
它告诉我们:
代码不是写完就完了,只有部署了、运行了、被监控了,才算交付了价值。
如果你还在用 FTP + 手动部署的方式上线,那真的该思考下团队的交付效率了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。