构建和部署的脚本化
自动化部署:部署应用运行需要的环境.包括了配置应用程序,初始化数据,配置基础设施,操作系统,中间件,安装所需的模拟外部系统等.
脚本:指辅助构建,测试,部署和发布应用程序的指令集.持续交付中自动化脚本应该贯穿应用的整个生命周期.
构建工具:用于自动化构建的辅助工具.功能包括:初始化,设置测试数据,编译源代码,编译测试,运行测试.
分类:任务导向,产品导向.
任务导向:根据一系列任务描述依赖网络.每个任务知道自己是否已经执行,且不会记录执行状态.
产品导向:根据生成的产物描述依赖网络.每一步会生成对应的文件,文件中记录执行状态和时间戳.
构建工具概述:
- make.产品导向构建工具.能在单次构建中追踪依赖关系,还只构建受本次修改影响的组件.缺点:复杂应用和依赖难以调试;特殊字符敏感;依赖脚本环境;
- ant.任务导向.Java语言的跨平台,灵活.缺点:xml语法不简洁,不易读;领域模型理解不到位;声明式语言,不易理解;测量指标难以使用;
- Nant,MSBuild..net版的ant.问题跟上面类似.
- maven.任务导向.约定胜于配置来简化配置,进行命令式构建;自动依赖管理;问题:必须要遵守约定,灵活性较差;xml写dsl;配置依赖更新第一次耗时,且不易回退;
- Rake.产品导向.ruby语言.调试方便;通用语言;缺点:只能理解任务和依赖;依赖ruby运行环境;需要组合使用rubygems.
- buildr,gradle,gantt.任务导向,内部dsl构建.约定优于配置;定制任务和创建新任务很容易;
- psake.window的内部dsl构建工具.
解决什么问题
规范构建和部署流程;
介绍一些构建工具和技巧;
怎么做
构建部署脚本化的原则
- 为部署流水线每个阶段创建脚本.保持脚本的良好结构.
- 使用恰当的技术部署应用程序.
- 使用同样的脚本向所有环境部署.
- 使用操作系统自带的包管理工具.集中统一管理
- 确保部署流程是幂等的.需要结合良好的配置管理达到部署状态已知的状态.最好是修改时全流程部署,但是针对分布式服务,组件的情形,已经进行了版本测试的化,单独部署效果会更好.
- 部署系统的增量式演进.找到自动化脚本部署切入点,不断增加自动化比例,逐渐实现部署流程的自动化.
部署脚本化
环境管理的核心原则之一是:对测试和生产环境的修改只能由自动化过程执行.实际部署方式有三种:
- 写个远程登录脚本,执行对应的指令集;
- 写个本地执行脚本,通过代理来触发该脚本;
- 通过一些基础设施管理或部署工具来执行部署.需要通过操作系统自身包管理工具打包,进行环境初始化操作.
实践技巧
- 总是使用相对路径.便于不同环境的部署
- 消除手工步骤.避免手工文档的维护失真
- 从二进制包到版本控制库的内建可追溯性.二进制包中存放版本库构建版本标识
- 不要把二进制包作为构建的一部分放到版本控制库中.简化版本控制库,二进制包可重复构建
- 测试不应让构建失败.一次性构建整个阶段后再反馈测试中问题,避免异常退出操作,最大化单次构建价值.
- 用集成冒烟测试来限制应用程序.
- 删除代码中的无用文件.