首页技术专题博客目录我的收藏关于与联系

部署的噩梦:从手动部署到自动化的痛苦历程

项目初期,部署都是手动的。每次部署要花 1 个小时,还经常出错。后来决定做自动化部署,但配置 CI/CD 又花了 3 个月。这篇文章记录一下部署的进化过程。

手动部署的时代

项目刚开始,部署都是手动的。流程是这样的:

  1. 本地构建:npm run build
  2. 压缩文件:打包成 zip
  3. 上传服务器:用 FTP 上传
  4. 解压文件:SSH 登录,解压文件
  5. 重启服务:重启 Nginx 或 Node.js
  6. 检查日志:看有没有错误

整个过程要 1 个小时,而且经常出错。上传错了文件、解压错了目录、重启错了服务,各种问题都有。

第一次尝试:Shell 脚本

手动部署太麻烦,我们写了 Shell 脚本自动化。脚本做了这些事:

  • 构建项目
  • 压缩文件
  • 上传服务器
  • 解压文件
  • 重启服务

用脚本后,部署时间从 1 小时降到 10 分钟。但问题还是很多:

  • 脚本经常出错,要手动修复
  • 不同环境要改脚本,很麻烦
  • 没有回滚机制,出问题很麻烦

第二次尝试:GitLab CI

用 Shell 脚本还是不够,我们决定用 GitLab CI。配置 CI/CD,自动构建和部署。

但配置 CI/CD 很麻烦,花了 3 个月才搞定:

  • 配置 Runner,花了一周
  • 写构建脚本,花了两周
  • 配置部署脚本,花了两周
  • 测试和调试,花了一个月

遇到的问题

问题一:环境变量

CI/CD 要用环境变量,但不同环境变量不同。测试环境、预发布环境、生产环境,变量都不一样。

我们在 GitLab 里配置了变量组,按环境分组。但变量多了,管理起来很麻烦。

问题二:构建缓存

每次构建都要安装依赖,很慢。我们用了缓存,但缓存经常失效。

后来用了 pnpm,缓存更稳定,构建时间从 10 分钟降到 3 分钟。

问题三:部署回滚

部署出问题,要回滚。但回滚很麻烦,要手动操作。

我们做了自动回滚:部署后自动测试,失败就回滚。但自动回滚也有问题,有时候误判。

现在的流程

现在的部署流程:

  1. 代码 push 到 GitLab
  2. 自动触发 CI,构建项目
  3. 构建成功后,自动部署到测试环境
  4. 测试通过后,手动触发生产部署
  5. 部署后自动测试,失败就回滚

整个过程自动化,部署时间从 1 小时降到 5 分钟。

如果重新开始

如果重新做一个项目,我会:

  • 一开始就配置 CI/CD,不要后面改
  • 做好环境变量管理,不要分散
  • 做好构建缓存,提升构建速度
  • 做好部署回滚,降低风险

总结

部署自动化很重要,但要早规划。如果等出问题再改,成本很高。

如果你们项目也在做自动化部署,建议先做好规划,再执行。规划要全面,执行要严格,不然很容易出问题。

另外,部署自动化是持续优化的过程。一开始可能不完美,但慢慢优化,总能做好。