软件程序(代码)传统部署方式及缺点
- 纯手工 scp
- 纯手工登录服务器 git pull/svn update
- 纯手工 ftp 上传
- 开发提供压缩包,rz 上传,解压
上述传统部署方式缺点:
- 全程运维参与,占用大量时间
- 上传速度慢
- 人为失误多,管理混乱
- 回滚慢,不及时
环境规划
- 开发环境:开发人员本地有自己的环境,运维需要配置公用服务给开发的测试环境,例如开发数据库、redis/memcached 等。
- 测试环境:功能测试环境和性能测试环境。
- 预生产环境:生产环境集群中的某一个节点担任。
- 生产环境:直接对用户提供服务的环境。
测试环境和生产环境数据库是不一样的。
预生产环境产生的原因:
- 数据库不一致:测试环境和生产环境数据库是不一样的。
- 生产环境的联调接口并没有测试和生产环境之分,如第三方的支付接口。
如何设计一套生产自动化部署系统
前提:
已经有一个可以上线的代码在代码仓库
- 规划
- 实现
- 总结和扩展(PDCA)
- 在生产环境中应用
最重要的是第四步。
环境
一个集群中有 10 个节点
目标
- 实现一键部署程序到这 10 个节点
- 一键回滚到任意版本
- 一键回滚到上个版本
总体来说分为两块:部署和回滚。
部署
- 代码在哪里?(git/svn)
- 获取什么版本的代码?(直接拉取某个 Git 分支,指定 tag,指定 SVN 版本号)
- 差异解决(1、各个节点之间的差异 2、代码仓库和实际的差异(配置文件是否放在代码仓库中?配置文件只在部署机上有,单独的项目单独的配置))
- 如何更新(是否需要重启服务?如 Tomcat 需要重启)
- 测试(部署完成后,测试是否正常)
- 串行和并行(根据需求:一个一个或同时部署、分组部署)
- 如何执行(1、Shell 命令行 2、Web 界面)
部署流程
- 获取代码(直接拉取)
- 编译(可选)
- 放置配置文件(节点配置文件可能不一样)
- 打包(加快传输速度)
- SCP 到目标服务器(可配置 SSH 免密钥)
- 将目标服务器移除集群(不同集群方法不一样)
- 解压
- 放置到 Webroot
- SCP 差异文件(打包的是基础包,然后再加上差异文件)
- 重启(可选)
- 测试
- 加入集群
回滚流程
回滚可以分成三种级别:
- 正常回滚
- 紧急回滚
- 非常紧急回滚
1 正常回滚
- 列出回滚版本
- 目标服务器移除集群
- 执行回滚
- 重启和测试
- 加入集群
2 紧急回滚
- 列出回滚版本
- 执行回滚
- 重启和测试
3 非常紧急回滚
- 直接回滚到上个版本(需要在某处记录上一个版本)
- 重启和测试