随着云计算技术的发展,云环境被认为是向客户提供行业解决方案的最有前途的方式。 为了确保持续交付软件,开发,测试和运营团队必须协作并有效地协同工作。 云环境适合这种类型的交互。 但是,由于部署阶段涉及复杂的分布式拓扑,因此容易出错,通常需要手动进行故障排除。 在许多情况下,部署设计支持单个部署,而不是连续部署。 应用连续交付原理的产品部署阶段通常会遇到瓶颈,并对DevOps流程的效率产生负面影响。
使用真实的客户场景,探索挑战以及如何解决挑战以确保持续部署。
致力于行业部署自动化的软件工程师会发现本文对帮助实现在云上的持续交付很有用。 这些说明假定您具有部署行业解决方案和开发脚本的技能。
持续交付过程
连续交付的目标是确保可以使用最有效,最安全的方法来开发,测试,部署和交付软件。 从基础结构级别,应用程序级别或定制数据级别对软件系统的任何部分进行的更改,都会通过特定的交付管道连续应用于生产环境。 这种方法在用户之间建立了信心,使生产环境可以访问最新的可发布代码。
通用模型和框架
图1中所示的通用模型已广泛应用于大多数IBM行业解决方案的交付中。
图1.常见的连续交付模型
图1展示了连接解决方案开发和生产环境的端到端自动化通道。 它使用Jenkins
作为自动化引擎,可以:
- 检测代码更改并触发连续构建。
- 将内部版本安装到“
Blue
区域。Blue
区域被视为DevOps团队在本地进行验证的过渡环境。 - 在
Blue
区域上启动自动化测试并验证测试结果。 -
Blue
区域准备就绪并经过验证后,将登台环境切换到实时生产环境(Red
区域)。
持续交付的复杂因素
步骤2是本文的重点。 在连续交付过程中,最具挑战性的方面是如何有效地实施连续部署。 部署阶段必须适应复杂的分布式拓扑,不断变化的基础架构以及配置更改。 这些复杂的因素使丢失客户数据变得容易。 传统的解决方案部署设计支持单个部署,而不是连续部署。
为了减少错误,提高流程效率,节省DevOps的时间和精力,最大程度地实现解决方案部署和故障排除的自动化。 第一步是了解实际解决方案部署方案中遇到的挑战。
示例行业解决方案部署案例
考虑每月在云平台上交付行业解决方案的场景。 由于DevOps团队必须在生产环境上部署每个月度构建,因此安装程序需要能够在部署过程开始时在生产环境上运行。
持续交付过程中的常见问题
以下示例从安装角度说明了常见问题:
- 文件替换
- 资源更新
- 数据库配置
文件替换
通常,配置文件需要更新或替换。 在清单1中,安装程序在安装时替换了第3行中的占位符。 第4行中的URL根据运行时的用户输入进行设置。
一项新要求要求安装程序在安装时在以后的迭代中添加新的URL someURL
。 传统的解决方案是将< someURL >@ url @< someURL >
附加到第4行,并完全替换占位符,但是这种方法会导致错误并丢失用户对customizationURL
输入。
清单1.带有示例占位符的脚本,用于主机和URL
1 <servers>
2 <server id="appServer">
3 <host>@host@</host>
4 <customizationURL>@cusUrl@</customizationURL>
5 </servers>
资源更新
假设您有一个使用Java命名和目录接口(JNDI)创建的应用程序服务器调度程序,名称为test/schedulerA
。 相关表以前缀testA_
创建。 一段时间后,您需要将此调度程序的表前缀重命名为testB_
。 通常,您可以调用WebSphere Application Server API AdminControl来更新调度程序对新表的引用。 但是,对于连续交付,已经创建了旧表,即使这些旧表无用,也不会删除它们。 当另一个调度程序在将来使用testA_
前缀时,将导致错误。
数据库配置
数据库配置更改造成了最具挑战性的问题类型。 随着解决方案的更新,数据库将经历表结构,用户权限,存储的数据和其他更改的更改。 容纳更改的一个选项是SAMPLE.TEST_TAB
表,然后在其中插入新的COL_C
列。 但是,在下一次迭代中,表结构将发生变化。 例如,需要删除COL_B
列。 传统部署通过向清单2中所示的数据库脚本添加第6行来适应更改。
清单2.带有用于在数据库表中删除一列的新行的脚本
1 CREATE TABLE SAMPLE.TEST_TAB (
2 "COL_A" INTEGER NOT NULL ,
3 "COL_B" VARCHAR(100) )
4 IN "USERSPACE1" ;
5 ALTER TABLE SAMPLE.TEST_TAB
6 DROP COLUMN COL_B
7 ADD COLUMN COL_C INTEGER;
但是,在连续交付中,添加一行会导致错误,原因是: