通过一次真实的手动部署事故,展示CI/CD如何解决"人为失误+流程混乱"导致的线上问题。读者记住的不是CI/CD的定义,而是"原来部署可以不用人肉操作"这个画面。独特细节:事故现场的错误配置、流水线搭建的完整过程、部署失败自动回滚的机制。
"文章详情面白屏!"
早上打开我的网站,正想查看一篇文章,详情页白屏。
我登录服务器,检查nginx日志,发现错误是"配置文件语法错误"。我昨晚改过nginx配置,手动上传的。大概是在vim里多敲了一个空格,或者括号没闭合。
修复、重启nginx、验证。十五分钟后,页面恢复了。
修复之后,我开始认真思考一个问题:为什么我每次部署都要靠"人肉"?为什么每次都要我手动ssh到服务器、手动拉代码、手动重启服务、手动验证?为什么每次都有概率因为一个拼写错误搞挂线上?
答案很简单:我没有CI/CD。
什么是CI/CD?
CI(Continuous Integration,持续集成):你每次提交代码,自动跑一遍测试,确保你的改动没把别人搞挂。
CD(Continuous Deployment,持续部署):测试通过后,自动把代码部署到线上,不需要你手动操作。
"像发朋友圈一样简单"——你写完内容,点发布,系统自动处理剩下的事情。不需要你手动上传图片、设置可见范围、选择发布时机。
CI/CD就是代码的"朋友圈发布系统"。
我是怎么搭建的
我的技术栈:前端Vue,后端Node.js,部署在阿里云ECS上。
第一步:选工具。
我试过Jenkins、GitLab CI、GitHub Actions。最终选了GitHub Actions,原因很简单:我的代码就在GitHub上,不需要额外配置认证,开箱即用。
第二步:写配置文件。
在项目的根目录创建.github/workflows/deploy.yml:
yamlname: Deploy to Production
on:
push:
branches: [main] # 推送到main分支时触发
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Install dependencies
run: npm ci # 用ci而不是install,确保依赖版本一致
- name: Run tests
run: npm test # 测试不通过,流水线直接失败
- name: Build
run: npm run build
- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
password: ${{ secrets.SERVER_PASSWORD }}
script: |
cd /var/www/myapp
git pull origin main
npm ci --production
pm2 restart all # 用pm2管理进程,自动重启第三步:配置密钥。
在GitHub仓库的Settings → Secrets中添加服务器信息。这些密钥不会暴露在代码里,只有流水线能用到。
第四步:测试。
我故意在代码里写了一个语法错误,提交到main分支。流水线自动触发,测试失败,部署中断。完美。
然后我修复错误,再次提交。这次测试通过,代码自动部署到服务器。我打开浏览器,页面正常加载。
整个过程:2分17秒。
自从上了CI/CD,发生了几个变化:
部署时间从30分钟变成2分钟。
以前我要ssh到服务器、拉代码、重启服务、验证,现在只需要push代码。
人为失误几乎清零。上次手动部署搞挂线上,是因为我vim配错了一个空格。现在配置错误在测试阶段就会被拦截,根本到不了线上。
回滚变得简单。
如果部署后发现bug,只需要在GitHub上revert提交,流水线会自动回滚到上一个版本。以前回滚要手动操作,经常搞错版本。
心态变了。
以前部署前会紧张,生怕哪个步骤出错。现在部署变成了一件"无感"的事情——你提交代码,系统自动处理,你该干嘛干嘛。
写作后记
我写这篇文章,不是想推荐某个工具,而是想分享一个理念:把重复的、容易出错的工作交给机器,让人去做更有价值的事情。
如果你还在手动部署,我建议你从今天开始,写第一行流水线配置。不用完美,先跑起来。
评论 (0)
请先登录后再发表评论
暂无评论,快来发表第一条评论吧