软件开发完成后,必须部署在最终用户的正式运行环境,交付给最终用户使用,才能为用户创造价值。
传统的软件工程不包括软件部署与交付,但不断增长的软件复杂度和部署所面临的风险,迫使人们开始关注软件部署。
软件部署是一个复杂过程,包括从开发商发放产品,到应用者在他们的计算机上实际安装并维护应用的所有活动。
这些活动包括软件打包、安装、配置、测试、集成和更新等。同时,需求和市场的不断变化导致软件的部署和交付不再是一个一劳永逸的过程,而是一个持续不断的过程,伴随在整个软件的开发过程中。
1.软件的部署与交付
软件部署与交付是软件生命周期中的一个重要环节,属于软件开发的后期活动,即通过配置、安装和激活等活动来保障软件制品的后续运行。部署技术影响着整个软件过程的运行效率和成本投入,软件系统部署的管理代价占到整个软件管理开销的大部分。
其中软件配置过程极大地影响着软件部署结果的正确性,应用系统的配置是整个部署过程中的主要错误来源。据StandishGroup的统计,软件的缺陷所造成的损失,相当大的部分是由于部署与交付失败所引起的,可见软件部署与交付工作的重要意义。
目前,部署与交付常存在:分支冗余导致合并困难;缺陷过多导致阻塞测试;
开发环境、测试环境、部署环境不统一导致的未知错误;
代码提交版本混乱无法回溯;
等待上线周期过长;
项目部署操作复杂经常失败;
上线之后出现问题需要紧急回滚;
架构设计不合理导致发生错误之后无法准确定位等困境。
2.持续交付
持续交付具备的优势主要包括:
●持续交付能够有效缩短提交代码到正式部署上线的时间,降低部署风险;
●持续交付能够自动、快速地提供反馈,及时发现和修复缺陷;
●持续交付让软件在整个生命周期内都处于可部署的状态;
●持续交付能够简化部署步骤,使软件版本更加清晰;
●持续交付能够让交付过程成为一种可靠的、可预期的、可视化的过程。 在评价互联网公司的软件交付能力的时候,通常会使用两个指标:
●仅涉及一行代码的改动需要花费多少时间才能部署上线,这也是核心指标;
●开发团队是否在以一种可重复、可靠的方式执行软件交付。
目前,国内外的主流互联网组织的部署周期都以分钟为单位,互联网巨头组织单日的部署频率都在8000次以上,部分组织达20000次以上。高频率的部署代表着能够更快更好地响应客户需求。
3.持续的部署
对于持续交付整体来说,持续部署非常重要。
1)持续部署方案
容器技术目前是部署中最流行的技术,常用的持续部署方案有Kubernetes+Docker和Matrix系统两种。容器技术一经推出就被广泛地接受和应用,主要原因是对比传统的虚拟机技术优点主要有:
●容器技术上手简单,轻量级架构,体积很小;
●容器技术的集合性更好,能更容易对环境和软件进行打包复制和发布;
●容器技术的引入为软件的部署带来了前所未有的改进,不但解决了复制和部署麻烦的问题,还能更精准地将环境中的各种依赖进行完整的打包。
2)部署原则 在持续部署管理的时候,需要遵循一定的原则,主要包括:
●部署包全部来自统一的存储库;
●所有的环境使用相同的部署方式;
●所有的环境使用相同的部署脚本;
●部署流程编排阶梯式晋级,即在部署过程中需要设置多个检查点,一旦发生问题可以有序地进行回滚操作;
●整体部署由运维人员执行;
●仅通过流水线改变生产环境,防止配置漂移;
●不可变服务器;
●部署方式采用蓝绿部署或金丝雀部署。
3)部署层次
部署层次的设置对于部署管理来说也是非常重要的。首先要明确部署的目的并不是部署一个可工作的软件,而是部署一套可正常运行的环境。完整的镜像部署包括三个环节:Build一Ship—Run。
●Build:跟传统的编译类似,将软件编译形成RPM包或者Jar包;
●Ship:则是将所需的第三方依赖和第三方插件安装到环境中;
●Run:就是在不同的地方启动整套环境。
制作完成部署包之后,每次需要变更软件或者第三方依赖以及插件升级的时候,不需要重新打包,直接更新部署包即可。
4)不可变服务器
不可变服务器是一种部署模式,是指除了更新和安装补丁程序以外,不对服务器进行任何更改。不可变服务器是技术逐步演化的结果。
在早期阶段,软件的部署是在物理机上进行的,每一台服务器的网络、存储、软件环境都是不同的,物理机的不稳定让环境重构变得异常困难。
后来逐渐发展为虚拟机部署,在虚拟机上借助流程化的部署能较好地构建软件环境,但是第三方依赖库的重构不稳定为整体部署带来了困难。现阶段使用容器部署不但继承和优化了虚拟机部署的优点,而且很好地解决了第三方依赖库的重构问题,容器部署就像一个集装箱,直接把所有需要的内容全部打包并进行复制和部署。
5)蓝绿部署和金丝雀部署
在部署原则中提到两大部署方式为蓝绿部署和金丝雀部署。
蓝绿部署是指在部署的时候准备新旧两个部署版本,通过域名解析切换的方式将用户使用环境切换到新版本中,当出现问题的时候,可以快速地将用户环境切回旧版本,并对新版本进行修复和调整。
金丝雀部署是指当有新版本发布的时候,先让少量用户使用新版本,并且观察新版本是否存在问题。如果出现问题,就及时处理并重新发布;如果一切正常,就稳步地将新版本适配给所有的用户。
4.部署交付的新趋势
持续集成、持续交付和持续部署的出现及流行反映了新的软件开发模式与发展趋势,主要表现为:
●工作职责和人员分工的转变: 软件开发人员运用自动化开发工具进行持续集成,进一步将交付和部署扩展,而原来的手工运维工作也逐渐被分派到了开发人员的手里。运维人员的工作也从重复枯燥的手工作业转化为开发自动化的部署脚本,并逐步并入开发人员的行列之中。
●大数据和云计算基础设施的普及进一步给部署带来新的飞跃: 云计算的出现使得计算机本身也可以进行自动化创建和回收,这种环境管理的范畴将得到进一步扩充。部署和运维工作也会脱离具体的机器和机房,可以在远端进行,部署能力和灵活性出现了质的飞跃。
●研发运维的融合: 减轻运维的压力,把运维和研发融合在一起。